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】:
由于没有提供数据,我正在生成一些示例数据来展示如何使用 dplyr
和 broom
包运行多个回归和存储输出。
在下面,有 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
【讨论】:
我收到以下错误 - 错误:无效的下标类型“整数”> packageVersion('dplyr') [1] ‘0.4.3.9001’ > 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<-lapply(regressionList, coef)
和 summaryList <-lapply(regressionList, summary)
会更快。
确实是@AdamQuek。无需重新运行模型。 OP 可用的所有选项!以上是关于R中的回归与组[重复]的主要内容,如果未能解决你的问题,请参考以下文章