R中split生成的列表如何通过循环变量i正确调用元素进行回归分析
问题原因
你调用split生成的列表元素的写法是错误的。
R中$运算符后的内容会被解析为固定字符串,你写的X$i``不会读取循环变量i的取值,而是固定查找列表X中名为i的元素。因为你的列表X中不存在该元素,$运算符会返回NULL,此时lm的data参数为NULL时会自动从全局环境中查找a、b、c变量,也就是你最开始定义的那套固定的a = rnorm(300,10,5)等数据,所以每次循环跑的都是完全相同的回归,才会出现所有系数完全一致的异常结果。
修复方案
把列表元素的访问方式改为双括号索引即可,两种可行写法:
- 按列表位置索引(推荐,写法更简洁):直接用
X[[i]]访问第i个迭代的数据集 - 按列表名称索引:如果需要严格匹配iteration的名称,用
X[[as.character(i)]]
修复后的循环代码如下:
results_1 <- list() for (i in 1:100){ # 替换原来的X$`i`为X[[i]]即可 model_i <- lm(a ~ b + c, data = X[[i]]) coeff_i = model_i$coefficients results_1[[i]] <- coeff_i } results_df_1 <- do.call(rbind.data.frame, results_1)
可选优化写法
你不需要先拆分数据集再循环回归,直接用dplyr的分组拟合逻辑可以一步得到结果,代码更简洁:
library(dplyr) results_df_1 <- results_df %>% group_by(iteration) %>% summarise( intercept = coef(lm(a ~ b + c))[1], b_coef = coef(lm(a ~ b + c))[2], c_coef = coef(lm(a ~ b + c))[3] )
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

