2014年度マイコースプログラム

4回生K.K. @統計遺伝学分野

9月8日(月)午後

密度症例対照研究のシミュレーション 2


それぞれの結果に対する理由の説明を試みたが、思ったよりも難しくて、ちょっといい説明が分からなった。
ミーティングでの話題にするとして、一旦保留にすることにした。

結果を見て思ったのは、思ったよりもバラつきが大きいということだった。
ケース・コントロール研究は、特に発生率が非常に小さくコホート研究を行うと無駄が多い、という場合によく適応される。
しかし、この結果をみると、発生率が小さくて症例数を十分に集められないような疾患だと、研究をするたびにかなりの違いが生じそうである。
例えば、Aという因子とBという因子について、どちらがより影響が大きいか、というような検討をするにしても、これだけバラつきがあっては信頼度はかなり低いと思われる。
ましてやこれは、原集団の同定が完全にうまくいっていると仮定した結果である。
僕が予想していたよりも、ケース・コントロール研究による結果はあてにならないようである。
やはり手間のかかるコホート研究のほうが、結果の信頼性は高いらしい。

累積症例対照研究のシミュレーション

この調子で、ケース・コントロール研究の他の種類のシミュレーションもやってみる。

次はリスク期間が終わった後に行ってリスクの比を調べる、累積症例対照研究について扱う。

N人の未発症の集団のうち、曝露されている人数をeとし、ある期間における曝露群の発症のリスクをp,非曝露群の発症のリスクをqとおく。
このとき、期間後に発症している人からn1人を抽出して症例群、発症していない人からn2人を抽出して対照群とし、オッズを求める。

とりあえず作ったのが以下。

ex<-function(N,e,p){
r<-runif(e,0,1)
r[r>=1-p]<-1
r[r<1-p]<-0
return(rbind(r,1))
}

n.ex<-function(N,e,q){
r<-runif(N-e,0,1)
r[r>=1-q]<-1
r[r<1-q]<-0
return(rbind(r,0))
}

all<-function(N,e,p,q){
cbind(ex(N,e,p),n.ex(N,e,q))
}

case.sample<-function(N,e,p,q,n1){
a<-all(N,e,p,q)
b<-a[,which(a[1,]==1)]
sample.num<-sample(ncol(b),n1)
return(b[,sample.num])
}

control.sample<-function(N,e,p,q,n2){
a<-all(N,e,p,q)
b<-a[,which(a[1,]==0)]
sample.num<-sample(ncol(b),n2)
return(b[,sample.num])
}

myf<-function(c){
length(which(c))
}

odds<-function(N,e,p,q,n1,n2){
a<-case.sample(N,e,p,q,n1)
b<-control.sample(N,e,p,q,n2)
x<-(myf(a[2,]==1)*myf(b[2,]==0))/(myf(b[2,]==1)*myf(a[2,]==0))
return(x)
}

box<-function(N,e,p,q,n1,n2){
x<-c()
for(i in 1:10000){
x[i]<-odds(N,e,p,q,n1,n2)
}
boxplot(x)
}

しかし、案の定計算が遅すぎて使い物にならないので、速度の改善を試みた。

mat<-function(N,e,p,q){
a<-N*10000
b<-e*10000
r<-runif(a,0,1)
r[1:b][r[1:b]>=1-p]<-2
r[(b+1):a][r[(b+1):a]>=1-q]<-2
s<-rep(c(1,0),c(b,a-b))
return(rbind(r,s))
}

box<-function(N,e,p,q,n1,n2){
m<-mat(N,e,p,q)
x<-c()
for(i in 1:10000){
v<-m[1,c(((i-1)*e+1):(i*e),(10000*e+(N-e)*(i-1)+1):(10000*e+(N-e)*i))]
a<-m[,sample(which(v==2),n1)]
b<-m[,sample(which(v!=2),n2)]
x[i]<-(length(which(a[2,]==2))*length(which(b[2,]!=2)))/(length(which(b[2,]==2))*length(which(a[2,]!=2)))
}
boxplot(x)
}

一応ここまでつくってみたが、まだちゃんとした箱ひげ図の作成には成功していない。
どこかにミスがあるようなので、明日もう少し探してみることにする。

効率化を考えるのはなかなかハマる。
後から見たら訳が分からないものになっていそうだが。

以上