哪个用于鲁棒线性回归的函数/包与glmulti一起工作(即,表现得像glm)?

时间:2012-08-13 12:16:28

标签: r glm robust

背景:使用 glmulti

进行多模型推理

glmulti是用于一般线性模型的自动模型选择的R函数/包,它构造了给定因变量和一组预测变量的所有可能的一般线性模型,通过经典glm函数拟合它们然后允许进行多模型推断(例如,使用从AICc,BIC导出的模型权重)。 glmulti 在理论上也与任何其他函数一起工作,它返回系数,模型的对数似然和自由参数的数量(可能还有其他信息?),格式与 glm < / em>确实。

我的目标:具有强大错误的多模型推理

我想使用 glmulti 对定量因变量的误差进行稳健建模,以防止异常值的影响。

例如,我可以假设线性模型中的错误分布为t distribution而不是正态分布。利用其峰度参数,t分布可以具有较重的尾部,因此对于异常值更加稳健(与正态分布相比)。

但是,我并没有承诺使用t分配方法。我很满意任何回退对数似然的方法,因此可以使用 glmulti 中的多模型方法。但这意味着,遗憾的是,我无法使用R中众所周知的强大线性模型(例如{{3>}中的 lmRob 或来自robust lmrob )因为它们不在对数似然框架下运行,因此无法与 glmulti 一起使用。

问题:我找不到适用于 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

问题:鲁棒线性回归的哪个函数/包与glmulti一起工作(即表现得像glm)?

可能有一种方法可以定义更多的函数来让 heavyLm 使用 glmulti ,但在开始这个旅程之前,我想问一下是否有人

  • 知道一个强大的线性回归函数,它(a)在对数似然框架下运行,(b)表现得像 glm (因此可以用 glmulti 输出-of现成)。
  • heavyLm 已经在使用 glmulti

非常感谢任何帮助!

1 个答案:

答案 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;楷模。除小样本外,这种差异应该可以忽略不计。