glmulti是用于一般线性模型的自动模型选择的R函数/包,它构造了给定因变量和一组预测变量的所有可能的一般线性模型,通过经典glm函数拟合它们然后允许进行多模型推断(例如,使用从AICc,BIC导出的模型权重)。 glmulti 在理论上也与任何其他函数一起工作,它返回系数,模型的对数似然和自由参数的数量(可能还有其他信息?),格式与 glm < / em>确实。
我想使用 glmulti 对定量因变量的误差进行稳健建模,以防止异常值的影响。
例如,我可以假设线性模型中的错误分布为t distribution而不是正态分布。利用其峰度参数,t分布可以具有较重的尾部,因此对于异常值更加稳健(与正态分布相比)。
但是,我并没有承诺使用t分配方法。我很满意任何回退对数似然的方法,因此可以使用 glmulti 中的多模型方法。但这意味着,遗憾的是,我无法使用R中众所周知的强大线性模型(例如{{3>}中的 lmRob 或来自robust的 lmrob )因为它们不在对数似然框架下运行,因此无法与 glmulti 一起使用。
R I的唯一强大的线性回归函数发现在对数似然框架下运行的是 heavyLm (来自robustbase包);它用t分布模拟错误。不幸的是, heavyLm 不适用于 glmulti (至少没有开箱即用),因为它没有 loglik 的S3方法(可能还有其他方法)的东西)。
举例说明:
library(glmulti)
library(heavy)
使用数据集 stackloss
head(stackloss)
常规高斯线性模型:
summary(glm(stack.loss ~ ., data = stackloss))
glmulti 使用 glm 的默认高斯链接函数进行多模型推理
stackloss.glmulti <- glmulti(stack.loss ~ ., data = stackloss, level=1, crit=bic)
print(stackloss.glmulti)
plot(stackloss.glmulti)
具有t分布式误差的线性模型(默认为df = 4)
summary(heavyLm(stack.loss ~ ., data = stackloss))
使用 glmulti 调用 heavyLm 作为拟合函数的多模型推理
stackloss.heavyLm.glmulti <- glmulti(stack.loss ~ .,
data = stackloss, level=1, crit=bic, fitfunction=heavyLm)
给出以下错误:
Initialization...
Error in UseMethod("logLik") :
no applicable method for 'logLik' applied to an object of class "heavyLm".
如果我定义以下功能,
logLik.heavyLm <- function(x){x$logLik}
glmulti可以获得对数似然,但随后出现下一个错误:
Initialization...
Error in .jcall(molly, "V", "supplyErrorDF",
as.integer(attr(logLik(fitfunc(as.formula(paste(y, :
method supplyErrorDF with signature ([I)V not found
可能有一种方法可以定义更多的函数来让 heavyLm 使用 glmulti ,但在开始这个旅程之前,我想问一下是否有人
非常感谢任何帮助!
答案 0 :(得分:1)
以下是使用heavyLm
的答案。即使这是一个相对陈旧的问题,使用heavyLm时仍然会出现您提到的同一问题(即错误消息Error in .jcall(molly, "V", "supplyErrorDF"…
)。
问题是glmulti
需要模型的自由度,作为您需要提供的属性传递,作为函数logLik.heavyLm
返回的值的属性;有关详细信息,请参阅函数logLik
的文档。此外,事实证明,您还需要提供一个函数来返回用于拟合模型的数据点的数量,因为信息标准(AIC,BIC,...)也依赖于此值。这是通过以下代码中的函数nobs.heavyLm
完成的。
以下是代码:
nobs.heavyLm <- function(mdl) mdl$dims[1] # the sample size (number of data points)
logLik.heavyLm <- function(mdl) {
res <- mdl$logLik
attr(res, "nobs") <- nobs.heavyLm(mdl) # this is not really needed for 'glmulti', but is included to adhere to the format of 'logLik'
attr(res, "df") <- length(mdl$coefficients) + 1 + 1 # I am also considering the scale parameter that is estimated; see mdl$family
class(res) <- "logLik"
res
}
,当与您提供的代码放在一起时,会产生以下结果:
Initialization...
TASK: Exhaustive screening of candidate set.
Fitting...
Completed.
> print(stackloss.glmulti)
glmulti.analysis
Method: h / Fitting: glm / IC used: bic
Level: 1 / Marginality: FALSE
From 8 models:
Best IC: 117.892471265874
Best model:
[1] "stack.loss ~ 1 + Air.Flow + Water.Temp"
Evidence weight: 0.709174196998897
Worst IC: 162.083142797858
2 models within 2 IC units.
1 models to reach 95% of evidence weight.
因此在2个BIC单位阈值内生成2个模型。
一个重要的评论:我不确定上面关于自由度的表达是否严格正确。对于标准线性模型,自由度将等于p + 1
,其中p是模型中参数的数量,而额外参数(+ 1
)是&#34;错误& #34;方差(用于计算可能性)。在上面的函数logLik.heavyLm
中,我不清楚是否还应该计算&#34; scale参数&#34;由heavyLm
估计为额外自由度,因此p + 1 + 1
,如果似然也是该参数的函数,则会出现这种情况。不幸的是,我无法证实这一点,因为我无法访问heavyLm
引用的参考文献(Dempster等人的文章,1980)。因此,我正在计算尺度参数,从而提供(略微更)保守的模型复杂度估计,惩罚&#34;复杂&#34;楷模。除小样本外,这种差异应该可以忽略不计。