【问题标题】:Distinguish between lm object and rlm objectlm对象和rlm对象的区别
【发布时间】:2017-04-13 11:40:04
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 你要获取模型的类,而不是模型的call属性。试试class(fittry[[1]])

标签: r regression lm


【解决方案1】:

可重现的例子:

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

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2011-10-07
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2011-07-13
      • 2014-09-06
      相关资源
      最近更新 更多