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
相关产品推荐
相关产品推荐

