我有一个较大的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 model
和ml display
。
我知道,可能性函数在参数的方向上非常平坦,该参数的值在运行时变化,因此 can can 更改也就不足为奇了。但是我不明白为什么会这样,鉴于我的dor文件中似乎几乎没有确定性,而没有通过修复种子来确定性的。
我怀疑排序问题。默认行为是,如果两个观察值具有相同的值,则将随机排序。此外,引导这种排序的随机过程受不同种子的控制。这是有意的,因为它可以防止用户偶然地看到不存在的一致性。逻辑是,困惑比过于自信要好。
正如该答案的评论中提到的某人一样,将选项 stable
添加到我的 sort
命令中使我的情况有所不同。