在 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
假设我有一些数据,作为数据框:
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