- こちらの続き
- を共有する標準正規分布に従う個の確率変数の同時分布を考える
- :標準正規分布に従う確率変数
- :が従う確率密度分布(いずれも標準正規分布)
- :の確率(累積)分布
- はの相関係数行列である
- なるがあり
- :の下でのの同時確率分布
-
- 任意の分布に従う、複数の確率変数の同時分布を考える
- :確率変数の数
- :確率変数
- :が従う確率密度分布
- :の確率(累積)分布
- :の相関係数行列
- :の下でのの同時確率分布
- ととの関係
- ととの関係を用いてを表す
- ずいぶんと簡単な式になったけれど、大丈夫だろうか…(未検算)
- 大丈夫そうなソース
- 正規分布・均一分布・指数分布・カイ二乗分布を例にそれらを組み合わせた複数の確率変数について実装してみた
MultiDistCorrelated<-function(k,xs,Dtypes,ArgsList,R){
if(!is.matrix(xs))xs<-matrix(xs,nrow=1)
Re = sin(pi*R/2)
Re.e=eigen(Re)
if(min(Re.e[[1]])<0){
print("Non-positive eigenvalue(s)!")
print("Calculation was forced by non-zero eigenvalue(s) to 0.000000001.")
}
Re.e.ori=Re.e
Re.e[[1]][Re.e[[1]]<0]=0.000000001
ys.el<-xs
Ds<-matrix(0,length(xs[,1]),k)
for(i in 1:k){
if(Dtypes[i]==1){
ys.el[,i]<-qnorm(pnorm(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2]))
Ds[,i]<-dnorm(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2],log=TRUE)
}else if(Dtypes[i]==2){
ys.el[,i]<-qnorm(punif(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2]))
Ds[,i]<-dunif(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2],log=TRUE)
}else if(Dtypes[i]==3){
ys.el[,i]<-qnorm(pexp(xs[,i],ArgsList[[i]][1]))
Ds[,i]<-dexp(xs[,i],ArgsList[[i]][1],log=TRUE)
}else if(Dtypes[i]==4){
ys.el[,i]<-qnorm(pchisq(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2]))
Ds[,i]<-dchisq(xs[,i],ArgsList[[i]][1],ArgsList[[i]][2],log=TRUE)
}
}
ys.sp<-t(Re.e[[2]]%*%diag(1/sqrt(Re.e[[1]]))%*%solve(Re.e[[2]])%*% t(ys.el))
Pr.sp<-dnorm(ys.sp,log=TRUE)
Pr.el<-dnorm(ys.el,log=TRUE)
Pr<-exp(apply(Pr.sp-Pr.el+Ds,1,sum))
return(list(Pr=Pr,Pr.sp=Pr.sp,Pr.el=Pr.el,Pr.xs=Ds))
}
k<-2
Dtypes<-c(2,2)
ArgsList<-list(c(0,6),c(0,6),c(0,5),c(1,0))
x1<-seq(from=1,to=5,by=0.01)
x2<-seq(from=1,to=5,by=0.01)
x3<-1
x4<-1
xs<-as.matrix(expand.grid(x1,x2))
R<-matrix(0.3,k,k)
diag(R)<-1
outTestFx<-MultiDistCorrelated(k,xs,Dtypes,ArgsList,R)
filled.contour(matrix(outTestFx$Pr,length(x1),length(x2)))
min(outTestFx$Pr)-max(outTestFx$Pr)