【问题标题】:Improve efficiency of fitting many models提高拟合多个模型的效率
【发布时间】:2020-02-02 12:54:17
【问题描述】:

感谢那些帮助我解决许多模型之前关于coefficientsp values 的问题的人。现在,我可以从许多模型中获取所有系数、p 值和 AIC 值。

md <- "mpg ~ cyl" 
xlist <- c("disp", "hp", "am")
n <- length(xlist)
comb_lst <- unlist(lapply(1:n, function(x) combn(xlist, x, simplify = F)), recursive = F)
md_lst <- lapply(comb_lst, function(x) paste(md, "+", paste(x, collapse = "+")))

coefs <- unlist(lapply(md_lst, function(x) lm(as.formula(x),data = mtcars)$coe[2]))
pvalues <- unlist(lapply(md_lst, function(x) summary(lm(as.formula(x), data = mtcars))$coe["cyl", 4]))
aic <- unlist(lapply(md_lst, function(x) AIC(lm(as.formula(x), data = mtcars))))

从上面的代码中可以看出,最后 3 行中的每一行都可以独立地拟合多个模型。这意味着代码将适合同一组模型 3 次。对于大数据和许多变量,这可能会很耗时。我的问题是如何将所有模型拟合一次,然后再拿起系数、p 值和 AIC 值。

【问题讨论】:

  • 函数leaps::regsubsets 让您使用逐步向前/向后的详尽技术拟合模型
  • 您不需要三次拟合模型。一次就够了。我在手机上,但您可以将要选择的变量映射到单个模型并执行一次。不是三次。

标签: r model regression coefficients


【解决方案1】:

为方便起见,我使用了我写的package 中的一个函数。可以通过使用summary 来避免这种情况,如另一个answer 所示。

我们可以做到:

models <- lapply(md_lst, function(x) do.call(lm, list(formula =x,
                                                      data=mtcars)) )
sapply(models, function(x) { cbind(coef(x),
 manymodelr::extract_model_info(x, "p_value")["cyl"], AIC(x) )})

我不想使用包(manymodelr)

sapply(models, function(x) {
  cbind(coef(x),coef(summary(x))[,4]["cyl"],
        AIC(x)
        )})

这为我们提供了一个矩阵列表,其中每列分别代表系数、p 值和 AIC。

结果(截断)

   [[1]]
                       [,1]       [,2]     [,3]
    (Intercept) 34.66099474 0.03366495 167.1456
    cyl         -1.58727681 0.03366495 167.1456
    disp        -0.02058363 0.03366495 167.1456

    [[2]]
                      [,1]         [,2]     [,3]
    (Intercept) 36.9083305 0.0004803752 169.5618
    cyl         -2.2646936 0.0004803752 169.5618
    hp          -0.0191217 0.0004803752 169.5618

    [[3]]
                     [,1]        [,2]     [,3]
    (Intercept) 34.522443 1.28456e-07 167.2191
    cyl         -2.500958 1.28456e-07 167.2191
    am           2.567035 1.28456e-07 167.2191

    [[4]]
                       [,1]      [,2]     [,3]
    (Intercept) 34.18491917 0.1349044 168.0184
    cyl         -1.22741994 0.1349044 168.0184
    disp        -0.01883809 0.1349044 168.0184
    hp          -0.01467933 0.1349044 168.0184

【讨论】:

  • 非常感谢。 manymodelr 现在在我的机器上运行良好。我需要一些时间来熟悉它。这是一个方便的工具,干得好!
  • 很高兴它有帮助。如果您发现一些问题,请告诉我。
【解决方案2】:

你可以这样做:

models <- lapply(md_lst, function(x) lm(as.formula(x), data = mtcars))
coefs <- unlist(lapply(models, function(x) x$coef[2]))
pvalues <- unlist(lapply(models, function(x) summary(x)$coef["cyl", 4]))
aic <- unlist(lapply(models, function(x) AIC(x)))

【讨论】:

    【解决方案3】:

    这使用了将FUN 放入combn() 调用的能力。与其他答案一样,它只进行一次线性回归。

    md <- "mpg ~ cyl" 
    xlist <- c("disp", "hp", "am")
    
    all_models <- unlist(
                    lapply(seq_along(xlist),
                           function (k) {
                             combn(xlist,
                                   k,
                                   FUN = function (x) {
                                     form <- formula(paste(md, '+', paste(x, collapse = '+')))
                                     eval(bquote(lm(.(form), data = mtcars)   ))
                                     },
                                   simplify = F
                             )
                             }
                           )
                    ,recursive = F
                    )
    
    coefs <- sapply(all_models, function(x) x$coe[2])
    pvalues <- sapply(all_models, function(x) summary(x)$coe["cyl", 4])
    aic <- sapply(all_models, function(x) AIC(x))
    

    【讨论】:

    • 非常感谢。非常巧妙的解决方案!
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多