相同的do-file,相同的计算机,有时结果不同

  • 本文关键字:结果 计算机 do-file stata
  • 更新时间 :
  • 英文 :


我有一个较大的do-file,它调用了几个子文件,这全都是对自定义最大似然模型的估计。也就是说,我有一个main.do,看起来像这样

version 12
set seed 42
do prepare_data
* some other stuff
do estimate_ml

和estimate_ml.do看起来像

* lots of other stuff
global cdf "normal"
program define customML
    args lnf r noise
    tempvar prob1l prob2l prob1r prob2r y1l y2l y1r y2r euL euR euDiff scale
    quietly {
        generate double `prob1l' = $ML_y2
        generate double `prob2l' = $ML_y3
        generate double `prob1r' = $ML_y4
        generate double `prob2r' = $ML_y5
        generate double `scale' = 1/100
        generate double `y1l' = `scale'*((($ML_y10+$ML_y6)^(1-`r'))/(1-`r'))
        generate double `y2l' = `scale'*((($ML_y10+$ML_y7)^(1-`r'))/(1-`r'))
        generate double `y1r' = `scale'*((($ML_y10+$ML_y8)^(1-`r'))/(1-`r'))
        generate double `y2r' = `scale'*((($ML_y10+$ML_y9)^(1-`r'))/(1-`r'))
        generate double `euL' = (`prob1l'*`y1l')+(`prob2l'*`y2l')
        generate double `euR' = (`prob1r'*`y1r')+(`prob2r'*`y2r')
        generate double `euDiff' = (`euR'-`euL')/`noise'
        replace `lnf' = ln($cdf( `euDiff')) if $ML_y1==1
        replace `lnf' = ln($cdf(-`euDiff')) if $ML_y1==0
    }
end
ml model lf customML ... , maximize technique(nr) difficult cluster(id)
ml display

令我惊讶的是,当我在Stata 12/se中从上到下运行整个内容时,每次运行时,ml display报告的系数之一都会获得不同的结果。

首先,我认为这是在不同计算机上运行相同代码的问题,但是即使我多次在同一台计算机上运行相同的代码,也会出现问题。然后,我认为这是一个随机数生成器问题,但是,如您所见,即使我在主要do-file的开头修复了种子,我也可以重现该问题。当我将set seed命令移动到ml model...上方上方时,也有同样的保留。获得相同结果的唯一方法是多次运行是我在ml model上方运行所有内容,然后仅重复运行ml modelml display

我知道,可能性函数在参数的方向上非常平坦,该参数的值在运行时变化,因此 can can 更改也就不足为奇了。但是我不明白为什么会这样,鉴于我的dor文件中似乎几乎没有确定性,而没有通过修复种子来确定性的。

我怀疑排序问题。默认行为是,如果两个观察值具有相同的值,则将随机排序。此外,引导这种排序的随机过程受不同种子的控制。这是有意的,因为它可以防止用户偶然地看到不存在的一致性。逻辑是,困惑比过于自信要好。

正如该答案的评论中提到的某人一样,将选项 stable添加到我的 sort命令中使我的情况有所不同。