R在数据框中按组捕获回归斜率
R Capturing regression slopes by group in a dataframe
我的数据框包含 3 个财政年度(FY13、FY14 和 FY15)调查中提出的不同问题的分数。
结果由Region
.
呈现
这是实际数据框的 样本 的样子,每个地区我们有两个问题,在不同的年份提出。
testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
Very.Satisfied=runif(16,min = 0, max=1),
Total.Very.Satisfied=floor(runif(16,min=10,max=120)))
我的Objective
对于每个地区,我的 objective 是确定哪个问题在这 3 年的时间范围内经历了 最显着的向上演变 。为了衡量显着的上升趋势,我决定使用回归的 斜率 作为参数。
一个区域内在 3 年时间范围内向上演变最显着的问题将是具有 最陡正斜率 的问题。
根据这个逻辑,我决定执行以下操作 -
1) 对于 Region
和 QST
的每个组合,我 运行 lm
函数。
2) 我提取每个组合的斜率,并将其存储为一个单独的变量。然后对于每个区域,我过滤掉具有最大斜率值的问题。
我的尝试
这是我解决这个问题的尝试。
test_final=testdf %>%
group_by(Region,QST) %>%
map(~lm(FY ~ Very.Satisfied, data = .)) %>%
map_df(tidy) %>%
filter(term == 'circumference') %>%
select(estimate) %>%
summarise(Value = max(estimate))
However when I run this I get an error message saying that object FY
was not found.
附加要求
此外,我希望这仅适用于至少有连续 2 年的数据进行比较的问题。但是我无法弄清楚如何将这种情况考虑到我的代码中。
如有任何帮助,我们将不胜感激。
这不执行 "at least two consecutive years" 部分,但执行 "get the question with the largest slope" 部分:
library(dplyr)
test_final = testdf %>%
mutate(FY.num = as.numeric(gsub("FY", "", FY))) %>%
group_by(Region, QST) %>%
mutate(lm_slope = lm(Very.Satisfied ~ FY.num)$coefficients[["FY.num"]]) %>%
ungroup() %>%
group_by(Region) %>%
filter(lm_slope == max(lm_slope))
这是一个类似的版本,按组过滤 size/contiguity(在你发帖时已经写好了,所以我想我还是继续吧)。
library(tidyverse)
set.seed(42)
testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
Very.Satisfied=runif(16,min = 0, max=1),
Total.Very.Satisfied=floor(runif(16,min=10,max=120)))
test_final <- testdf %>%
group_by(Region,QST) %>% # group by region
mutate(numdate = as.numeric(str_remove(FY, "FY"))) %>%
filter(n() >= 2 & max(diff(numdate)) < 2) %>% # filter out singleton groups
mutate(slopes = coef(lm(Very.Satisfied~numdate))[2])
test_final %>% select(Region, QST, slopes)
#> # A tibble: 14 x 3
#> # Groups: Region, QST [5]
#> Region QST slopes
#> <fct> <fct> <dbl>
#> 1 AFRICA Q2 -0.314
#> 2 AFRICA Q2 -0.314
#> 3 AFRICA Q2 -0.314
#> 4 AFRICA Q5 -0.189
#> 5 AFRICA Q5 -0.189
#> 6 ASIA Q2 -0.192
#> 7 ASIA Q2 -0.192
#> 8 ASIA Q2 -0.192
#> 9 AMERICA Q2 0.238
#> 10 AMERICA Q2 0.238
#> 11 AMERICA Q2 0.238
#> 12 AMERICA Q5 0.342
#> 13 AMERICA Q5 0.342
#> 14 AMERICA Q5 0.342
test_final %>% group_by(Region) %>%
summarise(Value = max(slopes),
Top_Question = QST[which.max(slopes)])
#> # A tibble: 3 x 3
#> Region Value Top_Question
#> <fct> <dbl> <fct>
#> 1 AFRICA -0.189 Q5
#> 2 AMERICA 0.342 Q5
#> 3 ASIA -0.192 Q2
由 reprex package (v0.2.1)
创建于 2019-01-21
我的数据框包含 3 个财政年度(FY13、FY14 和 FY15)调查中提出的不同问题的分数。
结果由Region
.
这是实际数据框的 样本 的样子,每个地区我们有两个问题,在不同的年份提出。
testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
Very.Satisfied=runif(16,min = 0, max=1),
Total.Very.Satisfied=floor(runif(16,min=10,max=120)))
我的Objective
对于每个地区,我的 objective 是确定哪个问题在这 3 年的时间范围内经历了 最显着的向上演变 。为了衡量显着的上升趋势,我决定使用回归的 斜率 作为参数。
一个区域内在 3 年时间范围内向上演变最显着的问题将是具有 最陡正斜率 的问题。
根据这个逻辑,我决定执行以下操作 -
1) 对于 Region
和 QST
的每个组合,我 运行 lm
函数。
2) 我提取每个组合的斜率,并将其存储为一个单独的变量。然后对于每个区域,我过滤掉具有最大斜率值的问题。
我的尝试
这是我解决这个问题的尝试。
test_final=testdf %>%
group_by(Region,QST) %>%
map(~lm(FY ~ Very.Satisfied, data = .)) %>%
map_df(tidy) %>%
filter(term == 'circumference') %>%
select(estimate) %>%
summarise(Value = max(estimate))
However when I run this I get an error message saying that object
FY
was not found.
附加要求
此外,我希望这仅适用于至少有连续 2 年的数据进行比较的问题。但是我无法弄清楚如何将这种情况考虑到我的代码中。
如有任何帮助,我们将不胜感激。
这不执行 "at least two consecutive years" 部分,但执行 "get the question with the largest slope" 部分:
library(dplyr)
test_final = testdf %>%
mutate(FY.num = as.numeric(gsub("FY", "", FY))) %>%
group_by(Region, QST) %>%
mutate(lm_slope = lm(Very.Satisfied ~ FY.num)$coefficients[["FY.num"]]) %>%
ungroup() %>%
group_by(Region) %>%
filter(lm_slope == max(lm_slope))
这是一个类似的版本,按组过滤 size/contiguity(在你发帖时已经写好了,所以我想我还是继续吧)。
library(tidyverse)
set.seed(42)
testdf=data.frame(FY=c("FY13","FY14","FY15","FY14","FY15","FY13","FY14","FY15","FY13","FY15","FY13","FY14","FY15","FY13","FY14","FY15"),
Region=c(rep("AFRICA",5),rep("ASIA",5),rep("AMERICA",6)),
QST=c(rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",2),rep("Q2",3),rep("Q5",3)),
Very.Satisfied=runif(16,min = 0, max=1),
Total.Very.Satisfied=floor(runif(16,min=10,max=120)))
test_final <- testdf %>%
group_by(Region,QST) %>% # group by region
mutate(numdate = as.numeric(str_remove(FY, "FY"))) %>%
filter(n() >= 2 & max(diff(numdate)) < 2) %>% # filter out singleton groups
mutate(slopes = coef(lm(Very.Satisfied~numdate))[2])
test_final %>% select(Region, QST, slopes)
#> # A tibble: 14 x 3
#> # Groups: Region, QST [5]
#> Region QST slopes
#> <fct> <fct> <dbl>
#> 1 AFRICA Q2 -0.314
#> 2 AFRICA Q2 -0.314
#> 3 AFRICA Q2 -0.314
#> 4 AFRICA Q5 -0.189
#> 5 AFRICA Q5 -0.189
#> 6 ASIA Q2 -0.192
#> 7 ASIA Q2 -0.192
#> 8 ASIA Q2 -0.192
#> 9 AMERICA Q2 0.238
#> 10 AMERICA Q2 0.238
#> 11 AMERICA Q2 0.238
#> 12 AMERICA Q5 0.342
#> 13 AMERICA Q5 0.342
#> 14 AMERICA Q5 0.342
test_final %>% group_by(Region) %>%
summarise(Value = max(slopes),
Top_Question = QST[which.max(slopes)])
#> # A tibble: 3 x 3
#> Region Value Top_Question
#> <fct> <dbl> <fct>
#> 1 AFRICA -0.189 Q5
#> 2 AMERICA 0.342 Q5
#> 3 ASIA -0.192 Q2
由 reprex package (v0.2.1)
创建于 2019-01-21