生成一个没有for循环的回归模型数组

时间:2016-09-14 19:45:05

标签: r data.table linear-regression

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

2 个答案:

答案 0 :(得分:3)

基础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,表明您希望如何为数据建模,因此您可以轻松地将其作为formula函数中的by参数传递

答案 1 :(得分:0)

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

此外,broom具有augment功能,可用于计算拟合度指标和其他摘要统计信息。

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