R中将字符变量作为另一数据框变量,计算多组lm回归的条件统计值
实现方案
你现有代码中lm(reformulate(outcomes, covars), data = dataset)存在参数颠倒问题:reformulate()的第一个参数为自变量列表,第二个为因变量名,修正后才能得到正确的回归结果。
接下来分两种需求场景实现:
场景1:按当前行对应的自变量取值条件计算
即每一行统计的是当前covars列对应的变量取0时,对应样本预测值的均值/标准差:
library(tidyverse) library(broom) dataset <- tibble( y1=rnorm(n=100), y2=rnorm(n=100), x1=rnorm(n=100), x2=rnorm(n=100), ) outcomes <- dataset %>% select(y1,y2) %>% colnames covars <- dataset %>% select(x1,x2) %>% colnames paramlist <- expand_grid(outcomes, covars) # 完整计算逻辑 result <- paramlist %>% rowwise %>% mutate( # 修正公式:covars为自变量,outcomes为因变量 mod = list(lm(reformulate(covars, outcomes), data = dataset)), res = list(broom::tidy(mod)), predicted=list(predict(mod)), data=list(cbind(dataset,predicted)), # 新增:当前covars取0时的预测值均值、标准差 mean_pred_at_covar0 = mean(filter(data, .data[[covars]] == 0)$predicted, na.rm = T), sd_pred_at_covar0 = sd(filter(data, .data[[covars]] == 0)$predicted, na.rm = T) )
场景2:固定处理变量(如统一用x1为处理变量)
所有行都统计x1=0时样本预测值的均值/标准差,仅需修改取值的变量名即可:
result <- paramlist %>% rowwise %>% mutate( mod = list(lm(reformulate(covars, outcomes), data = dataset)), res = list(broom::tidy(mod)), predicted=list(predict(mod)), data=list(cbind(dataset,predicted)), # 固定取x1=0的统计量 mean_pred_at_x1_0 = mean(filter(data, x1 == 0)$predicted, na.rm = T), sd_pred_at_x1_0 = sd(filter(data, x1 == 0)$predicted, na.rm = T) )
更高效的精简实现
如果不需要存储全量预测值和原始数据,可直接基于模型对指定条件做预测,节省内存开销:
result <- paramlist %>% rowwise %>% mutate( mod = list(lm(reformulate(covars, outcomes), data = dataset)), res = list(broom::tidy(mod)), # 直接预测covars取0时的均值,不需要提前计算所有样本预测值 mean_pred_at_covar0 = predict(mod, newdata = tibble(!!covars := 0))[[1]] )
内容的提问来源于stack exchange,提问作者PaulB
相关产品推荐
相关产品推荐

