将模型拟合到分组数据(如果有条件的话)

时间:2019-03-13 21:35:04

标签: r dplyr purrr broom

为了简化可重复性,我使用了ResourceSelection包中的SendgridTxEvent[].class数据集,该数据集包含用于(goats)和'available'(STATUS == 1)的空间数据山羊的GPS位置。 STATUS == 0用于单个(n = 10),ID,...,ELEVATION是点的属性。

TASP

我想为library(ResourceSelection) head(goats) STATUS ID ELEVATION SLOPE ET ASPECT HLI TASP 1 1 1 651 38.5216 35.3553 243.1131 0.9175926 0.9468804 2 1 1 660 39.6927 70.7107 270.0000 0.8840338 0.6986293 3 1 1 316 20.5477 50.0000 279.2110 0.7131423 0.5749115 4 1 1 334 34.0783 35.3553 266.1859 0.8643775 0.7447368 5 1 1 454 41.6187 25.0000 258.3106 0.9349181 0.8292587 6 1 1 343 28.4694 103.0776 237.0426 0.8254866 0.9756112 (按下面创建)分组的每个人都适合一个glm,但是模型结构会根据季节而变化。我一直在使用许多有用的SO posts和其他resources,但它们都适合每个组一个模型,而我想为每个Season分组使用不同的模型。

Season

下面,我创建一个模型构建函数,并使用#Add a new `Season` field library(tidyverse) goats <- goats %>% mutate(Season = if_else(ID %in% 1:3, "Summer", if_else(ID %in% 4:7, "Winter", "Fall"))) 指定每个季节的特定模型。

if else

然后我尝试将函数映射到分组数据并按如下所示创建新的列表列。

SeasonalMods <- function(df) {
  #Models for Archery
  if(Season == "Summer") {
    glm(STATUS ~ SLOPE + I(SLOPE^2), data = df)
  #Models for Winter  
  } else if (Season == "Winter") {
    glm(STATUS ~ SLOPE + ASPECT + TASP, data = df)
  #Models for Fall
   } else if (Season == "Fall") {
    glm(STATUS ~ ELEVATION + SLOPE + ET + ASPECT + HLI + TASP, data = df)}
  }

哪个会产生以下错误:

ModelFits <- goats %>%
  group_by(Season, ID) %>% 
  nest() %>% 
  mutate(fits = map(data, SeasonalMods),
         tidied = map(fits, tidy),
         glanced = map(fits, glance),
         augmented = map(fits, augment))

我不确定如何在Error in mutate_impl(.data, dots) : Evaluation error: object 'Season' not found 函数中正确指定Season,以便SeasonalMods可以解释它。

我试图在map()df$语句中的Season前面添加if,但这也会产生错误。

1 个答案:

答案 0 :(得分:3)

在我建议使用sudo apt-get install python-httplib2 之后,我继续使用它。就像我在上面说过的那样,您的函数modelr不知道SeasonalMods是数据帧中的一列,它作为参数,因此您会得到未定义的错误。替代方法是在函数中添加第二个参数以获取季节。由于您要嵌套数据,因此现在很容易将数据和季节传递给建模函数。我使用Season是因为列map2data的长度相同。

Season

此函数的所有内部组件都是相同的-我只添加了第二个参数。

library(tidyverse)
library(broom)

仅为了说明您使用的SeasonalMods <- function(df, Season) { ... } 函数,我添加了broom列,并将此数据框保存如下:

tidied

只需检查模型在不同季节使用的公式是否不同:

models <- goats %>%
  group_by(Season, ID) %>%
  nest() %>%
  mutate(fits = map2(data, Season, ~SeasonalMods(.x, .y))) %>%
  mutate(tidied = map(fits, tidy))

head(models)
#> # A tibble: 6 x 5
#>   Season    ID data                 fits      tidied          
#>   <chr>  <int> <list>               <list>    <list>          
#> 1 Summer     1 <tibble [2,106 × 7]> <S3: glm> <tibble [3 × 5]>
#> 2 Summer     2 <tibble [1,668 × 7]> <S3: glm> <tibble [3 × 5]>
#> 3 Summer     3 <tibble [1,539 × 7]> <S3: glm> <tibble [3 × 5]>
#> 4 Winter     4 <tibble [951 × 7]>   <S3: glm> <tibble [4 × 5]>
#> 5 Winter     5 <tibble [1,908 × 7]> <S3: glm> <tibble [4 × 5]>
#> 6 Winter     6 <tibble [2,184 × 7]> <S3: glm> <tibble [4 × 5]>