R 版本 4.0.2 中的错误不在 3.6.3(和以前的版本)中。适合

Error in R version 4.0.2 not in 3.6.3 (and previous versions). nls fit

我正在尝试对多个实验(例如 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)