2017-09-13 43 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

相關問題