如何让R中用while循环通过lm函数实现13次股票回归的代码正常运行?
修正多股票Fama-French回归的R代码
原代码的问题
- 循环终止条件错误:原代码
i <=13仅能处理3只股票(i=1、6、11),剩余10只股票完全未被处理——因为下一个i值为16,超出13后循环直接终止。 - 列表索引浪费:直接用i作为列表索引会导致列表中存在大量空元素(比如
lm_results[[2]]到lm_results[[5]]都是空值),既不美观也不利于后续操作。
修正后的代码方案
方案一:修正原while循环逻辑
保留原循环结构,调整终止条件和列表索引方式:
df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",") lm_results <- list() count <- 1 i <- 1 # 每5列对应一只股票,13只股票对应i的取值为1,6,...,61 while (i <= 61) { # 第i列是RET,i+1到i+3分别为mktrf、smb、hml lm_results[[count]] <- lm(df[, i] ~ df[, i+1] + df[, i+2] + df[, i+3]) # 为结果命名,方便后续识别对应股票 names(lm_results)[count] <- colnames(df)[i] i <- i + 5 count <- count + 1 }
方案二:用for循环实现(推荐,可读性更强)
通过生成RET列的索引序列,用for循环遍历每只股票:
df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",") lm_results <- list() # 生成所有股票RET列的索引:1,6,11,...,61 ret_indices <- seq(from = 1, to = 61, by = 5) for (idx in seq_along(ret_indices)) { ret_col <- ret_indices[idx] # 对应因子列是RET列索引+1、+2、+3 model <- lm(df[, ret_col] ~ df[, ret_col+1] + df[, ret_col+2] + df[, ret_col+3]) lm_results[[idx]] <- model # 为结果命名 names(lm_results)[idx] <- colnames(df)[ret_col] }
方案三:基于列名规律的优雅实现(如果列名有统一规则)
假设每只股票的列名遵循StockX_RET、StockX_mktrf、StockX_smb、StockX_hml的格式,可以直接通过列名构建模型:
df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",") lm_results <- list() # 提取所有股票的编号(从列名中剥离) stock_ids <- unique(sub("_.*", "", colnames(df))) for (id in stock_ids) { # 拼接对应列名 ret_col <- paste0(id, "_RET") mktrf_col <- paste0(id, "_mktrf") smb_col <- paste0(id, "_smb") hml_col <- paste0(id, "_hml") # 构建回归公式 formula_str <- paste(ret_col, "~", mktrf_col, "+", smb_col, "+", hml_col) model <- lm(formula_str, data = df) lm_results[[id]] <- model }
结果查看
- 查看单只股票的回归结果:
summary(lm_results[[1]])(替换数字为对应股票的索引或名称) - 批量查看所有结果:
lapply(lm_results, summary)
内容的提问来源于stack exchange,提问作者igm13
相关产品推荐
相关产品推荐

