■
par(ask=TRUE) N<-200 #バリアントの数 i HN<-100000 #人数 j ir<-al<-matrix(0,HN,N) #各ローカスにおけるリスク、持っているアレル wei<-wei2<-P<-sr<-rep(0,HN) #重み、フェノタイプ、リスクの総和 risk<-af<-iaf<-rep(0,N) #真のアレル頻度 Np<-50 #MST何回か KN<-1 #何種類のKについて knnu<-rep(0,KN) #何種類のKについて IDN<-10 #何種類の遺伝率か idnnu<-rep(0,IDN) #何種類の遺伝率か syukei<-matrix(0,Np,KN) #boxplot用 syukei2<-matrix(0,Np,KN) #boxplot用 syukei2<-matrix(0,Np,IDN) #boxplot用 thress<-seq(from=0.9,to=0.98,by=0.005) #0.005刻みのthreshold aa<-60.0 #アレル頻度パラメータ af<-rexp(N,aa) #アレル頻度を与える for(knp in 1:KN){ mm<-60 #リスク分布のmeanのパラメータ #knnu[knp]<-mm risk<-exp(-mm*af)*sign(rnorm(N, mean=0, sd=1)) #risk[which(af<0.005)]<-200 #hist(af) #hist(risk) cccc<-as.character(knp) ssss<-paste("manaf",cccc,".png") png(ssss) #デバイスドライバの用意 plot(af,risk) #グラフを描画 dev.off() #個人のアレルの有無振り分け 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 #アレルをいくつもつか sr[i]<-sum(risk*al[i,]) #リスク総和 } #for (i in 1:N) iaf[i]<-mean(al[,i])/2 #アレル頻度確かめ #plot(af,iaf) #plot(density(sr)) for(iii in 1:IDN){ sdfrac<-0.98-((iii-1)*0.1) #遺伝率 idnnu[iii]<-sdfrac P<-sr*sdfrac+rnorm(N,sd=sqrt(var(sr))*(1-sdfrac)) plot(sr,P) #----------------MST・量的形質---------------- par(ask=FALSE) Ncaco<-200 for (counte in 1:Np){ Cmst<-sample(1:HN,Ncaco,replace=FALSE) X<-cbind(P[c(Cmst)],al[c(Cmst),]) # MST<-StatsMST(X,perm=TRUE,Nperm=100,tobeshuffled=c(1),dist.method="euclid") # plot(sort(MST$PermL),ylim=range(c(MST$L,MST$PermL))) # abline(h=MST$L,col=2) # title(counte+1000*knp) # ll<-MST$L # cat1<-seq(from=0,to=1,by=0.01) # cat2<-quantile(MST$PermL,cat1) # cat3<-cat2-ll # syukei[counte,knp]<-length(cat3[cat3<0]) MST<-StatsMST(X,perm=TRUE,Nperm=100,tobeshuffled=c(1),dist.method="manhattan") plot(sort(MST$PermL),ylim=range(c(MST$L,MST$PermL))) abline(h=MST$L,col=2) title(counte+1000*knp+1000000) ll<-MST$L cat1<-seq(from=0,to=1,by=0.01) cat2<-quantile(MST$PermL,cat1) cat3<-cat2-ll syukei2[counte,knp]<-length(cat3[cat3<0]) } } } colnames(syukei2) <- idnnu #knnu boxplot(syukei2)
上手く回るかまだ試してないので、これは家でまわそう。多分25分くらいかかる。
#Mの列sをシャッフルして返す ShuffleForPerm<-function(M,s=NULL){ if(is.null(s)){ #s=NULLなら(つまりデフォでは)2列目以降をシャッフル s<-2:length(M[1,]) } sM<-matrix(1:length(M),nrow(M),ncol(M)) #sMを列ごとにシャッフルしてそのインデックスのを取り出す感じ sM<-apply(as.matrix(sM[,s]),2,sample) sM2<-M sM2[,s]<-matrix(M[sM],nrow(M),length(s)) sM2 } library(vegan) #MSTの値について、検定 StatsMST<-function(X,perm=TRUE,tobeshuffled=NULL,Nperm=1000,dist.method="euclid"){ library(vegan) Nnode<-length(X[,1]) distM<-dist(X,method=dist.method) # calculate stats MST<-spantree(distM) if(!perm){ return(list(Nnode=Nnode,distM=distM,MST=MST,L=sum(MST[[2]]),PermL=NULL,perm=perm,Nperm=Nperm,dist.method=dist.method)) }else{ if(is.null(tobeshuffled)){ tobeshuffled<-2:length(X[1,]) } PermL<-rep(0,Nperm) for(i in 1:Nperm){ tmpdistM<-dist(ShuffleForPerm(X,tobeshuffled),method=dist.method) tmpMST<-spantree(tmpdistM) PermL[i]<-sum(tmpMST[[2]]) } return(list(Nnode=Nnode,distM=distM,MST=MST,L=sum(MST[[2]]),PermL=PermL,perm=perm,Nperm=Nperm,dist.method=dist.method)) } } #MSTの値について、プロット plot.MST.L<-function(mst){ ylim<-range(c(mst$L,mst$PermL)) plot(sort(mst$PermL),ylim=ylim) abline(h=mst$L) }
読み込み用