如何通过应用r函数从几个回归结果中提取BIC

如何通过应用r函数从几个回归结果中提取BIC

问题描述:

我已经有几个回归结果,例如, 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

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