Ошибка в версии R 4.0.2, а не в 3.6.3 (и предыдущих версиях). nls fit

#r #nls

#r #nls

Вопрос:

Я пытаюсь выполнить подгонку nls в нескольких экспериментах (скажем, exp1 и exp2).

При запуске кода на R 3.6 (или предыдущих версиях) он работает хорошо (например, здесь: https://www.tutorialspoint.com/execute_r_online.php пункт 3.4.1). В R 4.0.2 я получаю сообщение об ошибке:

 Error in nls(donnees$ally ~ donnees$allx * a[donnees$allexp]   b[donnees$allexp],  :  Missing value or an infinity produced when evaluating the model
  
 valx1<-c(1,2,3,4,5,6)
valx2<-c(2,7,8,9)
allx<-c(valx1,valx2)
valy1<-c(2,3,8,9,10,12)
valy2<-c(3,10,11,12)
ally<-c(valy1,valy2)
exp1<-rep('exp1',length(valx1))
exp2<-rep('exp2',length(valx2))
allexp<-c(exp1,exp2)

df<-data.frame(allx,ally,allexp)
fitexp<-nls(df$ally ~ df$allx*a[df$allexp] b[df$allexp],start=list(a=c(1,1),b=c(1,1)))
summary(fitexp)
  

Комментарии:

1. Что такое donnees ? (И обычно лучше включать все сообщение об ошибке, а не просто перефразировать его.)

2. Когда я запускаю слегка переписанную форму этого nls(ally ~ allx*a[allexp] b[allexp], data = df, start=list(a=c(1,1),b=c(1,1))) , я получаю Error: Missing value or an infinity produced when evaluating the model .

3. извините. Был неправильный код. Я получаю ту же ошибку, что и вы в 4.0.2

4. Это работает здесь: tutorialspoint.com/execute_r_online.php НЕ с 4.0.2

Ответ №1:

В R 4.0 allexp это символ, тогда как в более ранних версиях R. Преобразуйте его в множитель или числовую переменную. Мы преобразуем в коэффициент ниже. Кроме того, фрейм данных обычно записывается как отдельный аргумент, а не как часть формулы.

 df2 <- transform(df, allexp = factor(allexp))
nls(ally ~ allx * a[allexp]   b[allexp], df2, 
  start = list(a = c(1, 1),b = c(1, 1)))
  

Также обратите внимание, что nls это не требуется, поскольку модель является линейной и lm может быть использована с соответствующей формулой:

 df3 <- within(df, {
  b1 =  (allexp == "exp1")
  b2 =  (allexp == "exp2")
  a1 = allx * b1
  a2 = allx * b2
})
lm(ally ~ a1   a2   b1   b2   0, df3)
  

Комментарии:

1. Спасибо. Спасатель жизни!