R语言中for循环遇NA结果时如何重跑当前迭代?
问题修正方案
核心问题是:for循环的迭代序列是预先确定的,直接修改迭代变量c无法实现重跑当前迭代的需求。以下是具体修正方案:
关键修改思路
把单次迭代的所有逻辑封装进repeat循环内,当得到的final_boot1不含NA时,退出repeat循环并保存结果;若结果出现NA,则自动重新执行当前迭代的全部步骤(重新生成扰动项、重新执行凸优化),直到得到有效结果为止。
修正后的完整代码
library(CVXR) # 移除多余的点号 B=50 # Bootstrap迭代次数 beta_bootstrap = matrix(NA,B,p) # 存储B次Bootstrap估计结果 for(c in 1:B) { repeat { # 新增repeat循环,实现当前迭代重跑逻辑 # 重新生成Exp(1)扰动项 G_boot = matrix(NA,1,n) for (j in 1:n) { G_boot[1,j]= rexp(1,1) } # 定义CVXR优化变量与目标函数 v3 = CVXR::Variable(p) penalty_boot = (p_norm(v3,1))*lambda_opt # L1惩罚项 zz= t(y*G_boot) l1= -sum((z%*%v3)*zz) zz1= as.matrix(y-P_tilde) l2= sum((z%*%v3)*zz1) zz2= t(G_boot) l3 = sum((logistic(z%*%v3))*zz2) obj_boot = penalty_boot+l1+l2+l3 prob_boot = Problem(Minimize(obj_boot)) # 求解凸优化问题 resultB = solve(prob_boot) final_boot1 = as.vector(resultB$getValue(v3)) # 检查结果有效性,有效则退出repeat循环 if(!any(is.na(final_boot1))) { break } # 结果无效时自动重新执行repeat内的全部代码 } # 将有效结果存入矩阵 beta_bootstrap[c,] = final_boot1 } beta_bootstrap # 用于构建Bootstrap百分位数区间
关键修改说明
- 新增
repeat循环包裹单次迭代逻辑,确保结果NA时自动重跑当前迭代,直到获得有效结果。 - 移除原代码中无效的
c=c-1和next操作——for循环的迭代变量是只读的,手动修改不会改变循环的推进顺序。 - 简化结果存储步骤:
final_boot1已是向量,可直接赋值给矩阵行,无需多余转置操作。
内容的提问来源于stack exchange,提问作者Mayukh Choudhury
相关产品推荐
相关产品推荐

