R의 Metropolis 알고리즘을 사용하여 이변 량 밀도 에서 시뮬레이션을 시도했지만 운이 없었습니다. 밀도는 로 표현할 수 있습니다 . 여기서 는 Singh-Maddala 분포입니다
매개 변수 , , 및 는 log-mean을 의 분수로 사용하여 log-normal 이며 log-sd 상수입니다. 내 샘플이 원하는 샘플인지 테스트하기 위해 의 한계 밀도를 살펴 보았습니다 . 이는 여야합니다 . R 패키지 MCMCpack, mcmc 및 dream과 다른 Metropolis 알고리즘을 시도했습니다. 번인 (burn-in)을 폐기하고, 얇게하고, 최대 백만 크기의 샘플을 사용했지만 결과로 얻은 한계 밀도는 결코 내가 제공 한 것입니다.
내가 사용한 코드의 최종판은 다음과 같습니다.
logvrls <- function(x,el,sdlog,a,scl,q.arg) {
if(x[2]>0) {
dlnorm(x[1],meanlog=el*log(x[2]),sdlog=sdlog,log=TRUE)+
dsinmad(x[2],a=a,scale=scl,q.arg=q.arg,log=TRUE)
}
else -Inf
}
a <- 1.35
q <- 3.3
scale <- 10/gamma(1 + 1/a)/gamma(q - 1/a)* gamma(q)
Initvrls <- function(pars,nseq,meanlog,sdlog,a,scale,q) {
cbind(rlnorm(nseq,meanlog,sdlog),rsinmad(nseq,a,scale,q))
}
library(dream)
aa <- dream(logvrls,
func.type="logposterior.density",
pars=list(c(0,Inf),c(0,Inf)),
FUN.pars=list(el=0.2,sdlog=0.2,a=a,scl=scale,q.arg=q),
INIT=Initvrls,
INIT.pars=list(meanlog=1,sdlog=0.1,a=a,scale=scale,q=q),
control=list(nseq=3,thin.t=10)
)
수렴이 될 때까지 샘플링하기 때문에 꿈 꾸러미에 정착했습니다. 세 가지 방법으로 올바른 결과가 있는지 테스트했습니다. KS 통계를 사용하여 Quantile을 비교하고 Singh-Maddala 분포의 모수를 결과 표본으로부터 최대한으로 추정합니다.
ks.test(as.numeric(aa$Seq[[2]][,2]),psinmad,a=a,scale=scale,q.arg=q)
lsinmad <- function(x,sample)
sum(dsinmad(sample,a=x[1],scale=x[2],q.arg=x[3],log=TRUE))
optim(c(2,20,2),lsinmad,method="BFGS",sample=aa$Seq[[1]][,2])
qq <- eq(0.025,.975,by=0.025)
tst <- cbind(qq,
sapply(aa$Seq,function(l)round(quantile(l[,2],qq),3)),
round(qsinmad(qq,a,scale,q),3))
colnames(tst) <- c("Quantile","S1","S2","S3","True")
library(ggplot2)
qplot(x=Quantile,y=value,
data=melt(data.frame(tst),id=1),
colour=variable,group=variable,geom="line")
이러한 비교 결과를 볼 때 KS 통계는 표본이 제공된 모수를 가진 Singh-Maddala 분포에서 추출한 귀무 가설을 거의 항상 기각합니다. 최대 가능성 추정 매개 변수는 때때로 실제 값에 가깝지만 샘플링 절차가 성공적으로 완료 될 수 없을 정도로 일반적으로 안락 영역을 벗어납니다. Quantile을 위해, 경험적 Quantile은 너무 멀지 않지만 너무 멀다.
내 질문은 내가 뭘 잘못하고 있니? 내 자신의 가설 :
- 이 유형의 샘플링에는 MCMC가 적합하지 않습니다.
- 이론적 인 이유로 MCMC가 수렴 할 수 없습니다 (배포 함수가 필요한 특성을 충족하지 않음)
- 메트로폴리스 알고리즘을 올바르게 사용하지 않습니다
- 독립 표본이 없기 때문에 분포 테스트가 올바르지 않습니다.
dsinmad
세 가지 매개 변수를 사용하거나 내가 뭔가를 놓친 거지.