函数MASS::lm.gls
使用广义最小二乘拟合线性模型,并返回类“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”添加为另一个类。 (我意识到这可能是危险的,因为并非所有“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'
答案 0 :(得分:1)
您获得的错误来自子集或na.action参数,这些参数是可选的但没有默认值。因此,当您在不指定函数的情况下调用函数时,它们将从包装器传递,这是类型闭包。最简单的解决方案是将所有内容传递给lm.gls,如下所示:
lm_gls <- function(...)
{
result <- MASS::lm.gls(...)
class(result) <- c(class(result), "lm")
result
}