我有一个包含Y,X1,X2和V列的数据集。当Y,X1和X2是连续的时,V是一个分类变量。假设V有10个类别,我想创建10个线性回归模型并将结果(系数,p值,R-Sq等)存储在另一个表中。有没有办法使用data.table而不使用for循环?感谢。
答案 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使用broom
和dplyr
来解决几乎相同的问题。它使用dplyr
按分类变量对数据进行分组,将模型拟合到每个组,并在几行代码中将系数提取到data.frame中。我不熟悉data.table
的分组操作,但可能会执行与包类似的操作。
此外,broom
具有augment
功能,可用于计算拟合度指标和其他摘要统计信息。
或者,如果您想在不安装其他软件包的情况下执行此操作,则可以将数据框拆分为一个列表(使用split
函数),lapply
将建模过程添加到列表中,提取结果(可能通过另一个lapply
从lm
对象中提取信息,然后rbind
一起提取信息。