【问题标题】:robust linear regression with lapplylapply 的稳健线性回归
【发布时间】:2018-07-25 14:54:41
【问题描述】:

在数据帧列表上运行稳健的线性回归模型(使用 MASS 库中的 rlm)时遇到问题。

可重现的例子:

var1 <- c(1:100)
var2 <- var1*var1
df1  <- data.frame(var1, var2)
var1 <- var1 + 50
var2 <- var2*2
df2  <- data.frame(var1, var2)
lst1 <- list(df1, df2)

线性模型(工作):

lin_mod <- lapply(lst1, lm, formula = var1 ~ var2)
summary(lin_mod[[1]])

我的健壮模型代码:

rob_mod <- lapply(lst1, MASS::rlm, formula = var1 ~ var2)

给出以下错误:

Error in rlm.default(X[[i]], ...) : 
argument "y" is missing, with no default

我该如何解决这个问题?

我的实际数据中的错误是:

Error in qr.default(x) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In storage.mode(x) <- "double" : NAs introduced by coercion    

【问题讨论】:

  • 如您所见,?lm 仅提供公式方法。相比之下,?rlm 同时提供(公式和x,y)。因此,您必须指定 data 来表示 rlm 才能使用 Rui Barradas 答案中的公式方法。

标签: r


【解决方案1】:

您也可以尝试purrr:map 解决方案:

library(tidyverse)
map(lst1, ~rlm(var1 ~ var2, data=.))

或如 joran 评论的那样

map(lst1, MASS:::rlm.formula, formula = var1 ~ var2)

正如您在此处看到的,?lm 仅提供公式方法。相比之下,?rlm 提供了两者(formula 和 x, y)。因此,您必须指定data= 来表示rlm 才能显式使用公式方法。否则 rlm 想要 x 和 y 作为输入。

【讨论】:

    【解决方案2】:

    您的呼叫缺少data 参数。 lapply 将调用FUN,列表中的每个成员作为FUN 的第一个 参数,但data 是rlm 的第二个 参数。

    解决办法是定义一个匿名函数。

    lin_mod <- lapply(lst1, function(DF) MASS::rlm(formula = var1 ~ var2, data = DF))
    summary(lin_mod[[1]])
    #
    #Call: rlm(formula = var1 ~ var2, data = DF)
    #Residuals:
    #    Min      1Q  Median      3Q     Max 
    #-18.707  -5.381   1.768   6.067   7.511 
    #
    #Coefficients:
    #              Value   Std. Error t value
    #(Intercept) 19.6977  1.0872    18.1179
    #var2         0.0092  0.0002    38.2665
    #
    #Residual standard error: 8.827 on 98 degrees of freedom
    

    【讨论】:

    • 我认为不使用匿名函数而是直接通过MASS:::rlm.formula调用公式方法就足够了。
    • @joran 但是lapply 怎么知道将列表成员放在哪里?问题是一样的。
    • 它的工作方式与lm 完全相同。试试吧,它有效:lapply(lst1, MASS:::rlm.formula, formula = var1 ~ var2).
    • 谢谢,帮了大忙。为什么我的代码适用于线性模型?这两个函数的第一个参数的顺序在文档中看起来很相似。
    • @felixR Rui 的回答是正确的,但解释可能有点混乱。问题实际上不是参数的顺序,而是附加 S3 方法的存在,如另一个答案中所述。这会在调度中产生一些歧义,因此为rlm 调用默认方法而不是公式方法。直接调用该方法或指定另一个参数都强制使用公式方法。
    猜你喜欢
    • 2018-01-13
    • 2015-12-12
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2018-04-02
    • 2018-03-04
    • 2016-12-27
    相关资源
    最近更新 更多