Отображение модели в перестановочный набор данных иногда возвращает уравнение модели, а не вывод модели - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь использовать функцию перестановки в modelr with purrr map для вычисления средних значений двух категорий данных при перестановке.

Функция ведет себя так, как можно было бы ожидать, если бы я пытался вычислить линейные модели из переставленных наборов данных, как в файле примера для modelr :: permute (хотя я запускаю линейную модель внутри пользовательской функции):

library(tidyverse) 
library(modelr)

perms <- permute(mtcars,  1000, mpg)
jlm <- function(df){lm(mpg ~ wt, data = df)}
models3 <- map(perms$perm, jlm)
models3[[1]]
Call:
lm(formula = mpg ~ wt, data = df)

Coefficients:
(Intercept)           wt  
     28.211       -2.524

Теперь вместо линейной модели мне просто нужны средние значения для двух категорий в этом наборе данных. Я пытался бежать следующим образом.

mean_of_vs <- function(df){
  df %>% group_by(vs) %>% summarize(mean(mpg)) %>% spread(vs, `mean(mpg)`) %>%
    rename(zero = `0`, one = `1`)
}

models4 <- map(perms$perm, ~mean_of_vs)

models4[[1]]

но это просто возвращает уравнение функции, а не вывод функции

function(df){
  df %>% group_by(vs) %>% summarize(mean(mpg)) %>% spread(vs, `mean(mpg)`) %>%
    rename(zero = `0`, one = `1`)
}

Уравнение работает само по себе на простом фрейме данных.

test <- perms %>% pull(perm) %>% .[[1]] %>% as.data.frame

mean_of_vs(test)
# A tibble: 1 x 2
   zero   one
  <dbl> <dbl>
1  16.6  24.5

Итак, мой вопрос: почему моя пользовательская функция не возвращает набор однострочных фреймов данных со средним значением vs = 0 и vs = 1, и как мне заставить это сделать это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Я рад знакомству.

modelr::permute выдает данные, класс которых «перестановка»

> class(perms[[1]][1][[1]])

[1] "permutation"

permutation класс имеет 3 атрибута

Данные

Данные в этой переменной

столбцы

столбцы, которые вы переставляете

IDX

индексы, указывающие, какие строки были выбраны

я думаю permutation принимает только некоторые виды формул (например, lm и etc .. я не уверен насчет списка формул).

Так что если вы хотите использовать функцию, которую вы хотите, вы должны преобразовать в data.frame / data.table / tibble, как показано ниже

mean_of_vs <- function(df){
   df %>%as.data.frame() %>% group_by(vs) %>% summarize(mean(mpg)) %>% spread(vs, `mean(mpg)`) %>%
     rename(zero = `0`, one = `1`)
}

Затем выполните функцию map без записи ~.

models4 <- map(perms$perm, mean_of_vs)

Тогда вы получите результат


.....

[[97]]

# A tibble: 1 x 2
   zero   one

  <dbl> <dbl>
1  21.4  18.4




[[98]]

# A tibble: 1 x 2
   zero   one

  <dbl> <dbl>
1  20.4  19.7
.....

1 голос
/ 16 мая 2019

Перестановка возвращает тип <S3: permutation>, , а не фрейм данных.

> perms
# A tibble: 1,000 x 2
   perm              .id
   <list>            <chr>
 1 <S3: permutation> 0001
 2 <S3: permutation> 0002
 3 <S3: permutation> 0003
 4 <S3: permutation> 0004
 5 <S3: permutation> 0005
 6 <S3: permutation> 0006
 7 <S3: permutation> 0007
 8 <S3: permutation> 0008
 9 <S3: permutation> 0009
10 <S3: permutation> 0010
# ... with 990 more rows

Изучение показывает, что фрейм данных сохраняется как первый элемент в именованном списке:

> glimpse(perms[[1,1]])
List of 3
 $ data   :'data.frame':    32 obs. of  11 variables:
  ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
  ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
  ..$ disp: num [1:32] 160 160 108 258 360 ...
  ..$ hp  : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
  ..$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
  ..$ wt  : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
  ..$ qsec: num [1:32] 16.5 17 18.6 19.4 17 ...
  ..$ vs  : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
  ..$ am  : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
  ..$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
  ..$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
 $ columns: Named chr "mpg"
  ..- attr(*, "names")= chr "mpg"
 $ idx    : int [1:32] 1 30 21 12 27 14 17 2 15 32 ...
 - attr(*, "class")= chr "permutation"

Итак, чтобы сделать то, что вы хотите, просто получите доступ к элементу data на первом шаге вашей функции mean_of_vs():

mean_of_vs <- function(df) {
  df$data %>% 
    group_by(vs) %>% 
    summarize(mean(mpg)) %>% 
    spread(vs, `mean(mpg)`) %>%
    rename(zero = `0`, one = `1`)
}

Теперь все работает как положено:

> models4 <- map(perms$perm, mean_of_vs)
> models4[[1]]
# A tibble: 1 x 2
   zero   one
  <dbl> <dbl>
1  16.6  24.6
...