У меня есть следующая функция правдоподобия, которую я использовал в довольно сложной модели (на практике в логарифмическом масштабе):
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 из них. Вышеупомянутая функция обеспечивает большую вероятность (1), если оценка модели x (производный параметр) находится между диапазоном LR, плавное уменьшение правдоподобия (от 0 до 1) около границ (из которых резкость зависит от sd) , и 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), но я Я все еще не совсем уверен, как это делать и как это кодировать.
Я предполагаю (совсем не уверен!) Шаги следующие:
- преобразовать функцию правдоподобия в распределение вероятностей
- вычислить кумулятивную функцию распределения
- выборка с обратным преобразованием
Это правильно, и если да, то как мне это закодировать? Спасибо.