为线性建模函数编写包装器 [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
}
函数 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
}