Simulatsioonid on läbi viidud Tartu Ülikooli teadusarvutuste keskuse arvutusklastris, kasutades järgmisi R-funktsioone.


Binaarse CNV tunnuse simuleerimine

library(logistf)
library(dplyr)
# N - valimimaht
# p - diagnoosi osakaal, p0 - kontrollide CNV osakaal,
# OR - tegelik šansside suhe
# p01 - valepositiivsuse määr, p10 - valenegatiivsuse määr
simulatsioon1 <- function(N, p, p0, OR, p01, p10){
    n1 = N * p # juhtude arv
    n0 = N - n1 # kontrollide arv
    p1 = p0 * OR / (p0 * (OR - 1) + 1) # juhtude CNV osakaal
    p11 = 1 - p10 #õigepositiivsuse määr
    p1_penn = (p1*p11+(1-p1)*p01) # juhtude CNV osakaal PennCNV tunnuse kaudu
    p0_penn = (p0*p11+(1-p0)*p01) # kontrollide CNV osakaal PennCNV tunnuse kaudu
    T0 = seq(0,n0) # CNV kandjate võimalikud arvud kontrollide hulgas
    T1 = seq(0,n1) # CNV kandjate võimalikud arvud juhtude hulgas
    pT0 = dbinom(T0, n0, p0_penn) # tõenäosused P(T_0=i)
    names(pT0) = T0
    pT1 = dbinom(T1, n1, p1_penn) # tõenäosused P(T_1=j)
    names(pT1) = T1
    m = outer(pT0, pT1) # paaride (i,j) tõenäosused P(T_0=i,T_1=j)
    # jätame alles need paarid  (i,j), mille tõenäosus on piirist suurem
    piir = 1e-10
    v = which(m > piir, arr.ind = T)
    paarid = data.frame(i = as.numeric(rownames(m)[v[, 1]]),
                        j = as.numeric(colnames(m)[v[, 2]]))
    tulemused = NULL
    for (k in 1:nrow(paarid)){
        i = paarid[k,1] # kontrollid
        j = paarid[k,2] # juhud
        x = c(c(rep(1, i), rep(0, n0-i), c(rep(1, j), rep(0, n1-j)))) # CNV tunnus
        y = c(rep(0, n0), rep(1, n1)) #diagnoosi tunnus
        m1 = glm(y~x, family = binomial(link = "logit"))
        m2 = logistf(y~x, pl=F, firth=F)
        tulemused = rbind(tulemused,data.frame(glm.pvalue=last(coef(summary(m1))),
                                                glm.OR = last(exp(coef(m1))),
                                                firth.pvalue = last(m2$prob),
                                                firth.OR = last(exp(coef(m2))),
                                                p_ij = m[as.character(i),as.character(j)],
                                                p=p, p0=p0, OR=OR, p01=p01, p10=p10))
    }
    return(tulemused)
}


CNV kvaliteediskoori simuleerimine

library(logistf)
library(dplyr)
# valepositiivsete jaotus TÜ EGV andmete põhjal
S0 = function(n=1){
    u = runif(n,0,1)
    s1 = c(runif(sum((u<=0.02*25.5)),0,0.02),runif(sum(u>0.02*25.5),0.02,1))}
# õigepositiivsete jaotus TÜ EGV andmete põhjal
S1 = function(n=1){
    u = runif(n,0,1)
    s0 = c(runif(sum(u<=0.98*0.8),0,0.98),runif(sum(u>0.98*0.8),0.98,1))}
# N - valimimaht
# p - diagnoosi osakaal, p0 - kontrollide CNV osakaal,
# OR - tegelik šansside suhe
# p01 - valepositiivsuse määr, p10 - valenegatiivsuse määr
simulatsioon2 <- function(N, p, p0, OR, p01, p10, arv){
    n1 = N * p # juhtude arv
    n0 = N - n1 # kontrollide arv
    p1 = p0 * OR / (p0 * (OR - 1) + 1) # juhtude CNV osakaal
    p11 = 1 - p10 # õigepositiivsuse määr
    tulemused = NULL
    for (i in 1:arv) {
# kvaliteediskoori simuleerimine
QS = function(n,cnv_freq){
    u = runif(n,0,1)
    qs = c(S1(sum(u <= cnv_freq*p11)),
        S0(sum((u > cnv_freq*p11) & (u <= (cnv_freq*p11 + (1-cnv_freq)*p01)))),
        rep(0, sum(u>cnv_freq*p11 + (1-cnv_freq)*p01)))}
x = c(QS(n0, p0), QS(n1, p1)) # CNV tunnus
y = c(rep(0, n0), rep(1, n1)) # diagnoosi tunnus
m1 = glm(y~x, family = binomial(link = "logit"))
m2 = logistf(y~x)
tulemused = rbind(tulemused, data.frame(glm.pvalue=last(coef(summary(m1))),
                                        glm.OR = last(exp(coef(m1))),
                                        firth.pvalue = last(m2$prob),
                                        firth.OR = last(exp(coef(m2))),
                                        p=p, p0=p0, OR=OR, p01=p01, p10=p10))
}
  return(tulemused)
}