R中的回归与组[重复]

Posted

技术标签:

【中文标题】R中的回归与组[重复]【英文标题】:Regression in R with Groups [duplicate] 【发布时间】:2016-09-14 06:47:46 【问题描述】:

我导入了一个包含 3 列的 CSV,2 列用于 Y 和 X,第三列用于标识 X 的类别(我有 20 个组/类别)。我能够在整体层面运行回归,但我想分别对 20 个类别运行回归并存储 co-ef。

我尝试了以下方法:

list2env(split(sample, sample$CATEGORY_DESC), envir = .GlobalEnv)

现在我有 20 个文件,我如何对这 20 个文件运行回归并将 co-eff 存储在某个地方。

【问题讨论】:

绝对有必要处理20个不同的文件吗?考虑将它们合并到一个数据帧中(每个都有一个唯一的标识符)并使用可用的函数,如lmList(在 nlme 包中)同时运行所有 lm。这样更容易获得系数。 【参考方案1】:

由于没有提供数据,我正在生成一些示例数据来展示如何使用 dplyrbroom 包运行多个回归和存储输出。

在下面,有 20 个组,每组有不同的 x/y 值。运行 20 个回归,这些回归的输出以数据框的形式提供:

library(dplyr)
library(broom)
df <- data.frame(group = rep(1:20, 10),
                 x = rep(1:20, 10) + rnorm(200),
                 y = rep(1:20, 10) + rnorm(200))
df %>% group_by(group) %>% do(tidy(lm(x ~ y, data = .)))

示例输出:

Source: local data frame [40 x 6]
Groups: group [20]

   group        term    estimate std.error  statistic     p.value
   <int>       <chr>       <dbl>     <dbl>      <dbl>       <dbl>
1      1 (Intercept)  0.42679228 1.0110422  0.4221310 0.684045203
2      1           y  0.45625124 0.7913256  0.5765657 0.580089051
3      2 (Intercept)  1.99367392 0.4731639  4.2134955 0.002941805
4      2           y  0.05101438 0.1909607  0.2671460 0.796114398
5      3 (Intercept)  3.14391308 0.8417638  3.7349114 0.005747126
6      3           y  0.08418715 0.2453441  0.3431391 0.740336702

【讨论】:

我收到以下错误 - 错误:无效的下标类型“整数” &gt; packageVersion('dplyr') [1] ‘0.4.3.9001’ &gt; packageVersion('broom') [1] ‘0.4.0’ 如果您使用的是旧版本的dplyr,您可能需要升级到开发版本,因为其中存在一些错误。【参考方案2】:

使用 lmList(包 nlme)的快速解决方案:

library(nlme)
lmList(x ~ y | group, data=df)

    Call:
  Model: x ~ y | group 
   Data: df 

Coefficients:
   (Intercept)           y
1    0.4786373  0.04978624
2    3.5125369 -0.94751894
3    2.7429958 -0.01208329
4   -5.2231576  2.24589181
5    5.6370824 -0.24223131
6    7.1785581 -0.08077726
7    8.2060808 -0.18283134
8    8.9072851 -0.13090764
9   10.1974577 -0.18514527
10   6.0687105  0.37396911
11   9.0682622  0.23469187
12  15.1081915 -0.29234452
13  17.3147636 -0.30306692
14  13.1352411  0.05873189
15   6.4006623  0.57619151
16  25.4454182 -0.59535396
17  22.0231916 -0.30073768
18  27.7317267 -0.54651597
19  10.9689733  0.45280604
20  23.3495704 -0.14488522

Degrees of freedom: 200 total; 160 residual
Residual standard error: 0.9536226

从@Gopala 答案中借用数据 df。

【讨论】:

当我深入挖掘与整体结果时,我遇到了相反的效果。这叫什么?我正在空白的效果名称!【参考方案3】:

还可以考虑使用lapply() 的基本解决方案:

regressionList <- lapply(unique(df$group),
                         function(x) lm(x ~ y, df[df$group==x,]))

只有系数:

coeffList <- lapply(unique(df$group),
                    function(x) lm(x ~ y, df[df$group==x,])$coefficients)

汇总列表:

summaryList <- lapply(unique(df$group),
                      function(x) summary(lm(x ~ y, df[df$group==x,])))

【讨论】:

运行 coeffList&lt;-lapply(regressionList, coef)summaryList &lt;-lapply(regressionList, summary) 会更快。 确实是@AdamQuek。无需重新运行模型。 OP 可用的所有选项!

以上是关于R中的回归与组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

R中的子集回归[重复]

获得R中的回归系数[重复]

在R中使用for循环的逻辑回归[重复]

更改R中逻辑回归(glm)中使用的参考等位基因[重复]

scikit_learn 中的回归总结

试图在r中隔离数据框中的两列[重复]