区分lm对象和rlm对象

时间:2017-04-13 11:40:05

标签: r regression lm

我正在尝试区分LM对象和RLM(来自MASS的强健LM),因为我想要执行哪种类型的回归。所以fitList可以是lm或rlm模型,列表的所有元素都是相同的类型。

fitList 作为几个正常线性模型的列表:

fitList[[1]]$call
Output: lm(formula = frmla, data = xList[[i]])

在第二种情况下, fitList 作为几个强大线性模型的列表:

fitList[[1]][1]$call
Output: rlm(formula = frmla, data = xList[[i]], method = "MM")

如您所见,获得两种模型中使用的公式的方法是不同的。我想要一种区分两者的方法,并告诉我列表是线性模型列表还是强健线性模型列表。经过多次尝试,我无法设法获得它是哪一个。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

可重复的例子:

library(MASS)
fitlm <- lm(Height ~., trees)
fitrlm <- rlm(Height ~., trees)
class(fitlm)[1]
class(fitrlm)[1]

答案 1 :(得分:3)

1)继承这将返回一个逻辑,指示对象fm"rlm"类是否返回TRUE,如果是,FALSE否则:

inherits(fm, "rlm")

例如,

if (inherits(fm, "rlm")) {
     # process rlm
} else {
     # process lm
}

如果L是此类模型的列表,则会对它们进行全部处理:

f <- function(fm) {
   # if statement above
}
lapply(L, f)

或获取一个逻辑向量,指示哪些是"rlm"模型:

sapply(L, inherits, "rlm")

2)S3 Dispatch 另一种方法是定义process泛型,然后定义处理每个类的方法。在这个例子中,我们只返回类的名称,但是在你的应用程序中,你将把它替换为处理该类对象的所有处理。

process <- function(x, ...) UseMethod("process")
process.rlm <- function(x, ...) "rlm"
process.lm <- function(x, ...) "lm"
process.default <- function(x, ...) "error"

lapply(L, process)