Использование значений в одном кадре данных в качестве аргументов для модели, оцененной на другом кадре данных - PullRequest
1 голос
/ 17 апреля 2019

Я хочу оценить модели в одном кадре данных, но в формуле для каждой модели есть несколько «движущихся частей», которые происходят из другого кадра данных.Например, скажем, я хочу оценить следующую модель (я не могу опубликовать изображение и не нашел способа ввести латексные уравнения): mpg = a + b * log (w_1 * drat + w_2 * hp)

где w_1 и w_2 - веса, которые, например, равны 0,5 или 1. Я использую expand.grid () для создания массива данных, а затем мутирую () формулу, используя paste () или paste0 () с именами переменных изначение весов, а затем передать его в функцию lm ().

Однако расчетная модель использует только формулу, найденную в первой строке кадра данных весов.Это решается, если я использую group_by () перед оценкой моделей.

Вопрос - почему?почему не работает первый код?что достигается здесь group_by (), что делает это возможным?

library(tidyverse)
cars <- mtcars

w <- seq(from=0.5, to=1, by=0.5)
weights <- as_tibble(expand.grid(w1=w,w2=w))


#Doesn't work - the lm model is fit using the formula from the first row only
weights %>%
  mutate(formula_weights = paste0("mpg~log(",w1,"*drat+",w2,"*hp)")) %>%
  mutate(r2 = summary(lm(data=cars, formula = formula_weights))$r.squared)

#Does work - model is fit using the w1 and w2 values from each row (formula_weights)
weights %>%
  mutate(formula_weights = paste0("mpg~log(",w1,"*drat+",w2,"*hp)")) %>%
  group_by(formula_weights) %>%
  mutate(r2 = summary(lm(data=cars, formula = formula_weights))$r.squared)

Вывод без group_by ():

# A tibble: 4 x 4
     w1    w2 formula_weights             r2
  <dbl> <dbl> <chr>                    <dbl>
1   0.5   0.5 mpg~log(0.5*drat+0.5*hp) 0.715
2   1     0.5 mpg~log(1*drat+0.5*hp)   0.715
3   0.5   1   mpg~log(0.5*drat+1*hp)   0.715
4   1     1   mpg~log(1*drat+1*hp)     0.715

Вывод с group_by ():

# A tibble: 4 x 4
# Groups:   formula_weights [4]
     w1    w2 formula_weights             r2
  <dbl> <dbl> <chr>                    <dbl>
1   0.5   0.5 mpg~log(0.5*drat+0.5*hp) 0.715
2   1     0.5 mpg~log(1*drat+0.5*hp)   0.709
3   0.5   1   mpg~log(0.5*drat+1*hp)   0.718
4   1     1   mpg~log(1*drat+1*hp)     0.715

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

используйте sapply внутри вашего мутирования. резюме / лм не векторизовано

weights %>%
mutate(formula_weights = paste0("mpg~log(",w1,"*drat+",w2,"*hp)")) %>%
mutate(r2 = sapply(formula_weights,
                   function(fw) summary(lm(data=cars, formula =))$r.squared))
0 голосов
/ 17 апреля 2019

Мы можем добавить rowwise

library(dplyr)
weights %>%
  mutate(formula_weights = paste0("mpg~log(",w1,"*drat+",w2,"*hp)")) %>% 
  rowwise() %>%
  mutate(r2 = summary(lm(data=cars, formula = formula_weights))$r.squared)
#Source: local data frame [4 x 4]
#Groups: <by row>

# A tibble: 4 x 4
#     w1    w2 formula_weights             r2
#  <dbl> <dbl> <chr>                    <dbl>
#1   0.5   0.5 mpg~log(0.5*drat+0.5*hp) 0.715
#2   1     0.5 mpg~log(1*drat+0.5*hp)   0.709
#3   0.5   1   mpg~log(0.5*drat+1*hp)   0.718
#4   1     1   mpg~log(1*drat+1*hp)     0.715

Или используйте map

library(purrr)
weights %>%
     mutate(r2 = map_dbl(paste0("mpg~log(",w1,"*drat+",w2,"*hp)"), ~ 
                    summary(lm(data = cars, formula =  .x))$r.squared))
# A tibble: 4 x 3
#     w1    w2    r2
#   <dbl> <dbl> <dbl>
#1   0.5   0.5 0.715
#2   1     0.5 0.709
#3   0.5   1   0.718
#4   1     1   0.715
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...