Функция NLS — количество итераций превышает максимальное

У меня есть набор данных, который выглядит так:

dput(testing1)

structure(list(x = c(0, 426.263081392053, 852.526162784105, 
1278.78924417616, 
1705.05232556821, 2131.31540696026, 2557.57848835232, 2983.84156974437, 
3410.10465113642, 3836.36773252847, 4262.63081392053, 4688.89389531258, 
5115.15697670463, 5541.42005809668, 5967.68313948874, 6393.94622088079, 
6820.20930227284, 7246.4723836649, 7672.73546505695, 8098.998546449, 
8525.26162784105, 8951.52470923311, 9377.78779062516, 9804.05087201721, 
10230.3139534093, 10656.5770348013, 11082.8401161934, 11509.1031975854, 
11935.3662789775, 12361.6293603695, 12787.8924417616, 13214.1555231536, 
13640.4186045457, 14066.6816859377, 14492.9447673298, 14919.2078487218, 
15345.4709301139, 15771.734011506, 16197.997092898, 16624.2601742901, 
17050.5232556821, 17476.7863370742, 17903.0494184662, 18329.3124998583, 
18755.5755812503, 19181.8386626424, 19608.1017440344, 20034.3648254265, 
20460.6279068185, 20886.8909882106, 21313.1540696026, 21739.4171509947, 
22165.6802323867, 22591.9433137788, 23018.2063951708, 23444.4694765629, 
23870.732557955, 24296.995639347, 24723.2587207391, 25149.5218021311, 
25575.7848835232, 26002.0479649152, 26428.3110463073, 26854.5741276993, 
27280.8372090914, 27707.1002904834, 28133.3633718755, 28559.6264532675, 
28985.8895346596, 29412.1526160516, 29838.4156974437, 30264.6787788357, 
30690.9418602278, 31117.2049416198, 31543.4680230119, 31969.7311044039, 
32395.994185796, 32822.2572671881, 33248.5203485801, 33674.7834299722, 
34101.0465113642, 38363.6773252847, 42626.3081392053, 46888.9389531258, 
51151.5697670463, 55414.2005809668, 59676.8313948874, 63939.4622088079, 
68202.0930227284, 72464.7238366489, 76727.3546505695, 80989.98546449, 
85252.6162784105, 89515.247092331, 93777.8779062516, 98040.5087201721, 
102303.139534093, 106565.770348013, 110828.401161934, 115091.031975854, 
119353.662789775, 123616.293603695, 127878.924417616, 132141.555231536, 
136404.186045457, 140666.816859377, 144929.447673298, 149192.078487218, 
153454.709301139, 157717.340115059, 161979.97092898, 166242.601742901, 
170505.232556821, 174767.863370742, 179030.494184662, 183293.124998583, 
187555.755812503, 191818.386626424, 196081.017440344, 200343.648254265, 
204606.279068185, 208868.909882106, 213131.540696026, 217394.171509947, 
221656.802323867, 225919.433137788, 230182.063951708, 234444.694765629, 
238707.32557955, 242969.95639347, 247232.587207391, 251495.218021311, 
255757.848835232, 260020.479649152, 264283.110463073, 268545.741276993, 
272808.372090914, 277071.002904834, 281333.633718755, 285596.264532675, 
289858.895346596, 294121.526160516, 298384.156974437, 302646.787788357, 
306909.418602278, 311172.049416198, 315434.680230119, 319697.311044039, 
323959.94185796, 328222.572671881, 332485.203485801, 336747.834299722, 
341010.465113642, 345273.095927563, 349535.726741483, 353798.357555404, 
358060.988369324, 362323.619183245, 366586.249997165, 370848.880811086, 
375111.511625006, 379374.142438927, 383636.773252847, 387899.404066768, 
392162.034880688, 396424.665694609, 400687.296508529, 404949.92732245, 
409212.55813637, 413475.188950291, 417737.819764212, 422000.450578132, 
426263.081392053), y = c(0, 9.28064156596666, 18.545900177512, 
27.795801332368, 37.0303704859999, 46.2496330516791, 55.4536144005578, 
64.6423398617293, 73.8158347223069, 82.9741242274896, 92.1172335806295, 
101.245187943305, 110.35801243539, 119.455732135116, 128.538372079151, 
137.605957262664, 146.658512639393, 155.696063121713, 164.718633580707, 
173.726248846234, 182.718933706996, 191.696712910606, 200.659611163661, 
209.607653131799, 218.540863439782, 227.459266671548, 236.362887370294, 
245.25175003853, 254.125879138154, 262.98529909052, 271.830034276498, 
280.660109036552, 289.475547670796, 298.276374439066, 307.06261356099, 
315.834289216049, 324.591425543646, 333.334046643171, 342.062176574072, 
350.775839355914, 359.47505896845, 368.159859351686, 376.830264405948, 
385.486297991944, 394.127983930833, 402.755346004291, 411.368407954574, 
419.967193484584, 428.551726257936, 437.12202989902, 445.67812799307, 
454.220044086226, 462.747801685598, 471.261424259333, 479.760935236681, 
488.246358008055, 496.717715925098, 505.175032300746, 513.618330409295, 
522.047633486465, 530.462964729454, 538.86434729702, 547.251804309526, 
555.625358849021, 563.985033959285, 572.33085264591, 580.662837876353, 
588.981012579999, 597.285399648232, 605.576021934488, 613.852902254326, 
622.116063385486, 630.365528067953, 638.601319004021, 646.823458858352, 
655.031970258043, 663.226875792685, 671.408198014427, 679.575959438034, 
687.730182540955, 695.870889763381, 776.539498886984, 855.880929901957, 
933.917017841173, 1010.66923850263, 1086.15871435967, 1160.40622037394, 
1233.43218971275, 1305.25671937236, 1375.89957570869, 1445.38019987715, 
1513.71771318288, 1580.93092234301, 1647.03832466233, 1712.05811312379, 
1776.00818139531, 1838.90612875416, 1900.76926493033, 1961.61461487023, 
2021.45892342205, 2080.31865994395, 2138.21002283649, 2195.14894400053, 
2251.1510932217, 2306.23188248277, 2360.40647020513, 2413.68976542041, 
2466.09643187347, 2517.64089205797, 2568.33733118544, 2618.19970108913, 
2667.24172406357, 2715.47689664105, 2762.91849330583, 2809.5795701474, 
2855.47296845351, 2900.61131824417, 2945.00704174745, 2988.67235681812, 
3031.61928030007, 3073.85963133337, 3115.40503460692, 3156.26692355763, 
3196.45654351696, 3235.9849548056, 3274.8630357774, 3313.10148581304, 
3350.71082826463, 3387.70141335169, 3424.0834210096, 3459.86686369117, 
3495.06158912208, 3529.67728301099, 3563.72347171513, 3597.20952486194, 
3630.14465792765, 3662.53793477339, 3694.39827013962, 3725.73443209948, 
3756.55504447179, 3786.86858919437, 3816.68340865829, 3846.00770800373, 
3874.84955737805, 3903.21689415673, 3931.11752512776, 3958.5591286401, 
3985.5492567168, 4012.0953371333, 4038.20467546162, 4063.88445708088, 
4089.14174915471, 4113.98350257616, 4138.41655388066, 4162.44762712739, 
4186.0833357498, 4209.33018437567, 4232.19457061714, 4254.68278683143, 
4276.80102185247, 4298.55536269409, 4319.95179622522, 4340.99621081746, 
4361.6943979656, 4382.05205388147, 4402.0747810615, 4421.76808982864, 
4441.13739984872, 4460.18804162205, 4478.92525795032, 4497.35420537947, 
4515.4799556188, 4533.3074969367)), .Names = c("x", "y"), row.names = c(NA, 
-173L), class = c("tbl_df", "tbl", "data.frame"))

Первые шесть строк набора данных:

# A tibble: 6 x 2
      x     y
  <dbl> <dbl>
1    0   0   
2  426.  9.28
3  853. 18.5 
4 1279. 27.8 
5 1705. 37.0 
6 2131. 46.2 

сюжет (тестирование1$x,тестирование1$y)

введите здесь описание изображения

Я хочу использовать нелинейную функцию наименьших квадратов. Вот что у меня есть:

a.start <- max(testing1$x)
b.start <- 1e-06
control1 <- nls.control(maxiter= 10000, minFactor= 1e-30, warnOnly= FALSE,tol=1e-05)

nl.reg <- nls(y ~ a * (1-exp(-b * x)),data=testing1,start= list(a=a.start,b=b.start),
          control= control1)

Когда я запускаю это, я получаю сообщение об ошибке:

Error in nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a = 
a.start,  : 
  number of iterations exceeded maximum of 10000

Кто-нибудь имеет опыт с этим или может предоставить воспроизводимый пример с данными, которые я предоставил, чтобы это соответствовало? Любая помощь будет здорово, спасибо!


person nak5120    schedule 08.10.2018    source источник
comment
Возможно, вы захотите пересмотреть свои начальные оценки. Подгонка модели nls может быть довольно придирчивой, когда дело доходит до начальных значений, и я не думаю, что вы сделали то, что хотели. (Почему вы используете максимальное значение xs в качестве начального значения для a? - это не единственное, что я бы изменил, но это отправная точка для вас). Вы также можете поиграть с параметрами управления. Попытка увеличить maxiter и/или уменьшить tol, чтобы, по крайней мере, получить некоторую конвергенцию, позволяющую оценить модель.   -  person Dason    schedule 08.10.2018
comment
Спасибо @Dason, я попытался увеличить maxiter и уменьшить tol, но все равно безуспешно. Я очень новичок в этом, поэтому прошу прощения, если некоторые из вопросов, которые я задаю, звучат элементарно. Что касается выбора значения для a, как бы вы выбрали это значение? Я использую максимальное значение x на основе предыдущего кода, предоставленного мне, поэтому, к сожалению, я еще не очень хорошо понимаю, как это работает.   -  person nak5120    schedule 08.10.2018


Ответы (1)


Ваши данные выглядят так, как будто они идеально подходят. Я думаю, что это может быть «слишком хорошо», поскольку алгоритм может быть не в состоянии вычислить градиент после достижения подгонки. (Обратите внимание, что сразу после раздела «Значение» есть Предупреждение об этой проблеме.) Если вы значительно уменьшите количество итераций и используете управляющий параметр warnOnly, вы обнаружите, что независимо от начальных значений a и b, что результаты одинаковы. Тот факт, что остаточная сумма квадратов фактически равна нулю, означает, что сходимость настолько хороша, насколько это возможно, и что это происходит, даже если вы ограничиваете количество итераций до 10!

control1 <- nls.control(maxiter= 10,tol=1e-02, warnOnly=TRUE)
nl.reg <- nls(y ~ a * (1-exp(-b * x)),data=testing1,start= list(a=a.start,b=b.start),
           control= control1)
#------------
Warning message:
In nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a = a.start,  :
  number of iterations exceeded maximum of 10
> nl.reg
Nonlinear regression model
  model: y ~ a * (1 - exp(-b * x))
   data: testing1
        a         b 
5.599e+03 3.892e-06 
 residual sum-of-squares: 1.262e-21

Number of iterations till stop: 10 
Achieved convergence tolerance: 0.02381
Reason stopped: number of iterations exceeded maximum of 10
person IRTFM    schedule 08.10.2018
comment
Благодарность! К сожалению, я все еще получаю ту же ошибку. Вы делали что-то другое с данными, чтобы это работало на вас? Я скопировал и вставил ваш, и он дал мне сообщение об ошибке: Warning message: In nls(y ~ a * (1 - exp(-b * x)), data = testing1, start = list(a = a.start, : number of iterations exceeded maximum of 10 - person nak5120; 08.10.2018
comment
Неважно, не понял, что это было просто предупреждение, а не ошибка. Однако один вопрос. Потому что он остановился на 10, это все еще нормально? - person nak5120; 08.10.2018
comment
Также я получаю другой ответ, чем ваш. Будет ли это иметь смысл? Это был мой ответ: a = -2.395e+04, b=-4.598e-07; residual sum of squares = 30782010 - person nak5120; 08.10.2018
comment
Нет, не будет. Вы видите гораздо большую остаточную сумму квадратов, чем я когда-либо видел, даже с максимальным 100000 итераций. - person IRTFM; 08.10.2018
comment
Я получил тот же ответ сейчас. Я брал максимум x вместо y. Спасибо за помощь @42. Ценить это. - person nak5120; 08.10.2018
comment
Ах. Я последовал совету Дейсона и выбрал более разумное начальное значение для a. - person IRTFM; 08.10.2018
comment
если вам интересно ответить на другой вопрос, подобный этому: stackoverflow.com/questions/52710549 /nls-функция-по-группе - person nak5120; 09.10.2018