You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:45:03