#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. Спасибо. Спасатель жизни!