2017-11-17 579 views
1

我已經有幾個迴歸結果,例如, fit1, fit2, fit3。 我想通過使用apply函數從迴歸結果中提取BIC。如何通過應用r函數從幾個迴歸結果中提取BIC

的問題是,當我的代碼如下:

fitresult = cbind(fit1, fit2, fit3) 
BIC = apply(fitresult, 2, BIC) 

它顯示錯誤:

Error in UseMethod("logLik") : no applicable method for 'logLik' 
applied to an object of class "list" 

我檢查,發現class(fitresult[1]) = 'list'loglik無法在 '清單' 類應用。我認爲這個錯誤意味着我不能使用BIC(fitresult[1]),因爲fitresult[1]不是合適的結果對象。

那麼我該如何使用apply函數來使​​中的每個組件都可以使用apply函數呢?通過更改每個組件的class

+0

請參閱如何創建[最小的可重複的例子(https://stackoverflow.com/a/5963610/8386140),以幫助別人幫你。 – duckmayr

回答

1

TL; DR:cbind操作條模型類(例如,類是lm如果模型對象與所述lm函數創建)從模型中的對象,但BIC預計與模型類的對象(如lmglm)。相反,做lapply(list(fit1, fit2, fit3), BIC)BIC將工作。


假設fit1fit2,和fit3是起因於運行的建模函數(像lmglm),則這些對象是包含模型輸出列表對象(例如,運行str(fit1)

BIC正在等待模型對象(例如,如果模型是使用lm創建的,則輸出對象將是類別lm的列表)。但是,cbind(fit1, fit2, fit3)的輸出具有類別matrix,a nd每列包含給定模型對象的所有子列表元素(例如,在控制檯中輸入​​,class(fitresult),fitresult[1, ]fitresult[2, ]並查看會發生什麼情況)。然而,​​的這些列不再附帶模型類lm,因此BIC不知道如何操作它們。例如,如果您使用lm創建模型,則class(fit1)將返回lm。但是在cbind操作之後。請注意0​​返回list

相反,把這些模型對象轉換成一個列表,並使用lapply每個模型對象上運行BIC

lapply(list(fit1, fit2, fit3), BIC) 

輸出應該是一個列表,其中每個元素是從給定的模型BIC。如果你想輸出作爲載體,可以這樣做:

sapply(list(fit1, fit2, fit3), BIC) 
+0

或vapply:'vapply(list(fit1,fit2,fit3),BIC,numeric(1))' – Parfait