我在一个相当复杂的模型中使用了以下似然函数(实际上是对数刻度):
library(plyr)
dcustom=function(x,sd,L,R){
R. = (log(R) - log(x))/sd
L. = (log(L) - log(x))/sd
ll = pnorm(R.) - pnorm(L.)
return(ll)
}
df=data.frame(Range=seq(100,500),sd=rep(0.1,401),L=200,U=400)
df=mutate(df, Likelihood = dcustom(Range, sd,L,U))
with(df,plot(Range,Likelihood,type='l'))
abline(v=200)
abline(v=400)
在这个函数中,sd 是预先确定的,L 和 R 是“观察值”(非常类似于均匀分布的端点),因此给出了所有 3 个。如果模型估计 x(派生参数)在 LR 范围之间,则上述函数提供了很大的似然性(1),在边界附近(其锐度取决于 sd)平滑似然下降(在 0 和 1 之间) , 如果外面太多,则为 0。
这个函数可以很好地获得 x 的估计值,但现在我想做相反的事情:从上面的函数中绘制一个随机 x。如果我多次这样做,我会生成一个直方图,它遵循上面绘制的曲线的形状。
最终目标是在 C++ 中做到这一点,但我认为如果我能先弄清楚如何在 R 中做到这一点,对我来说会更容易。
网上有一些有用的信息可以帮助我开始(http://matlabtricks.com/post-44/generate-random-numbers-with-a-given-distribution,https://stats.stackexchange.com/questions/88697/ sample-from-a-custom-continuous-distribution-in-r)但我仍然不完全确定如何去做以及如何编码。
我想(完全不确定!)步骤是:
- 将似然函数转换为概率分布
- 计算累积分布函数
- 逆变换采样
这是正确的,如果是这样,我该如何编码?谢谢你。