如何在lapply中使用自定义函数提取结果

时间:2017-09-13 09:00:31

标签: r lapply lm

我试图使用下面的函数提取回归系数;

## 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))而不是吗?我对此非常困惑。任何帮助/资源都表示赞赏。

1 个答案:

答案 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的参数”。