You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:36:04