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

R语言中为简单线性回归设计循环的问题求解

问题需求

针对12个行业(AUTO、IT、REALTY、BANK、ENERGY、FINANCIAL SERVICES、FMCG、INFRASTRUCTURE、SERVICES、MEDIA、METAL、PHARMA)的日股票收益率,执行如下形式的简单线性回归:

Sector ~ Beta_0 + Beta_1*absMkt + Beta_2*sqMkt

其中Beta_0为截距项,Beta_1为绝对市场收益率(absMkt)的系数,Beta_2为市场收益率平方项(sqMkt)的系数。要求为每个行业单独运行回归,仅提取对应p值小于0.05的Beta_1和Beta_2并存储。

原代码存在的问题
  • 嵌套循环冗余:原代码使用双层for循环并添加i != j判断,完全没必要——只需为每个行业(共12个)单独跑一次回归,单层循环足够。
  • 变量定义混乱:
    • 提前定义的Beta_1、Beta_2等为1行12列矩阵,但循环中误用二维索引[i,j],逻辑错误。
    • 代码中未定义的p_0、Beta_0变量直接赋值,会触发报错。
  • 变量对应错误:原代码将absMkt的p值存入p_0、系数存入Beta_0,与需求中要提取的Beta_1(对应absMkt)、Beta_2(对应sqMkt)混淆。
修正后的R代码
# 读取数据
Returns <- read.csv("Week_1_CSV.CSV", header = TRUE, stringsAsFactors = FALSE)

# 拆分行业收益率和市场相关变量(absMkt、sqMkt)
Sector_Returns <- Returns[, 2:13]
absMkt <- Returns[, 14]
sqMkt <- Returns[, 15]

# 获取行业数量与名称
nc <- ncol(Sector_Returns)
sector_names <- colnames(Sector_Returns)

# 初始化结果存储数据框:关联行业名称与显著系数
result_df <- data.frame(
  Sector = sector_names,
  Beta_1 = NA,
  Beta_2 = NA,
  stringsAsFactors = FALSE
)

# 遍历每个行业运行回归
for (i in 1:nc) {
  # 拟合回归模型
  model <- lm(Sector_Returns[, i] ~ absMkt + sqMkt)
  # 提取系数汇总表(含p值)
  coef_summary <- coef(summary(model))
  
  # 保留absMkt的显著系数(p<0.05)
  if (coef_summary["absMkt", "Pr(>|t|)"] < 0.05) {
    result_df$Beta_1[i] <- coef_summary["absMkt", "Estimate"]
  }
  
  # 保留sqMkt的显著系数(p<0.05)
  if (coef_summary["sqMkt", "Pr(>|t|)"] < 0.05) {
    result_df$Beta_2[i] <- coef_summary["sqMkt", "Estimate"]
  }
}

# 输出结果
print(result_df)
代码说明
  • 用数据框存储结果,直观关联行业名称与对应的显著系数,便于后续查看和处理。
  • 移除冗余嵌套循环,仅用单层循环遍历12个行业,逻辑清晰高效。
  • 直接使用变量名构建回归公式,可读性更强,避免矩阵索引的混淆。
  • 未通过显著性检验(p≥0.05)的系数保留为NA,明确区分显著与不显著结果。

内容的提问来源于stack exchange,提问作者Abhishek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:05:22