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

时间:2017-11-17 23:40:03

标签: r class apply

我已经有几个回归结果,例如fit1, fit2, fit3。 我想通过使用apply函数从回归结果中提取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无法应用于'list'类。我认为此错误意味着我无法使用BIC(fitresult[1]),因为fitresult[1]不是合适的结果对象。

那么如何使用apply函数使fitresult中的每个组件都被apply函数应用?通过更改每个组件的class

1 个答案:

答案 0 :(得分:1)

TL; DR: cbind操作剥离模型类(例如,如果模型对象是使用lm函数创建的,则类为lm )来自模型对象,但BIC期望具有模型类的对象(如lmglm)。相反,lapply(list(fit1, fit2, fit3), BIC)BIC会起作用。

假设fit1fit2fit3是运行建模函数(如lmglm)而产生的对象,则这些是对象是包含模型输出的列表(例如,运行str(fit1)

BIC期待一个模型对象(例如,如果模型是使用lm创建的,则输出对象将是类lm的列表)。但是,cbind(fit1, fit2, fit3)的输出具有类matrix,并且每列包含来自给定模型对象的所有子列表元素(例如,键入fitresultclass(fitresult),控制台中有fitresult[1, ]fitresult[2, ],看看会发生什么。但是,fitresult的这些列不再附加模型类lm,因此BIC不知道如何对它们进行操作。例如,如果您使用lm创建模型,那么class(fit1)将返回lm。但是在cbind操作之后。请注意class(fitresult[ ,1])返回list

相反,将这些模型对象放入列表中,并使用lapply在每个模型对象上运行BIC

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

输出应该是一个列表,其中每个元素都是给定模型的BIC。如果您希望输出为矢量,则可以执行以下操作:

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