我正在尝试区分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")
如您所见,获得两种模型中使用的公式的方法是不同的。我想要一种区分两者的方法,并告诉我列表是线性模型列表还是强健线性模型列表。经过多次尝试,我无法设法获得它是哪一个。
有什么建议吗?
答案 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)