|
| 1 | +library(mvtnorm) |
| 2 | + |
| 3 | +## Computing the p-value of the MET based on the case-control design; |
| 4 | +## r: the number of cases; s: the number of controls; grr1,grr2: the genotype relative risks; |
| 5 | +## k: the disease prevalence; alpha: the nominal significance level; c: the threshold for HWDTT; |
| 6 | +## maf: minor allele frequency; |
| 7 | + |
| 8 | +MET <- function(r, s, grr1, grr2, k, alpha, c, maf) |
| 9 | +{ |
| 10 | + # population |
| 11 | + n <- r+s |
| 12 | + |
| 13 | + # scores of the recessive model, the additive model, and the dominant model |
| 14 | + score <- c(0,1/2,1) |
| 15 | + |
| 16 | + # penetrance |
| 17 | + f_0 <- k/((1-maf)^2+grr1*2*maf*(1-maf)+grr2*maf^2) |
| 18 | + |
| 19 | + # genotype frequencies in cases |
| 20 | + p_0 <- f_0*(1-maf)^2/k |
| 21 | + p_1 <- grr1*f_0*2*maf*(1-maf)/k |
| 22 | + p_2 <- grr2*f_0*maf^2/k |
| 23 | + |
| 24 | + # genotype frequencies in controls |
| 25 | + q_0 <- (1-f_0)*(1-maf)^2/(1-k) |
| 26 | + q_1 <- (1-grr1*f_0)*2*maf*(1-maf)/(1-k) |
| 27 | + q_2 <- (1-grr2*f_0)*maf^2/(1-k) |
| 28 | + |
| 29 | + met.pvalue <- c() |
| 30 | + |
| 31 | + # observed genotype counts in cases and controls |
| 32 | + case <- sample(c(0,1,2),r,replace=T,prob=c(p_0,p_1,p_2)) |
| 33 | + control <- sample(c(0,1,2),s,replace=T,prob=c(q_0,q_1,q_2)) |
| 34 | + |
| 35 | + r_0 <- length(which(case==0)) |
| 36 | + r_1 <- length(which(case==1)) |
| 37 | + r_2 <- length(which(case==2)) |
| 38 | + s_0 <- length(which(control==0)) |
| 39 | + s_1 <- length(which(control==1)) |
| 40 | + s_2 <- length(which(control==2)) |
| 41 | + n_0 <- r_0+s_0 |
| 42 | + n_1 <- r_1+s_1 |
| 43 | + n_2 <- r_2+s_2 |
| 44 | + |
| 45 | + if(n_2!=0){ |
| 46 | + |
| 47 | + # estimators of genotype frequencies under the null hypothesis |
| 48 | + ep_1 <- eq_1 <- n_1/n |
| 49 | + ep_2 <- eq_2 <- n_2/n |
| 50 | + |
| 51 | + # estimators of the variances and covariances under three genetic models |
| 52 | + cvar_rec <- (1/r)*(ep_2-3*ep_2^2+2*ep_2^3+2*ep_1*ep_2^2+(1/2)*ep_1^2*ep_2-ep_1*ep_2) |
| 53 | + cvar_add <- (1/r)*(ep_2-2*ep_1*ep_2-3*ep_2^2+2*ep_2^3+3*ep_1*ep_2^2+(3/2)*ep_1^2*ep_2-(1/4)*ep_1^2+(1/4)*ep_1^3) |
| 54 | + cvar_dom <- (1/r)*(ep_2-3*ep_2^2-3*ep_1*ep_2+2*ep_2^3+4*ep_1*ep_2^2+(5/2)*ep_1^2*ep_2-(1/2)*ep_1^2+(1/2)*ep_1^3) |
| 55 | + var_rec <- (ep_2-ep_2^2)/r+(eq_2-eq_2^2)/s |
| 56 | + var_add <- ((ep_2+(1/4)*ep_1)-(ep_2+(1/2)*ep_1)^2)/r+((eq_2+(1/4)*eq_1)-(eq_2+(1/2)*eq_1)^2)/s |
| 57 | + var_dom <- ((ep_2+ep_1)-(ep_2+ep_1)^2)/r+((eq_2+eq_1)-(eq_2+eq_1)^2)/s |
| 58 | + vardel <- (1/r)*(ep_2-5*ep_2^2+8*ep_2^3-4*ep_2^4+(1/4)*ep_1^3-(1/4)*ep_1^4-2*ep_1*ep_2+3*ep_1^2*ep_2+9*ep_1*ep_2^2-6*ep_1^2*ep_2^2-8*ep_1*ep_2^3-2*ep_1^3*ep_2) |
| 59 | + |
| 60 | + # CATT under three genetic models |
| 61 | + Z_rec <- n^(1/2)*(score[1]*(s*r_1-r*s_1)+(s*r_2-r*s_2))/((r*s*(n*(score[1]^2*n_1+n_2)-(score[1]*n_1+n_2)^2))^(1/2)) |
| 62 | + Z_add <- n^(1/2)*(score[2]*(s*r_1-r*s_1)+(s*r_2-r*s_2))/((r*s*(n*(score[2]^2*n_1+n_2)-(score[2]*n_1+n_2)^2))^(1/2)) |
| 63 | + Z_dom <- n^(1/2)*(score[3]*(s*r_1-r*s_1)+(s*r_2-r*s_2))/((r*s*(n*(score[3]^2*n_1+n_2)-(score[3]*n_1+n_2)^2))^(1/2)) |
| 64 | + |
| 65 | + # HWDTT in only case |
| 66 | + delta_p <- r_2/r-(r_2/r+r_1/(2*r))^2 |
| 67 | + Z_C <- delta_p/sqrt(vardel) |
| 68 | + |
| 69 | + # expectation of the MET |
| 70 | + delta_pt <- p_2-(p_2+p_1/2)^2 |
| 71 | + mu_deltap <- delta_pt/sqrt(vardel) |
| 72 | + mean_met <- c(0,mu_deltap) |
| 73 | + |
| 74 | + # variance and covariance matrix of the MET |
| 75 | + ecvar <- c(cvar_rec/sqrt(var_rec*vardel),cvar_add/sqrt(var_add*vardel),cvar_dom/sqrt(var_dom*vardel)) |
| 76 | + covr_met <- matrix(c(1,ecvar[1],ecvar[1],1),ncol=2) |
| 77 | + cova_met <- matrix(c(1,ecvar[2],ecvar[2],1),ncol=2) |
| 78 | + covd_met <- matrix(c(1,ecvar[3],ecvar[3],1),ncol=2) |
| 79 | + |
| 80 | + # p-value of the MET |
| 81 | + if(Z_C>c){ |
| 82 | + lower1 <- c(abs(Z_rec),c) |
| 83 | + upper1 <- rep(Inf,2) |
| 84 | + lower2 <- c(abs(Z_rec),-c) |
| 85 | + upper2 <- c(Inf,c) |
| 86 | + lower3 <- c(abs(Z_rec),-Inf) |
| 87 | + upper3 <- c(Inf,-c) |
| 88 | + lower4 <- c(-Inf,c) |
| 89 | + upper4 <- c(-abs(Z_rec),Inf) |
| 90 | + lower5 <- c(-Inf,-c) |
| 91 | + upper5 <- c(-abs(Z_rec),c) |
| 92 | + lower6 <- c(-Inf,-Inf) |
| 93 | + upper6 <- c(-abs(Z_rec),-c) |
| 94 | + |
| 95 | + met.pvalue <- pmvnorm(lower1,upper1,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower2,upper2,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower3,upper3,mean_met,sigma=covd_met)[[1]]+pmvnorm(lower4,upper4,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower5,upper5,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower6,upper6,mean_met,sigma=covd_met)[[1]] |
| 96 | + }else if(Z_C<(-c)){ |
| 97 | + lower1 <- c(abs(Z_dom),c) |
| 98 | + upper1 <- rep(Inf,2) |
| 99 | + lower2 <- c(abs(Z_dom),-c) |
| 100 | + upper2 <- c(Inf,c) |
| 101 | + lower3 <- c(abs(Z_dom),-Inf) |
| 102 | + upper3 <- c(Inf,-c) |
| 103 | + lower4 <- c(-Inf,c) |
| 104 | + upper4 <- c(-abs(Z_dom),Inf) |
| 105 | + lower5 <- c(-Inf,-c) |
| 106 | + upper5 <- c(-abs(Z_dom),c) |
| 107 | + lower6 <- c(-Inf,-Inf) |
| 108 | + upper6 <- c(-abs(Z_dom),-c) |
| 109 | + |
| 110 | + met.pvalue <- pmvnorm(lower1,upper1,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower2,upper2,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower3,upper3,mean_met,sigma=covd_met)[[1]]+pmvnorm(lower4,upper4,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower5,upper5,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower6,upper6,mean_met,sigma=covd_met)[[1]] |
| 111 | + }else{ |
| 112 | + lower1 <- c(abs(Z_add),c) |
| 113 | + upper1 <- rep(Inf,2) |
| 114 | + lower2 <- c(abs(Z_add),-c) |
| 115 | + upper2 <- c(Inf,c) |
| 116 | + lower3 <- c(abs(Z_add),-Inf) |
| 117 | + upper3 <- c(Inf,-c) |
| 118 | + lower4 <- c(-Inf,c) |
| 119 | + upper4 <- c(-abs(Z_add),Inf) |
| 120 | + lower5 <- c(-Inf,-c) |
| 121 | + upper5 <- c(-abs(Z_add),c) |
| 122 | + lower6 <- c(-Inf,-Inf) |
| 123 | + upper6 <- c(-abs(Z_add),-c) |
| 124 | + |
| 125 | + met.pvalue <- pmvnorm(lower1,upper1,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower2,upper2,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower3,upper3,mean_met,sigma=covd_met)[[1]]+pmvnorm(lower4,upper4,mean_met,sigma=covr_met)[[1]]+pmvnorm(lower5,upper5,mean_met,sigma=cova_met)[[1]]+pmvnorm(lower6,upper6,mean_met,sigma=covd_met)[[1]] |
| 126 | + } |
| 127 | + |
| 128 | + } |
| 129 | + |
| 130 | +list(met.pvalue) |
| 131 | + |
| 132 | +} |
| 133 | + |
0 commit comments