为线性建模函数编写包装器 [MASS::lm.gls()]

writing a wrapper for a linear modeling function [MASS::lm.gls()]

函数 MASS::lm.gls 使用广义最小二乘法拟合线性模型,returns class "lm.gls" 的对象,但没有 print , summary 或其他方法。

我可以简单地通过劫持 "lm" 对象的方法来定义这些

print.lm.gls <- function(object, ...) {
     class(object) <- "lm"
     print(object, ...)
}

summary.lm.gls <- function(object, ...) {
     class(object) <- "lm"
     summary(object, ...)
}

相反,我尝试为 lm.gls 编写包装器以将 "lm" 添加为另一个 class。 (我意识到这可能很危险,因为并非所有 "lm" 方法都可能对 GLS 有效。)

这是我试过的。它不起作用,如下例所示,但我不明白为什么不行,或者如何更普遍地做这种事情。

lm_gls <- function(formula, data, W, subset, na.action, inverse = FALSE, 
    method = "qr", model = FALSE, x = FALSE, y = FALSE, contrasts = NULL, 
    ...) 
{
    result <- MASS::lm.gls(formula, data, W, subset, na.action, 
        inverse = inverse,  method = method, model = model, x = x, y = y, contrasts = contrasts, 
    ...) 
  class(result) <- c(class(result), "lm")
  result
}

测试用例:

library(vcd) # needs vcd_1.3-3+ 
data(Punishment, package="vcd")

pun.lor <- loddsratio(Freq ~ memory + attitude + age + education, data = Punishment)
pun.lor.df <- as.data.frame(pun.lor)

library(MASS)

pun.gls <- lm_gls(LOR ~ as.numeric(age) * as.numeric(education), data=pun.lor.df, 
                  W=vcov(pun.lor), inverse=TRUE, x=TRUE, y=TRUE)

这给出了错误:

> pun.gls <- lm_gls(LOR ~ as.numeric(age) * as.numeric(education), data=pun.lor.df, W=vcov(pun.lor), inverse=TRUE, x=TRUE, y=TRUE)
Error in xj[i] : invalid subscript type 'closure'

您收到的错误来自子集或 na.action 参数,它们是可选的但没有默认值。因此,当您在不指定它们的情况下调用该函数时,它们将按原样从包装器(类型闭包)中传递。最简单的解决方案是像这样将所有内容传递给 lm.gls:

lm_gls <- function(...) 
{
  result <- MASS::lm.gls(...) 
  class(result) <- c(class(result), "lm")
  result
}