我已经有几个回归结果,例如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
?
答案 0 :(得分:1)
TL; DR: cbind
操作剥离模型类(例如,如果模型对象是使用lm
函数创建的,则类为lm
)来自模型对象,但BIC
期望具有模型类的对象(如lm
或glm
)。相反,lapply(list(fit1, fit2, fit3), BIC)
和BIC
会起作用。
假设fit1
,fit2
和fit3
是运行建模函数(如lm
或glm
)而产生的对象,则这些是对象是包含模型输出的列表(例如,运行str(fit1)
。
BIC
期待一个模型对象(例如,如果模型是使用lm
创建的,则输出对象将是类lm
的列表)。但是,cbind(fit1, fit2, fit3)
的输出具有类matrix
,并且每列包含来自给定模型对象的所有子列表元素(例如,键入fitresult
,class(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)