区分lm对象和rlm对象

Distinguish between lm object and rlm object

我试图区分 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")

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

有什么建议吗?

可重现的例子:

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

1) inherits 这将 return 一个逻辑对象,fm,是否属于 "rlm" class returning 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 泛型,然后定义一个方法来处理每个 class。在此示例中,我们只是 return class 的名称,但在您的应用程序中,您将用所有处理替换它以处理 class.

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

lapply(L, process)