Я хочу оценить модели в одном кадре данных, но в формуле для каждой модели есть несколько «движущихся частей», которые происходят из другого кадра данных.Например, скажем, я хочу оценить следующую модель (я не могу опубликовать изображение и не нашел способа ввести латексные уравнения): 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