R语言实现数据集两两列组合应用线性回归模型的问题
现有实现的合理性
你提供的代码是可行的,能够成功拟合所有交易对两两组合的线性回归模型,结果以列表形式返回。但存在两个可优化的空间:
- 输出结果仅为模型列表,没有与对应的因变量、自变量配对,后续提取R方、p值等统计量时,很难对应到具体的交易对组合
- 默认包含了
y=x的无意义自回归结果,这类回归的R方恒为1,没有实际分析价值
原始代码报错原因
你最初尝试的代码报错有两个核心原因:
lm()函数要求第一个输入为公式对象,直接传入字符串类型的公式不会被自动识别- 多余的
group_by操作加上结构不匹配的返回值:你试图将summary(lm(...)$r.squared)的结果存入普通列,结构不兼容导致报错
更优的嵌套列实现方案
推荐使用嵌套列的方式将所有回归相关信息(自变量、因变量、公式、模型、统计量)统一存储在同一个数据框中,方便后续批量处理:
依赖包
需要提前加载以下包:
library(tidyverse) library(broom) # 用于将模型结果转换为结构化数据框
实现代码
reg_result <- expand.grid(y = colnames(dat), x = colnames(dat), KEEP.OUT.ATTRS = FALSE) %>% filter(y != x) %>% # 可选:过滤无意义的自回归组合 rowwise() %>% mutate( # 生成公式对象存入列表列 formula = list(as.formula(paste(y, "~", x))), # 拟合模型存入嵌套列 model = list(lm(formula[[1]], data = dat)), # 直接提取常用统计量 r_squared = summary(model[[1]])$r.squared, # 提取系数、标准误、p值等指标 coef_details = list(tidy(model[[1]])), # 提取模型整体拟合指标 fit_details = list(glance(model[[1]])) ) %>% ungroup()
常用操作示例
- 查看所有组合的R方:
reg_result %>% select(y, x, r_squared)
- 提取指定组合的系数与p值:
reg_result %>% filter(y == "BNBBTC", x == "ETCBTC") %>% pull(coef_details) %>% .[[1]]
- 将所有系数展开为普通数据框:
reg_result %>% unnest(coef_details)
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

