均等に分布させる(NxM表に拡張)

  • 7日目。...一昨昨日、一昨日と昨日(記事はこちらこちらこちらこちらこちらこちら)の続き
  • NxM表の観測値と期待値との差を成分とする行列は、すべての行の和が0、すべての列の和が0。
  • (N-1)x(M-1)次元空間にNxMを配置することになる。
  • その座標の出し方(NxM行の長さ(N-1)x(M-1)のベクトルが返る)
  • こちらでも
CategoryVector2D<-function(N,M){
 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])
 }

 cvN<-CategoryVector(N)
 cvM<-CategoryVector(M)
#outer(c(t(cvN)),c(t(cvM)),FUN="*") これでも計算できるけれども
#順序が扱いにくい
 m<-matrix(0,N*M,(N-1)*(M-1))
 counter1<-1
 counter2<-1
 for(i in 1:N){
  for(j in 1:M){
   counter2<-1
   for(k in 1:(N-1)){
    for(l in 1:(M-1)){
     m[counter1,counter2]<-cvN[i,k]*cvM[j,l]
     counter2<-counter2+1
    }
   }
   counter1<-counter1+1
  }
 }

 m

}