拆分R语言Find_N函数后计算结果不一致,求原因分析
代码结果不一致的原因分析
以下是改写后的代码与原代码的核心差异,正是这些错误导致结果不同:
1. 变量名错误,导致使用未赋值的初始值
- 原代码中存储最优C值的变量是
CC,改写后却将计算出的optimal.C赋值给了未初始化的CC1,后续计算期望样本量时,仍然从初始全0的CC中取值(C <- CC[n1]),这相当于用0替代了正确的optimal.C,完全偏离原逻辑。 - 原代码中存储期望样本量的变量是
expected.n,改写后却赋值给了未初始化的expected.n1,最后寻找最小值时调用的还是初始全0的expected.n,自然得到错误的最优N。
2. mu1参数传递错误
- 原代码调用
get.C时,传入的mu1是mu0-delta.mu.H0,而改写后的代码中,计算optimal.C对应的prob.within时,直接写了mu0,mu1,但改写后的Find_N函数内并未定义mu1,会导致使用全局环境中的mu1(如果存在)或报错,与原逻辑中用mu0-delta.mu.H0的要求不符。 - 原代码调用
get.En时,传入的mu1是mu0,改写后的代码中第二部分计算prob.within时同样未正确指定mu1=mu0,进一步偏离原逻辑。
3. 重复模拟引入随机差异(次要)
原代码中get.C和get.En各自调用get.prob.within,改写后的代码也保留了两次调用,但由于get.prob.within涉及模拟(n.sim参数),两次调用会产生不同的随机结果,这会导致结果与原代码存在细微差异(不过这是次要问题,核心错误还是前两点)。
修正后的改写代码示例
Find_N <- function(n,mu0,delta.mu.H0,cv0,cv1,cv2,n.sim) { alpha.fcr <- 0.025 CC <- rep(0,n) expected.n <- rep(0,n) increase <- rep(0,n) for (n1 in 11:(n-11)) { print(n1) # 对应原get.C逻辑,正确传递mu1参数 prob.within <- get.prob.within(n1, mu0=mu0, mu1=mu0-delta.mu.H0, cv0=cv0, cv1=cv1, n.sim=n.sim) ind.optimal.C <- binary_search(prob.within, alpha.fcr) optimal.C <- C.set[ind.optimal.C] CC[n1] <- optimal.C # 赋值给正确的CC变量 # 对应原get.En逻辑,正确传递mu1参数,使用刚计算的CC[n1] prob.within <- get.prob.within(n1, mu0=mu0, mu1=mu0, cv0=cv0, cv1=cv1, n.sim=n.sim) C <- CC[n1] alpha <- mean(prob.within>C) expected.n[n1] <- n1*alpha+(1-alpha)*n # 赋值给正确的expected.n变量 } optimal.N <- seq(11, n-11)[which.min(expected.n[11:(n-11)])] # 修正seq的上限,避免依赖循环最后一次n1 return(list(optimal.N)) }
内容的提问来源于stack exchange,提问作者Lili
相关产品推荐
相关产品推荐

