我有一个大的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文件中似乎没有什么确定性,并且通过修复种子没有任何不能确定的东西。
答案 0 :(得分:2)
我怀疑排序存在问题。默认行为是,如果两个观察值具有相同的值,则它们将随机排序。而且,指导这种分类的随机过程由不同的种子控制。这是故意的,因为它可以防止用户偶然发现不存在的一致性。逻辑是,最好是感到困惑而不是过于自信。
答案 1 :(得分:0)
正如this answer的评论中提到的那样,在我的stable
命令中添加选项sort
会对我的情况产生影响。