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

时间:2015-06-09 14:28:09

标签: r closures wrapper linear-regression

函数MASS::lm.gls使用广义最小二乘拟合线性模型,并返回类“lm.gls”的对象,但没有printsummary或其他方法。

我可以简单地通过劫持“lm”对象的方法来定义它们

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

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

相反,我尝试为lm.gls编写一个包装器,将“lm”添加为另一个类。 (我意识到这可能是危险的,因为并非所有“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'

1 个答案:

答案 0 :(得分:1)

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

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