R版本4.0.2中的错误,而不是3.6.3中的错误(以及以前的版本).nls适合

  • 本文关键字:版本 错误 适合 nls r nls
  • 更新时间 :
  • 英文 :


我正在尝试对多个实验(比如exp1和exp2(执行nls拟合。

当在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)

在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)

最新更新