R 使用一个数据帧中的值作为另一个数据帧上估计的模型的参数

R 使用一个数据帧中的值作为另一个数据帧上估计的模型的参数,r,dplyr,R,Dplyr,我希望在一个数据帧中估计模型,但每个模型的公式都有一些来自另一个数据帧的“移动部分”。例如,假设我希望估计以下模型(我无法发布图片,也无法键入乳胶方程式): mpg=a+b*对数(1*drat+2*hp) 其中,w_1和w_2是权重,例如为0.5或1。我使用expand.grid()创建一个权重数据框,然后使用paste()或paste0()对公式进行变异(),并将变量名和权重值传递给lm()函数 然而,估计的模型只是使用权重数据框第一行中的公式。如果我在估计模型之前使用group_by(),就

我希望在一个数据帧中估计模型,但每个模型的公式都有一些来自另一个数据帧的“移动部分”。例如,假设我希望估计以下模型(我无法发布图片,也无法键入乳胶方程式): mpg=a+b*对数(1*drat+2*hp)

其中,w_1和w_2是权重,例如为0.5或1。我使用expand.grid()创建一个权重数据框,然后使用paste()或paste0()对公式进行变异(),并将变量名和权重值传递给lm()函数

然而,估计的模型只是使用权重数据框第一行中的公式。如果我在估计模型之前使用group_by(),就可以解决这个问题

问题是——为什么?为什么第一个代码不起作用?group_by()在这里实现了什么使之成为可能

库(tidyverse)

汽车我们可以按行添加

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

我们可以按行添加

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

在你的变种中使用sapply。摘要/lm未矢量化

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))

在你的变种中使用sapply。摘要/lm未矢量化

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))

当我试图解决我原来的问题时,我看到rowwise()和group_by()给出了相同的解决方案。我还是不明白为什么。例如,当我改变公式_权重时,dplyr“知道”这是行的。那么,为什么使用lm和formula=formula_权重需要我显式地告诉它rowwise()?@ArielKarlinsky这与mutate的工作方式有关。通常,它对向量(例如列)起作用。因此,它希望使用向量(其他列)作为输入,并应用向量化的函数(例如,逐元素工作)和相同长度的返回向量。通过将此计算拆分为多个组,以便在每个组中独立执行计算。在每个组中,您仍然需要以矢量化的方式工作-但是如果组的大小为1(例如行),那么这并不重要。与我试图解决原始问题时的基函数ave()相比,我发现rowwise()和group_by()给出了相同的解决方案。我还是不明白为什么。例如,当我改变公式_权重时,dplyr“知道”这是行的。那么,为什么使用lm和formula=formula_权重需要我显式地告诉它rowwise()?@ArielKarlinsky这与mutate的工作方式有关。通常,它对向量(例如列)起作用。因此,它希望使用向量(其他列)作为输入,并应用向量化的函数(例如,逐元素工作)和相同长度的返回向量。通过将此计算拆分为多个组,以便在每个组中独立执行计算。在每个组中,您仍然需要以矢量化的方式工作-但是如果组的大小为1(例如行),那么这并不重要。与基本函数ave()相比,
sapply
类似于使用
map
(循环)。
sapply
类似于使用
map
(循环)。