【问题标题】:Generate an array of regression models without for loop生成一组没有 for 循环的回归模型
【发布时间】:2016-09-14 19:45:04
【问题描述】:

我有一个包含 Y、X1、X2 和 V 列的数据集。虽然 Y、X1 和 X2 是连续的,但 V 是一个分类变量。假设 V 有 10 个类别,我想创建 10 个线性回归模型并将结果(系数、p 值、R-Sq 等)存储在另一个表中。有没有办法在不使用 for 循环的情况下使用 data.table 来做到这一点?谢谢。

【问题讨论】:

标签: r data.table linear-regression


【解决方案1】:

基本 R 函数 by 是你想要的。

# make up some sample data
dataSet <- data.frame(Y = iris$Sepal.Length, 
                      X1 = iris$Sepal.Width, 
                      X2 = iris$Petal.Length, 
                      V = iris$Species)
# apply the `lm` function by the value of `V`
by(data = dataSet[c("Y","X1","X2")], 
   INDICES = dataSet$V, 
   FUN = lm, 
   formula = Y ~ .)

by 函数中,data 是您要应用该函数的数据。 INDICES 是一个因子向量或因子列表,其中一个值对应于 data 的每一行,指示您希望如何拆分数据。 FUN 是您要应用于数据子集的函数。在这种情况下,lm() 需要额外的参数 formula 来指示您希望如何对数据进行建模,因此您可以轻松地在 by 函数中传递该参数和额外的 formula 参数。

【讨论】:

    【解决方案2】:

    broom package 正是针对此类问题而存在的。它将模型的输出“整理”成整齐的数据框,以便于存储和比较。这是一个example,它使用broomdplyr 来解决几乎相同的问题。它使用dplyr 按分类变量对数据进行分组,为每个组拟合一个模型,并在几行代码中将系数提取到 data.frame 中。我对data.table的分组操作不熟悉,但也许可以对包进行类似的操作。

    此外,broom 具有augment 函数,可用于计算拟合优度指标和其他汇总统计数据。

    或者,如果您想在不安装其他软件包的情况下这样做,您可以将数据框拆分为一个列表(使用split 函数),lapply 将建模过程添加到列表中,提取结果(可能通过另一个lapplylm 对象中提取信息,然后将rbind 全部放在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2012-09-10
      相关资源
      最近更新 更多