Rで2x3表を網羅的に作ってみる
- 2x3表 *1があるとする。
- これと周辺度数を同じくする表を全部作りたい。。。その数も知りたい。。。
Rでやるなら
makeTables<-function(t){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
x<-seq(0,min(m1[1],m2[1]))
y<-seq(0,min(m1[1],m2[2]))
d11d12<-expand.grid(x=x,y=y)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(data2)
}
- 使い方
t<-c(10,20,30,40,50,60) tables<-makeTables(t)
- 同じく、テーブルの数だけを知りたいとき
countTables<-function(t){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
x<-seq(0,min(m1[1],m2[1]))
y<-seq(0,min(m1[1],m2[2]))
d11d12<-expand.grid(x=x,y=y)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(length(data2[,1]))
}
-使い方
>||
t<-c(10,20,30,40,50,60)
Notables<-countTables(t)
- 周辺度数を算出する関数も使ってます
#行の周辺度数
funcm1<-function(t2){
m1<-c(t2[1,1]+t2[1,2]+t2[1,3],t2[2,1]+t2[2,2]+t2[2,3])
return(m1)
}
#列の周辺度数
funcm2<-function(t2){
m2<-c(t2[1,1]+t2[2,1],t2[1,2]+t2[2,2],t2[1,3]+t2[2,3])
return(m2)
}
makeTablesSkip<-function(t,skip){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
x<-seq(0,min(m1[1],m2[1]),by=skip)
y<-seq(0,min(m1[1],m2[2]),by=skip)
d11d12<-expand.grid(x=x,y=y)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(data2)
}
countTablesSkip<-function(t,skip){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
x<-seq(0,min(m1[1],m2[1]),by=skip)
y<-seq(0,min(m1[1],m2[2]))
d11d12<-expand.grid(x=x,y=y,by=skip)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(length(data2[,1])*skip*skip)
}
- これだと、*2という大きな周辺度数を持つテーブルでも、makeTablesSkip関数では、22281個のテーブルが作られるだけです。そして、テーブルの総数は、おおよそ、2760502500個くらいらしいこともわかります。テーブル数の概数は、桁がずれるほど違うことはないでしょう。
- じゃあ、このskip数を決めるのが面倒くさかったらどうしたらよいでしょう。大まかに言えば、関数の中で動かしている2つの数の掛け算が、「網羅数」に相当しますから、その「網羅しそうな数」に上限を加えてやることで、デフォルトのスキップ数を、入力テーブルから計算させてやると、その目的が果たせそうです。今、10000テーブルを網羅するのが、この我慢の上限のデフォルト値として、場合によっては、もっと我慢強かったり、我慢が足りなかったりするので、それも引数化してやると、次のようになります。
makeTablesSkipDefault<-function(t,limit=10000){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
skip<-ceiling(sqrt((min(m1[1],m2[1])+1)*(min(m1[1],m2[2])+1)/limit))
x<-seq(0,min(m1[1],m2[1]),by=skip)
y<-seq(0,min(m1[1],m2[2]),by=skip)
d11d12<-expand.grid(x=x,y=y)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(list(tables=data2,skip=skip,limit=limit))
}
countTablesSkipDefault<-function(t,limit=10000){
t2<-matrix(t,nrow=2)
m1<-funcm1(t2)
m2<-funcm2(t2)
m<-sum(t2)
skip<-ceiling(sqrt((min(m1[1],m2[1])+1)*(min(m1[1],m2[2])+1)/limit))
x<-seq(0,min(m1[1],m2[1]),by=skip)
y<-seq(0,min(m1[1],m2[2]))
d11d12<-expand.grid(x=x,y=y,by=skip)
d13<-m1[1]-(d11d12[1]+d11d12[2])
d21<-m2[1]-d11d12[1]
d22<-m2[2]-d11d12[2]
d23<-m2[3]-d13
data<-cbind(d11d12[1],d21,d11d12[2],d22,d13,d23)
minval<-apply(data,1,min)
data2<-data[minval>=0,]
return(list(NoTables=length(data2[,1])*skip*skip,skip=skip,limit=limit))
}
- ついでに、HWEな3ディプロタイプから、ずらして2x3表を作ってもみる
sim2x3<-function(af,N1,N2,sd=1){
g<-c(af^2,2*af*(1-af),(1-af)^2)
b<-c(ceiling(g[1]*N1+rnorm(1,mean=N1,sd=sd)),ceiling(g[2]*N1+rnorm(1,mean=N1,sd=sd)),ceiling(g[3]*N1+rnorm(1,mean=N1,sd=sd)),ceiling(g[1]*N2+rnorm(1,mean=N2,sd=sd)),ceiling(g[2]*N2+rnorm(1,mean=N2,sd=sd)),ceiling(g[3]*N2+rnorm(1,mean=N2,sd=sd)))
return(b)
}
#Ntは作成するテーブル数
#N1,N2はケース,コントロール人数
SimTables<-function(N1,N2,sd=1,Nt){
g11<-rep(0,Nt)
g12<-rep(0,Nt)
g13<-rep(0,Nt)
g21<-rep(0,Nt)
g22<-rep(0,Nt)
g23<-rep(0,Nt)
for(i in 1:Nt){
tmp<-sim2x3(runif(1),N1,N2,sd=sd)
g11[i]=tmp[1]
g12[i]=tmp[2]
g13[i]=tmp[3]
g21[i]=tmp[4]
g22[i]=tmp[5]
g23[i]=tmp[6]
}
ret=cbind(g11,g21,g12,g22,g13,g23)
return(ret)
}