nls сходится, но дает ошибку

Я столкнулся со странной проблемой. Вероятно, это глупо, но я этого не вижу и был бы признателен за помощь. Рассмотрим следующий код

x<-seq(100, 1000, 100)
b<-0.3
y<-x^-b

Теперь давайте предположим, что я хочу подогнать модель и использую для иллюстрации следующий код

df <- data.frame(x = x, y = y)
nlf <- nls(y~p1*x^-p2  , data = df, start=list(p1=1,p2=1), trace = TRUE)

Я получаю быструю сходимость к правильным результатам (как вы можете проверить). Но я также получаю ошибку

5.392604e-33 :  1.0 0.3
5.392604e-33 :  1.0 0.3
5.392604e-33 :  1.0 0.3
Error in nls(y ~ p1 * x^-p2, data = df, start = list(p1 = 1, p2 = 1),  : 
  Iterationenzahl überschritt Maximum 50

Кто-нибудь может это объяснить? Заранее спасибо.


r nls
person Umberto    schedule 21.06.2017    source источник


Ответы (1)


Из документации (?nls) вы увидите предупреждение: «Не используйте nls для искусственных «нулевых остаточных» данных». Таким образом, ошибка является продуктом вашего примера, который в основном идеально подходит для ваших данных. Объяснение, почему это происходит, можно увидеть в документации. Попробуйте добавить немного шума, как показано ниже:

x<-seq(100, 1000, 100)
b<-0.3
y<-x^-b + rnorm(100, 0, 0.1)  # Remember to add noise
df <- data.frame(x = x, y = y)
nlf <- nls(y~p1*x^-p2  , data = df, start=list(p1=1,p2=1), trace = TRUE)
#3.591758 :  1 1
#3.581732 :  0.6274025 0.8963628
#3.565431 :  0.3056595 0.7399811
#3.488972 :  0.1682877 0.5522106
#3.263759 :  0.1895249 0.4433675
#2.941386 :  0.2844498 0.4125101
#2.452259 :  0.4660136 0.4015228
#1.793046 :  0.7829449 0.3985467
#1.172338 :  1.2573922 0.3981166
#0.9667725 :  1.7315307 0.3981305
#0.9667725 :  1.7315408 0.3981278
person Anders Ellern Bilgrau    schedule 21.06.2017
comment
Хорошо, следует прочитать документацию... Я именно об этом и думал, когда вы писали этот пост... Мне лучше знать ;-) Спасибо. - person Umberto; 21.06.2017
comment
@fasttouch Нет проблем - это довольно далеко в документации;) - person Anders Ellern Bilgrau; 21.06.2017