ジェノタイプで木を作ってフェノタイプを乗せる

#tree-E,P-E,st
source("MST.R")
par(ask=F)

Np<-100							#MST何回か
HN<-200
df<-3500
N<-100							#バリアントの数 i
ka<-600


kr<-c(0,10^(2:6))
lkr<-length(kr)

syu<-matrix(1,Np,lkr)
syul<-matrix(0,Np,lkr)
colnames(syu)<-kr

#allele frequency
afb<-0
for (i in 1:round(df/20)){
	afd<-(i-0.5)/df
	afb<-c(afb,rep(afd,round(N*(pexp(i/df,ka)-pexp((i-1)/df,ka)))))
}
raf<-afb[-1]
caf<-c(0.02,0.03,0.03)
af<-c(raf,caf)
#hist(af,breaks=seq(0,max(af)+1/df,1/df),xlab="allele frequency",main="allele frequency model")
N<-length(af)


for (inp in 1:Np){

ir<-al<-matrix(0,HN,N)		#各ローカスにおけるリスク、持っているアレル
sr<-matrix(0,HN,lkr)
wei<-rep(0,HN)
P<-matrix(0,HN,lkr)			#フェノタイプ、リスクの総和
iaf<-rep(0,N)		#真のアレル頻度

risk<-matrix(0,N,lkr)
plmi<-sign(rnorm(N, mean=0, sd=1))
for (i in 1:lkr) risk[,i]<-exp(-kr[i]*af)*plmi
#for (i in 1:lkr) plot(af,risk[,i],xlab="model allele frequency",main="allele frequency - risk",xlim=c(0,0.01))


#個人のアレルの有無振り分け iさんについて
for(i in 1:HN){
	a1<-a2<-tmp1<-tmp2<-rep(0,N)
	a1<-runif(N)					#RVの有無を決定
	a2<-runif(N)
	tmp1[which(a1<af)]<-1
	tmp2[which(a2<af)]<-1
	al[i,]<-tmp1+tmp2				#アレルをいくつもつか
	for (j in 1:lkr) sr[i,j]<-sum(risk[,j]*al[i,])		#リスク総和
	wei[i]<-sum(exp(-100*af)*al[i,])
}

iaf<-apply(al,2,mean)/2			#アレル頻度確かめ
#plot(af,iaf,xlab="model allele frequency",ylab="real allele frequency")						#グラフを描画
#for (i in 1:lkr) plot(density(sr[,i]),xlab="sum(risk)",main="sum(risk) = Phenotype")


#for (ikr in 1:lkr){
#sdfrac<-0.99		#遺伝率
#P[,ikr]<-sr[,ikr]*sdfrac+rnorm(HN,sd=sqrt(var(sr[,ikr]))*(1-sdfrac))
#P[,ikr]<-sr[,ikr]
#P[,ikr]<-P[,ikr]/(abs(max(P[,ikr]))+abs(min(P[,ikr])))/2
#plot(sr[,ikr],P[,ikr,isc])
#}
P<-sr

StandardDist<-function(v,method="manhattan"){
	N<-length(v)
	D<-dist(v,method=method)
	SumD<-sum(D)
	v/SumD*N*(N-1)/2
}

asdf<-apply(al,2,sum)
qwer<-which(asdf==0)
ala<-al[,-qwer]
alb<-apply(ala,2,StandardDist)
jaf<-apply(ala,2,mean)/2
Nrv<-length(jaf[which(jaf<0.01)])
#hist(jaf,breaks=seq(0,max(jaf)+1/HN,1/HN/2),xlab="real allele frequency",main="real allele frequency")

for (ikr in 1:lkr){

distM<-dist(alb,method="euclid")
MST<-spantree(distM)
di<-rep(0,HN-1)
for (i in 1:HN-1){
di[i]<-sqrt((P[i+1,ikr]-P[MST[[1]][i],ikr])^2+(MST[[2]][i])^2)
}
L<-sum(di)

PermL<-rep(0,100)
for (nper in 1:100){
t<-sample(1:HN)
PermP<-P[,ikr]
for (i in 1:HN) PermP[i]<-P[t[i],ikr]
di<-rep(0,HN-1)
for (i in 1:HN-1){
di[i]<-sqrt((PermP[i+1]-PermP[MST[[1]][i]])^2+MST[[2]][i]^2)
}
PermL[nper]<-sum(di)
}


plot(sort(PermL),ylim=range(c(L,PermL)))
abline(h=L,col=2)
title(paste(as.character(inp),as.character(kr[ikr]),as.character(Nrv)))
ll<-L
cat1<-seq(from=0,to=1,by=0.01)
cat2<-quantile(PermL,cat1)
cat3<-cat2-ll
syu[inp,ikr]<-length(cat3[cat3<0])/100

syul[inp,ikr]<-L


}
save.image("10132.RData")

}
colnames(syu)<-kr
boxplot(syu,xlab="kr (risk=rsign*exp(-kr*allelefrequency))",ylab="p値",ylim=c(0,0.8))
apply(syu,2,var)

title("Euclid,st")

euclid距離、標準化ありのとき
manhattan距離のときは
di[i]<-abs(P[i+1,ikr]-P[MST1[i],ikr])になるくらい。結果は計算中だけど、標準化したほうがよさげ。

p値の出し方が、今、パーミュテーションで出した統計量のうちもとの統計量より小さいものの比率なのだが、そしたらもっとパーミテーションしたほうがいいかも?