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

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

9月19日(金)

データの層化 2

kを0から1までの実数として、曝露率をe=0.5+k*xとし、k(すなわち交絡と曝露率の相関の強さ)によって層化の影響がどのように変わるか調べてみた。

N <- 1000
e <- 0.5
b <- 0.05
c.max <- 0.5
alpha <- 0.1
n <- 7

myfunc <- function(k){

deta <- matrix(nrow=N,ncol=3)
deta[,1] <- runif(N,0,c.max)
f1 <- function(x){
sample(0:1,1,prob=c(0.5-k*x,0.5+k*x))
}
deta[,2] <- apply(deta[,1,drop=F],1,f1)
f2 <- function(x){
p <- b+x[1]+x[2]*alpha
sample(0:1,1,prob=c(1-p,p))
}
deta[,3] <- apply(deta[,1:2],1,f2)

d <- deta

RD.MH <- function(n){

deta.list <- list()
for(i in 1:n){
deta. <- subset(d,d[,1]>=(i-1)*c.max/n&d[,1]<i*c.max/n)
deta.list[[i]] <- deta.
}

RD <- function(d){

RD.u <- function(d){
(length(which(d[which(d[,2]==1),3]==1))*length(which(d[,2]==0))
-length(which(d[which(d[,2]==0),3]==1))*length(which(d[,2]==1)))/nrow(d)}

RD.l <- function(d){
length(which(d[,2]==0))*length(which(d[,2]==1))/nrow(d)
}

return(c(RD.u(d),RD.l(d)))

}

deta2 <- sapply(deta.list,RD)

x <- sum(deta2[1,])/sum(deta2[2,])

return(x)

}

x <- c()
for(i in 2:n)
x <- c(x,abs(alpha-RD.MH(1))-abs(alpha-RD.MH(i)))

return(x)

}

myfunc2 <- function(k){
mat <- numeric(0)
for(i in 1:10000){
mat <- rbind(mat,myfunc(k))}
return(mat)
}

mat0 <- myfunc2(0)
mat0.1 <- myfunc2(0.1)
mat0.2 <- myfunc2(0.2)
mat0.3 <- myfunc2(0.3)
mat0.4 <- myfunc2(0.4)
mat0.5 <- myfunc2(0.5)
mat0.6 <- myfunc2(0.6)
mat0.7 <- myfunc2(0.7)
mat0.8 <- myfunc2(0.8)
mat0.9 <- myfunc2(0.9)

x <- 2:n
z0 <- apply(mat0,2,mean)
z0.1 <- apply(mat0.1,2,mean)
z0.2 <- apply(mat0.2,2,mean)
z0.3 <- apply(mat0.3,2,mean)
z0.4 <- apply(mat0.4,2,mean)
z0.5 <- apply(mat0.5,2,mean)
z0.6 <- apply(mat0.6,2,mean)
z0.7 <- apply(mat0.7,2,mean)
z0.8 <- apply(mat0.8,2,mean)
z0.9 <- apply(mat0.9,2,mean)


plot(x,z0,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=1,xlab="層数",ylab="改善度")

par(new=T)
plot(x,z0.1,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=2,ann=F)

par(new=T)
plot(x,z0.2,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=3,ann=F)

par(new=T)
plot(x,z0.3,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=4,ann=F)

par(new=T)
plot(x,z0.4,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=5,ann=F)

par(new=T)
plot(x,z0.5,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=6,ann=F)

par(new=T)
plot(x,z0.6,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=7,ann=F)

par(new=T)
plot(x,z0.7,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=8,ann=F)

par(new=T)
plot(x,z0.8,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),lty=2,ann=F)

par(new=T)
plot(x,z0.9,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),lty=3,ann=F)

f:id:kouri_don:20140919121125p:plain

この図のグラフは下から順にk=0,0.1,…,0.9の場合で、kの値が大きくなるほどに、層化による改善度は大きくなることを示している。
しかし、kの値が大きくても、分けるべき層数はせいぜい3くらいで、多くの層に分けなければならないわけではないらしい。

続いて、交絡と曝露率の関係は昨日のシミュレーションのままで、交絡と発症率の関係を変えた場合にどうなるかやってみた。
kを0から1.5までの実数とおき、発症率p=b+k*c(+alpha)とおいた。

N <- 1000
e <- 0.5
b <- 0.05
c.max <- 0.5
alpha <- 0.1

myfunc <- function(k){

deta <- matrix(nrow=N,ncol=3)
deta[,1] <- runif(N,0,c.max)
f1 <- function(x){
sample(0:1,1,prob=c(0.75-x,x+0.25))
}
deta[,2] <- apply(deta[,1,drop=F],1,f1)
f2 <- function(x){
p <- b+k*x[1]+x[2]*alpha
sample(0:1,1,prob=c(1-p,p))
}
deta[,3] <- apply(deta[,1:2],1,f2)

d <- deta

RD.MH <- function(n){

deta.list <- list()
for(i in 1:n){
deta. <- subset(d,d[,1]>=(i-1)*c.max/n&d[,1]<i*c.max/n)
deta.list[[i]] <- deta.
}

RD <- function(d){

RD.u <- function(d){
(length(which(d[which(d[,2]==1),3]==1))*length(which(d[,2]==0))
-length(which(d[which(d[,2]==0),3]==1))*length(which(d[,2]==1)))/nrow(d)}

RD.l <- function(d){
length(which(d[,2]==0))*length(which(d[,2]==1))/nrow(d)
}

return(c(RD.u(d),RD.l(d)))

}

deta2 <- sapply(deta.list,RD)

x <- sum(deta2[1,])/sum(deta2[2,])

return(x)

}

x <- c()
for(i in 2:7)
x <- c(x,abs(alpha-RD.MH(1))-abs(alpha-RD.MH(i)))

return(x)

}

myfunc2 <- function(k){
mat <- numeric(0)
for(i in 1:10000){
mat <- rbind(mat,myfunc(k))}
return(mat)
}

mat0.1 <- myfunc2(0.1)
mat0.2 <- myfunc2(0.2)
mat0.4 <- myfunc2(0.4)
mat0.6 <- myfunc2(0.6)
mat0.8 <- myfunc2(0.8)
mat1 <- myfunc2(1)
mat1.2 <- myfunc2(1.2)
mat1.5 <- myfunc2(1.5)

x <- 2:7
z0.1 <- apply(mat0.1,2,mean)
z0.2 <- apply(mat0.2,2,mean)
z0.4 <- apply(mat0.4,2,mean)
z0.6 <- apply(mat0.6,2,mean)
z0.8 <- apply(mat0.8,2,mean)
z1 <- apply(mat1,2,mean)
z1.2 <- apply(mat1.2,2,mean)
z1.5 <- apply(mat1.5,2,mean)

plot(x,z0,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=1,xlab="層数",ylab="改善度",main="交絡と発症率")

par(new=T)
plot(x,z0.1,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=2,ann=F)

par(new=T)
plot(x,z0.2,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=3,ann=F)

par(new=T)
plot(x,z0.3,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=4,ann=F)

par(new=T)
plot(x,z0.4,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=5,ann=F)

par(new=T)
plot(x,z0.5,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=6,ann=F)

par(new=T)
plot(x,z0.6,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=7,ann=F)

par(new=T)
plot(x,z0.7,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),col=8,ann=F)

par(new=T)
plot(x,z0.8,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),lty=2,ann=F)

par(new=T)
plot(x,z0.9,type="l",xlim=c(2,7),ylim=c(0.00085,0.07),lty=3,ann=F)

f:id:kouri_don:20140919143408p:plain

下から順に、k=0.2,0.1,0.4,0.6,0.8,1,1.2,1.5の場合である。

やはりこちらも、関係が強いほうが改善度も大きいという結果になった。
また、こちらもkの値に関わらず、層数を上げてもたいして効果が増すわけではないようである。

交絡と発症率との関係が大きいほうが、層数を多くする必要がある、という予想は間違ってはいなかったと思うが、どのみち3つくらいに分ければそれで十分のようである。
特に、全く分けないのと2つに分けるのとで非常に差が大きい。
これは個人的には少し意外な結果だった。(モデルの作り方にもよるのかもしれないが…。)


層別化されたデータを統一化する方法のうち、上記のようにマンテル・ヘンツェルの公式によって計算するのが「プール化」と呼ばれる方法で、実はもう一つ、「標準化」と言われるものがあるらしい。
来週はそれについて考えてみることにして、そこまでを中間発表の内容としたいと思う。

残りの時間と今週末は、図書館で借りてきた教科書(「概説 確率統計」)で、統計学について体系的に勉強しようと思っている。
マイコース後半でさらに高度な内容を扱っていく上で、いまの知識量ではとても太刀打ち出来ないからである。

すでにある程度読み進めてはいるが、やはりちゃんと基礎からやったほうがよく理解できる気がする。
あと、余裕があれば線形代数の行列の知識も多少頭に入れておきたい。

以上