R语言嵌套for循环存储回归截距系数出现下标越界如何解决
报错原因
- 核心错误是矩阵列索引不匹配:循环变量
i取的是dfs的实际值(15、20、25、30、35),但初始化的beta0_sim/beta1_sim只有5列,合法列索引范围是1~5,直接用15、20这类值作为列号索引必然超出边界。 - 次要问题:
- 变量名不一致:初始化矩阵时用
nsample表示模拟次数,循环内却用了n.sim,两个变量如果没有提前统一赋值会触发报错。 - 误差生成长度错误:
X共5个观测值,生成error时n参数应设为5而非1,否则长度不匹配会导致抽样逻辑不符合预期。 - 系数变量未定义:设定的真实系数是
b0=0.525、b1=1.2625,代码直接调用beta0、beta1会触发对象未找到的报错。
- 变量名不一致:初始化矩阵时用
正确嵌套循环实现
# 统一定义所有固定参数 X <- c(15,20,22,34,25) b0 <- 0.525 b1 <- 1.2625 dfs <- seq(15,35,5) nsim <- 100 # 每个自由度下的模拟次数 # 初始化结果矩阵,列名标记对应的自由度取值,方便后续提取 beta0_sim <- matrix(NA, nrow = nsim, ncol = length(dfs), dimnames = list(NULL, as.character(dfs))) beta1_sim <- matrix(NA, nrow = nsim, ncol = length(dfs), dimnames = list(NULL, as.character(dfs))) # 外层循环遍历自由度的索引,而非自由度本身的取值 for (col_idx in seq_along(dfs)) { current_df <- dfs[col_idx] sig2 <- rchisq(n = 1, df = current_df) # 内层循环跑100次模拟 for (j in 1:nsim) { error <- rnorm(n = length(X), mean = 0, sd = sqrt(sig2)) Y <- b0 + b1 * X + error model <- lm(Y ~ X) # 按列索引存储结果 beta0_sim[j, col_idx] <- model$coefficients[1] beta1_sim[j, col_idx] <- model$coefficients[2] } } # 结果提取示例:获取自由度为25时的100次截距模拟结果 # beta0_sim[, "25"]
内容的提问来源于stack exchange,提问作者zoskybuck
相关产品推荐
相关产品推荐

