我试图使用下面的函数提取回归系数;
## customized function to return coef as matrix
cust_lm<- function(varname, data){
y<-data[,varname]
coefOLS<- as.matrix(coef(summary(lm(y~x))));
}
我希望每次使用此函数时使用不同的因变量(自变量保持不变)运行回归。我正在使用lapply
。
## artificial data
x<-rnorm(100,5,3)
ydata<-data.frame(y1=rnorm(100), y2=rnorm(100))
## running regressions together and storing as list
list<-lapply(names(ydata)[1:2], function(x) cust_lm(x, ydata))
我得到了所需的结果list[[1]]
只是coef(summary(lm(ydata[,1]~x)))
而list[[2]]
等于coef(summary(lm(ydata[,2]~x)))
。
我曾经在几篇SO帖子的帮助下写过这篇文章。现在我想破译我的自定义函数以了解它是如何工作的,而且我对lapply
也不是很清楚。
我已经创建了自定义函数,其参数需要为(varname, data)
,我再次将cust_lm(x, data)
作为lapply
中的参数。这是正确的做法吗?
如果我给予list<-lapply(names(ydata)[1:2], function(z) cust_lm(z, data))
而不是吗?我对此非常困惑。任何帮助/资源都表示赞赏。
答案 0 :(得分:2)
你总是可以尝试一点一点地分解它。
lapply
的第一次迭代会调用cust_lm('a', ydata)
。我们来看看:
cust_lm('y1', ydata)
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 0.006170844 0.22234415 0.02775357 0.9779151
# x -0.004470560 0.03960525 -0.11287797 0.9103582
在您的代码中,名称data
是函数中的变量名。因此,当您指定list<-lapply(names(ydata)[1:2], function(z) cust_lm(z, data))
时,R将在调用该行时查找名为data
的变量。所以这是错误的。用list<-lapply(names(ydata)[1:2], function(x) cust_lm(x, ydata))
调用它是正确的答案。您可以进一步简化为:
list <- lapply(names(ydata)[1:2], cust_lm, data=ydata)
这会分解为“cust_lm
依次将names(ydata)[1:2]
的每个元素作为第一个参数调用;使用ydata
作为名为data
的参数”。