2017-09-13 44 views
1

我试图使用下面的函数提取回归系数;在lapply中如何使用自定义函数提取结果

## 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),并且我在lapply中再次给出cust_lm(x, data)作为参数。这是正确的事情吗?

这是正确的,如果我给,list<-lapply(names(ydata)[1:2], function(z) cust_lm(z, data))而不是?我对此很困惑。任何帮助/资源表示赞赏。

回答

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的说法”。

+0

感谢您的澄清。那么,'list <-lapply(names(ydata)[1:2],function(z)cust_lm(z,data))'是**错字**。因此,我可以使用'lapply(names(ydata)[1:2],function(z)cust_lm(z,data))'或'lapply(names(ydata)[1:2]),cust_lm,data = ydata)' – Enigma

+0

但是,当我打电话时,列表中的'cust_lm',这是如何工作的?因为该函数的参数是'varname'和'data'。但我不是专门在乐队里面给阿甘!换句话说,我可以使用'cust_lm'作为独占函数吗?我在使用'cust_lm(x,data [,y]'时会出错,为什么会这样?你能澄清一下吗? – Enigma

+0

'你在列表里面'是什么意思?'cust_lm'假设(基于它两行代码):在参数data中接收到的对象有一个名称由参数varname给出的列 – MrGumble

相关问题