R语言while循环使用方法及变量e未更新问题排查
问题分析与解决方案
核心问题
你的循环条件写反了。初始计算的e值约为0.0316(大于设定的阈值0.01),而你写的while (e <= 0.01)意味着只有当e小于等于0.01时才会执行循环体——这直接导致循环从未启动,e自然保持初始值不变。
你的需求是通过增加样本量n,让标准误e降低到0.01以下,因此循环条件应该改为while (e > 0.01):当e还未达标时,持续调整样本量。
修正后的代码
set.seed(123) d = 0.01 n <- 1000 x <- rnorm(n) s <- sd(x) e <- s/sqrt(n) while (e > 0.01) { # 修正循环条件 n <- n + 1 x <- c(x, rnorm(1)) s <- sd(x) e <- s/sqrt(n) } n
额外优化建议
每次用c(x, rnorm(1))扩展向量的效率很低(尤其是当n增长到很大时,每次都要复制整个向量)。可以用递推公式直接更新均值和标准差,无需保存整个样本向量,大幅提升效率:
set.seed(123) d = 0.01 n <- 1000 x <- rnorm(n) m <- mean(x) s <- sd(x) e <- s/sqrt(n) while (e > 0.01) { n <- n + 1 new_x <- rnorm(1) # 递推更新均值 m <- m + (new_x - m)/n # 递推更新样本标准差 s <- sqrt( ((n-2)*s^2 + (new_x - m)^2*(n-1)/n) / (n-1) ) e <- s/sqrt(n) } n
内容的提问来源于stack exchange,提问作者Jennifer Cuellar Castrillon
相关产品推荐
相关产品推荐

