R在数据框中按组捕获回归斜率

时间:2019-01-21 17:36:55

标签: r lm broom

我的数据框包含在3个财政年度(2013财年,2014财年和2015财年)的调查中提出的不同问题的分数。 结果由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)))

我的目标

对于每个地区,我的目标是确定在过去3年中哪个问题经历了最显着的向上发展。为了衡量明显的向上运动,我决定使用回归的 slope 作为参数。

在3年时间范围内某个区域内上升趋势最显着的问题将是具有最正斜率的问题。

使用此逻辑,我决定执行以下操作-

1)对于RegionQST的每种组合,我运行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))
  

但是,当我运行此程序时,我收到一条错误消息,指出该对象FY   找不到。

其他要求

我也希望此方法仅适用于至少连续2年进行比较的问题。但是我无法弄清楚如何将此条件纳入我的代码中。

任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:3)

这不会执行“至少连续两年”部分,但是会执行“获得最大斜率的问题”部分:

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))

答案 1 :(得分:3)

这是一个类似的版本,可以按组大小/连续性进行过滤(在您发帖时已经写好了,以至于我还是可以继续进行下去的。)

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创建