在 lm 与 nls 函数中嵌套数据帧引用

nesting dataframe references in lm vs nls functions

假设我有一些数据,作为数据框:

GSM<- c(NA, 0.11, 0.12, 0.05, 0.06, 0.43, 0.44, 0.32, 0.29, 0.22, 0.24)
enz<- c(18.73287, 48.92596, 51.78783, 12.07112, 17.98551,NA,NA, 62.74149, 25.92524, 17.25657, 32.10908)
dat<-data.frame(GSM,enz)

然后我创建一个引用数据框和该数据框内的列的函数,returns 线性回归模型的输出:

lmfit<-function(data,x,y){
    mod<-lm(log(data[[y]])~data[[x]])
    out<-coef(mod)
    return(out)
}

x<-'GSM'
y<-'enz'
lmfit(dat,x,y)

到目前为止一切顺利。这 return 是一个截距和一个斜率。然后我 运行 相同类型的函数,但具有 nls 适合,如下所示:

VKfit<-function(data,x,y,v.start,k.start) {
    mod<- nls(log(data[[y]])~Vm*data[[x]]/(K+data[[x]]),start=list(Vm=v.start,K=k.start))
    out<-coef(mod)
    return(out)
}

x<-'GSM'
y<-'enz'
v.start<-3
k.start<-0.09
VKfit(dat,x,y,v.start,k.start)

这会打印错误:

Error in parse(text = x) : <text>:2:0: unexpected end of input
1: ~ 
   ^

我在这里做错了什么?如果我 运行:

mod<- nls(log(enz)~Vm*GSM/(K+GSM),data=dat,start=list(Vm=v.start,K=k.start))
coef(mod)

我可以拟合模型和 return 系数没问题,所以 nls 中的数据和起始值似乎不是问题。

这应该有效 (source):

VKfit <- function(data, x, y, v.start, k.start){
  eqn <- sprintf("log(%s) ~ Vm * %s / (K+%s)", y, x, x)
  mod <- nls(eqn, data=data, start=list(Vm=v.start,K=k.start))
  out <- coef(mod)
  return(out)
}

x <- 'GSM'
y <- 'enz'
# which gives "log(enz) ~ Vm * GSM / (K+GSM)" for eqn in the function
v.start <- 3
k.start <- 0.09
cf2 <- VKfit(dat,x,y,v.start,k.start)
cf2
#         Vm          K 
# 3.86761821 0.01822488 

# Comparison
mod <- nls(log(enz)~Vm*GSM/(K+GSM),data=dat,start=list(Vm=v.start,K=k.start))
cf1 <- coef(mod)

all.equal(cf1, cf2)
# [1] TRUE