- カテゴリカルな尺度が3軸ある
- X,Y,Zの3つ
- XとYが関係し、XとZが関係している
- YとZはXとの関係とは独立にさらに関係しているのかどうか知りたい
- 3軸が作る3次元表が観察されたとする
- X,Yの2軸が作る2次元カテゴリの比率は偏りがあるが、そのままにして
- X,Zの2軸が作る2次元カテゴリの比率も偏りがあるが、そのままにして
- Y,Zの2軸が作る2次元カテゴリの比率は、観察データでは偏っているが、「偏っていない」という帰無仮説を想定している
- じゃ、どんな3次元比率が、最尤なのか…を探索してみよう
- 最尤比率が決まれば、自由度(2)で尤度比検定もできる
library(sets)
CategoryVector<-function (nc = 3)
{
df <- nc - 1
d <- df + 1
diagval <- 1:d
diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df -
diagval + 2))
others <- -diagval/(df - (0:(d - 1)))
m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
diag(m) <- diagval
m[upper.tri(m)] <- 0
as.matrix(m[, 1:df])
}
MakeFacets<-function(Faces){
Subs<-outer(Faces,Faces,FUN="set_is_proper_subset")
diag(Subs)<-FALSE
tmp.facets<-abs(sign(apply(Subs,1,sum))-1)
Faces2<-list()
cnt<-1
for(i in 1:length(tmp.facets)){
if(tmp.facets[i]==1){
Faces2[[cnt]]<-Faces[[i]]
cnt<-cnt+1
}
}
tmp<-as.set(Faces2)
}
LogLinearExp<-function(Table,r,Facets){
E<-array(1,r)
address<-which(E==1,arr.ind=TRUE)
FacetList<-list()
margList<-list()
margAddress<-list()
cnt<-1
for(i in Facets){
FacetList[[cnt]]<-as.integer(i)
if(length(FacetList[[cnt]])==1){
margList[[cnt]]<-as.matrix(apply(Table,FacetList[[cnt]],sum))
}else{
margList[[cnt]]<-as.array(apply(Table,FacetList[[cnt]],sum))
}
margAddress[[cnt]]<-which(margList[[cnt]]<Inf,arr.ind=TRUE)
cnt<-cnt+1
}
for(i in 1:length(address[,1])){
for(j in 1:length(FacetList)){
short.address<-address[i,FacetList[[j]]]
if(length(short.address)==1)short.address<-c(short.address,1)
diff<-apply((t(margAddress[[j]])-short.address)^2,2,sum)
marg.address<-which(diff==0)
E[i]<-E[i]*margList[[j]][marg.address]
}
}
E<-E/sum(E)*sum(Table)
E
}
MakeX2<-function(ns,Facets=NULL){
CV<-list()
for(i in 1:length(ns)){
CV[[i]]<-CategoryVector(ns[i])
}
t<-array(1,ns)
taddress<-which(t>0,arr.ind=TRUE)
R<-prod(ns)
zeros<-c()
CVext<-list()
for(i in 1:length(ns)){
tmp<-matrix(0,length(CV[[i]][1,]),R)
for(j in 1:R){
tmp[,j]<-CV[[i]][taddress[j,i],]
}
CVext[[i]]<-tmp
}
s<-as.set(1:length(ns))
ps<-set_power(s)
X<-NULL
Y<-NULL
cnt<-1
for(i in ps){
z<-1
for(j in Facets){
if(i<=j){
z<-0
}
}
if(set_is_empty(i)){
tmpX<-rep(1,R)
}else{
tmplist<-c()
for(j in i){
tmplist<-c(tmplist,j)
}
tmplist<-sort(tmplist)
N<-length(tmplist)
tmpX<-NULL
if(N==1){
tmpX<-CVext[[tmplist]]
}else{
initX<-CVext[[tmplist[1]]]
vals<-NULL
for(j in 1:R){
tmpvals<-initX[,j]
for(k in 2:N){
tmpvals<-outer(tmpvals,CVext[[tmplist[k]]][,j],FUN="*")
}
tmpvals<-c(tmpvals)
vals<-rbind(vals,tmpvals)
}
tmpX<-t(vals)
}
}
if(is.null(dim(tmpX)))tmpX<-matrix(tmpX,nrow=1)
Y<-rbind(Y,tmpX)
zeros<-c(zeros,rep(z,length(tmpX[,1])))
X[[cnt]]<-tmpX
cnt<-cnt+1
}
list(matrixX=Y,listX=X,zeros=zeros)
}
MakeX3<-function(ns,Facets=NULL){
ret<-MakeX2(ns,Facets)
X<-ret$matrixX
dd<-diag(X%*%t(X))
X2<-diag(1/sqrt(dd))%*%X
list(matrixX=X2,listX=ret$listX,zeros=ret$zeros)
}
MakeExpected4<-function(Obs,ns,Facets){
out.makeX2<-MakeX2(ns,Facets)
X<-out.makeX2$matrixX
Z<-out.makeX2$zeros
P<-X%*%c(Obs)
P2<-P
P2[which(Z==1)]<-rep(0,length(which(Z==1)))
Obs2<-solve(X)%*%P2
list(Etable=array(Obs2,ns),X=X,Z=Z)
}
MakeExpected5<-function(Obs,ns,Facets){
out.makeX2<-MakeX3(ns,Facets)
X<-out.makeX2$matrixX
Z<-out.makeX2$zeros
P<-X%*%c(Obs)
P2<-P
P2[which(Z==1)]<-rep(0,length(which(Z==1)))
Obs2<-solve(X)%*%P2
list(Etable=array(Obs2,ns),X=X,Z=Z)
}
CalcLogLike<-function(Obs,Etable){
Ptable<-Etable/sum(Etable)
sum(Obs*log(Ptable))
}
LogLikeRatioMargOK<-function(T1,T2){
sum(lgamma(T1+1))-sum(lgamma(T2+1))
}
library(MCMCpack)
h <- c(rdirichlet(1,rep(1,8)))
array.h <- array(h,rep(2,3))
kajiX <- MakeX2(c(2,2,2))$matrixX
r1 <- r2 <- seq(from = -0.005, to = 0.005, length =100)
r12 <- expand.grid(r1,r2)
LL <- rep(0,length(r12[,1]))
for(i in 1:length(r12[,1])){
rand.v <- unlist(c(rep(0,6),c(r12[i,])))
tmp.h <- t(kajiX) %*% rand.v
new.h <- tmp.h +h
if(prod(new.h > 0)){
LL[i] <- sum(h*log(new.h))
}
}
image(matrix(LL,ncol=length(r1)))