代码之家  ›  专栏  ›  技术社区  ›  Varun

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

  •  0
  • Varun  · 技术社区  · 5 年前

    我的数据框架包括三个财政年度(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年的时间框架内。为了测量显著的向上运动,我决定使用 斜坡 以回归为参数。

    在3年的时间框架内,一个区域内最显著的向上演化问题将是 最陡正坡 .

    使用这个逻辑,我决定做以下事情-

    1)每种组合 区域 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))
    

    但是,当我运行此程序时,会收到一条错误消息,说明该对象 FY 没有找到。

    附加要求

    另外,我希望这只适用于那些有至少连续两年数据可供比较的问题。但是我无法理解如何将这个条件考虑到我的代码中。

    对此,任何帮助都将不胜感激。

    2 回复  |  直到 5 年前
        1
  •  2
  •   A. S. K.    5 年前

    这不是“至少连续两年”的部分,而是“获得最大坡度的问题”的部分:

    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))
    
        2
  •  2
  •   gfgm    5 年前

    这里有一个类似的版本,按组大小/连续性过滤(在您发布时已经编写了它,所以我想我还是继续吧)。

    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
    

    创建于2019-01-21 reprex package (v0.2.1)