同样的文件,同一台计算机,有时结果不同

时间:2014-01-24 16:10:29

标签: stata

我有一个大的do文件,它调用几个子文件,所有这些都是在估计自定义最大似然模型的前提下。也就是说,我有一个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时,我会得到set seed报告的系数之一的不同结果。

起初我认为这是在不同计算机上运行相同代码的问题,但即使我多次在同一台机器上运行相同的代码,也会出现问题。然后我认为这是一个随机数生成器问题但是,正如您所看到的,即使我在主do文件的开头修复种子,我也可以重现该问题。当我在ml model...上方移动ml model命令时,同样如此。通过多次运行获得相同结果的唯一方法是,如果我运行ml model以上的所有内容,然后重复运行ml display和{{1}}。

我知道似然函数函数在参数的方向上非常平坦,其值会随着运行而变化,因此可以更改也就不足为奇了。但我不明白为什么会这样,因为在我的do文件中似乎没有什么确定性,并且通过修复种子没有任何不能确定的东西。

2 个答案:

答案 0 :(得分:2)

我怀疑排序存在问题。默认行为是,如果两个观察值具有相同的值,则它们将随机排序。而且,指导这种分类的随机过程由不同的种子控制。这是故意的,因为它可以防止用户偶然发现不存在的一致性。逻辑是,最好是感到困惑而不是过于自信。

答案 1 :(得分:0)

正如this answer的评论中提到的那样,在我的stable命令中添加选项sort会对我的情况产生影响。