R 使用一个数据帧中的值作为另一个数据帧上估计的模型的参数
我希望在一个数据帧中估计模型,但每个模型的公式都有一些来自另一个数据帧的“移动部分”。例如,假设我希望估计以下模型(我无法发布图片,也无法键入乳胶方程式): mpg=a+b*对数(1*drat+2*hp) 其中,w_1和w_2是权重,例如为0.5或1。我使用expand.grid()创建一个权重数据框,然后使用paste()或paste0()对公式进行变异(),并将变量名和权重值传递给lm()函数 然而,估计的模型只是使用权重数据框第一行中的公式。如果我在估计模型之前使用group_by(),就可以解决这个问题 问题是——为什么?为什么第一个代码不起作用?group_by()在这里实现了什么使之成为可能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(),就
库(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
(循环)。