df <- fecrt_sim_unpaired(as.integer(100), as.double(c(0.1, 0.2)), as.integer(10), as.integer(10), as.double(20), as.double(1.0), as.double(0.8), matrix(as.double(c(0.9,0.95,0.8,0.95)), ncol=2, byrow=TRUE), as.double(c(1,1)), as.integer(1), as.integer(10000), as.integer(1), as.double(0.025))
df
summary(df)
table(df$Classification, useNA='always')
# Test c++ function:
estimate_k(as.double(10.0), as.double(5.0), as.double(10.0), as.double(5.0), as.double(2.0), as.logical(TRUE))
d1 <- rnbinom(10, 1, mu=10)
d2 <- rnbinom(10, 1, mu=5)
estimate_k(as.double(mean(d1)), as.double(var(d1)), as.double(mean(d2)), as.double(var(d2)), as.double(cov(d1,d2)), as.logical(TRUE))
estimate_k(as.double(mean(d1)), as.double(var(d1)), as.double(mean(d2)), as.double(var(d2)), as.double(-cov(d1,d2)), as.logical(TRUE))
# Recover true non-correlated variance:
v1 <- 12
v2 <- 10
m1 <- 200
m2 <- 100
vc <- 8
vcov <- matrix(c(v1,vc,vc,v2), ncol=2)
mdat <- MASS::mvrnorm(10^6, c(m1,m2), vcov)
vcv <- var(mdat)
mdat1 <- mdat[,1]
mdat2 <- mdat[,2]
cor(mdat[,1], mdat[,2])
cor(mdat[,1]*10, mdat[,2])
vcv
pdat1 <- rpois(nrow(mdat), mdat[,1])
pdat2 <- rpois(nrow(mdat), mdat[,2])
var(cbind(pdat1,pdat2))
cor(pdat1, pdat2)
cov(pdat1, pdat2)
cov(mdat1, mdat2)
(correctedcorr <- cov(pdat1,pdat2) / (sqrt(var(pdat1) - mean(pdat1)) * sqrt(var(pdat2) - mean(pdat2))))
cor(mdat1, mdat2)
cor(mdat1, mdat2)
cor(mdat1/mean(mdat1), mdat2/mean(mdat2))
cov(mdat1/mean(mdat1), mdat2/mean(mdat2)) / (sqrt(var(pdat1) - mean(pdat1))/mean(mdat1) * sqrt(var(pdat2) - mean(pdat2))/mean(mdat2))
cvar1 <- (var(pdat1) - mean(pdat1))
cvar2 <- (var(pdat2) - mean(pdat2))
(uncvar1 <- cvar1 - (correctedcorr * (sqrt(cvar1)*sqrt(cvar2))))
(v1-vc)
(uncvar2 <- cvar2 - (correctedcorr * (sqrt(cvar1)*sqrt(cvar2))))
(v2-vc)
dat_ctl <- pdat1
dat_tx <- pdat2
# This wasn't generated as gamma but this assumes the dist is gamma:
estimate_k(as.double(mean(dat_ctl)), as.double(var(dat_ctl)), as.double(mean(dat_tx)), as.double(var(dat_tx)), as.double(cov(dat_ctl/mean(dat_ctl), dat_tx/mean(dat_tx))))
# Still works comparing to the coefficient of variation though:
1 / (sd(mdat1)/mean(mdat1))^2
1 / (sd(mdat2)/mean(mdat2))^2
# TODO: work out kc/k1/k2 from real data and check sims here:
powersim_unpaired(rvs=1-seq(0.6,0.8,by=0.001), N=91, mu=74, k1=1.27, k2=1.57, ta=0.65, ti=0.7, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(0.6,0.8,by=0.001), N=91, mu=74, kc=1, k1=0.44, k2=0.54, ta=0.65, ti=0.7, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.4,0.6,by=0.001), N=91, mu=162, k1=2.56, k2=0.97, ta=0.45, ti=0.5, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(0.4,0.6,by=0.001), N=91, mu=162, kc=1.2, k1=0.82, k2=0.30, ta=0.45, ti=0.5, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.8,1,by=0.001), N=91, mu=1255, k1=0.18, k2=0.18, ta=0.9, ti=0.95, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(0.8,1,by=0.001), N=91, mu=1255, kc=0.5, k1=0.18, k2=0.18, ta=0.9, ti=0.95, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.8,1,by=0.001), N=50, mu=50, k1=0.18, k2=0.18, ta=0.9, ti=0.95, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.6,0.8,by=0.001), N=91, mu=74, k1=1.27, k2=1.57, ta=0.65, ti=0.7, iters=10^4, approx=1, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.8,1,by=0.001), N=10, mu=20, k1=0.18*3, k2=0.18*3, ta=0.9, ti=0.95, iters=10^3, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.94,0.96,by=0.001), N=20, mu=20, k1=0.18*3, k2=0.18*3, ta=0.95, ti=0.95, iters=10^4, approx=0, priors=c(0.0001,0.0001), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.94,0.96,by=0.001), N=20, mu=20, k1=0.18*3, k2=0.18*3, ta=0.95, ti=0.95, iters=10^4, approx=0, priors=c(0,10), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.94,0.96,by=0.001), N=20, mu=20, k1=0.18*3, k2=0.18*3, ta=0.95, ti=0.95, iters=10^4, approx=0, priors=c(0,10), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.94,0.96,by=0.001), N=20, mu=20, k1=0.18*3, k2=0.18*3, ta=0.95, ti=0.95, iters=10^4, approx=2, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.48,0.52,by=0.001), N=30, mu=30, k1=0.18*3, k2=0.18*3, ta=0.5, ti=0.5, iters=10^4, approx=0, priors=c(0,0), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.48,0.52,by=0.001), N=30, mu=30, k1=0.18*3, k2=0.18*3, ta=0.5, ti=0.5, iters=10^4, approx=2, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(-0.02,0.02,by=0.001), N=30, mu=30, k1=0.18*3, k2=0.18*3, ta=0, ti=0, iters=10^4, approx=0, priors=c(0.01,0.01), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.48,0.52,by=0.001), N=30, mu=30, k1=0.18*3, k2=0.18*3, ta=0.5, ti=0.5, iters=10^4, approx=0, priors=c(0.01,0.01), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.98,1,by=0.001), N=30, mu=30, k1=0.18*3, k2=0.18*3, ta=0.99, ti=0.99, iters=10^4, approx=0, priors=c(0.01,0.01), pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(0.98,1,by=0.001), N=10, mu=10, k1=0.18*3, k2=0.18*3, ta=0.99, ti=0.99, iters=10^4, approx=0, priors=c(0.01,0.01), pm=c('BNB','Levecke','MLE','WAAVP'))
findtheta(rnbinom(20,0.1,mu=20))
findtheta(c(0,0,0))
findtheta(c(1,10000,10^6))
d1 <- rnbinom(20,0.1,mu=20)
d2 <- rnbinom(20,1,mu=2)
estimate_k_ml(as.integer(d1),as.double(mean(d1)), as.double(var(d1)), as.integer(d2), as.double(mean(d2)), as.double(var(d2)), as.double(cov(d1,d2)), as.logical(TRUE))
estimate_k_ml(as.integer(d1),as.double(mean(d1)), as.double(var(d1)), as.integer(d2), as.double(mean(d2)), as.double(var(d2)), as.double(cov(d1,d2)), as.logical(FALSE))
powersim_unpaired(rvs=1-seq(0.48,0.52,by=0.001), N=10000, mu=10000, k1=1, k2=1, ta=0.5, ti=0.5, iters=10^3, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(0.48,0.52,by=0.001), N=1000, mu=1000, kc=1.5, k1=1, k2=1, ta=0.5, ti=0.5, iters=10^3, approx=1, pm=c('BNB','Levecke','MLE','WAAVP','Dobson'))
## THIS SHOWS A PROBLEM WITH ESTIMATING KC/K1/K2 FOR PAIRED:
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=30, mu=30, kc=1.5, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=30, mu=30, kc=11.6, k1=9.2, k2=5.6, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=30, mu=30, kc=0.5, k1=0.4, k2=0.4, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=30, mu=30, kc=5, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(0.48,0.52,by=0.001), N=30, mu=30, kc=1.5, k1=1, k2=1, ta=0.5, ti=0.5, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=100, mu=100, kc=5, k1=2, k2=2, ta=0, ti=0, iters=10^4, approx=1, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(-0.02,0.02,by=0.001), N=100, mu=100, k1=2, k2=2, ta=0, ti=0, iters=10^4, approx=1, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=100, mu=100, kc=2, k1=1, k2=1, ta=0, ti=0, iters=10^3, approx=1, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=20, mu=10, kc=2, k1=0.1, k2=0.1, ta=0, ti=0, iters=10^3, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'), useml=TRUE)
powersim_unpaired(rvs=1-seq(-0.02,0.02,by=0.001), N=20, mu=10, k1=0.1, k2=0.1, ta=0, ti=0, iters=10^3, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'), useml=TRUE)
# Test correlations:
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=50, mu=50, kc=1.2, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=50, mu=50, kc=1.5, k1=1.2, k2=0.8, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=91, mu=50, kc=2, k1=1.2, k2=0.8, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=50, mu=50, kc=2, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_paired(rvs=1-seq(-0.02,0.02,by=0.001), N=50, mu=50, kc=200, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(-0.02,0.02,by=0.001), N=50, mu=50, k1=1, k2=1, ta=0, ti=0, iters=10^4, approx=0, pm=c('BNB','Levecke','MLE','WAAVP'))
powersim_unpaired(rvs=1-seq(-0.02,0.02,by=0.001), N=10000, mu=1000, k1=1, k2=1, ta=0, ti=0, iters=10^3, approx=1, pm=c('BNB','Levecke','MLE','WAAVP'))
## Testing pbnb:
for(i in 0:10){
noninc <- ifelse(i==0, 0, pbnb(i-1, 1, 20, 20, TRUE, TRUE))
inc <- pbnb(i, 1, 20, 20, TRUE, TRUE)
print(inc - noninc)
}
for(i in 0:10){
noninc <- pbnb(i, 1, 20, 20, TRUE, FALSE)
inc <- pbnb(i, 1, 20, 20, TRUE, TRUE)
print(inc - noninc)
}
for(i in 0:10){
inc <- 1 - ifelse(i==0, 0, pbnb(i-1, 1, 20, 20, TRUE, TRUE))
noninc <- 1 - pbnb(i, 1, 20, 20, TRUE, TRUE)
print(inc - noninc)
}
for(i in 0:10){
noninc <- pbnb(i, 1, 20, 20, FALSE, FALSE)
inc <- pbnb(i, 1, 20, 20, FALSE, TRUE)
print(inc - noninc)
}
pbnb_upper(0, 1, 20, 20)
pbnb_lower(1, 1, 20, 20)
pbnb_upper(1, 1, 20, 20) - pbnb_lower(1, 1, 20, 20)
pbnb_upper(2, 1, 20, 20) - pbnb_lower(2, 1, 20, 20)
#powersim_unpaired(N=100)
powersim_unpaired(N=1000, approx=2)
powersim_unpaired(rvs=seq(0.25,0.75,by=0.001), ta=0.45, ti=0.5, N=500)
powersim_paired(kc=1.2, mu=50, k1=1, k2=1, N=1000)
powersim_paired(kc=0.8, mu=5, k1=0.5, k2=0.5, N=5, approx=0)
powersim_unpaired(mu=5, k1=0.5, k2=0.5, N=5, approx=0)
powersim_paired(kc=0.8, mu=5, k1=0.5, k2=0.5, N=5, approx=2)
# This is a nice illustration of continuous vs discrete:
powersim_unpaired(k1=1, k2=1, N=10, mu=10, approx=0)
powersim_unpaired(k1=1, k2=1, N=10, mu=10, approx=2)
powersim_paired(N=10, mu=10, approx=0)
powersim_paired(N=10, mu=10, approx=2)
powersim_unpaired(k1=1, k2=1, N=10, mu=50, approx=0)
powersim_unpaired(k1=1, k2=1, N=10, mu=50, approx=2)
powersim_paired(N=10, mu=50, approx=0)
powersim_paired(N=10, mu=50, approx=2)
powersim_unpaired(k1=1, k2=1, N=50, mu=50, approx=0)
powersim_unpaired(k1=1, k2=1, N=50, mu=50, approx=2)
powersim_paired(N=50, mu=50, approx=0)
powersim_paired(N=50, mu=50, approx=2)
powersim_unpaired(k1=1, k2=1, N=500, mu=500, approx=1)
powersim_paired(N=500, mu=500, approx=1)
powersim_unpaired(k1=1, k2=1, N=20, mu=50, approx=1, ta=0.95, ti=0.99)
# Performance is more similar with ta around 0.5:
powersim_unpaired(rvs=seq(0.25,0.75,by=0.01), N=50, mu=50, approx=1, ta=0.5, ti=0.55)
powersim_paired(rvs=seq(0.25,0.75,by=0.01), N=20, mu=50, approx=1, ta=0.5, ti=0.55)
powersim_unpaired(k1=2, k2=2, N=50, mu=20, approx=2, pm='BNB')
powersim_unpaired(k1=0.26, k2=0.26, N=50, mu=20, approx=0, pm='BNB')
## How to generate correlated gamma variates?
mu <- 200
red <- 0.1
N <- 10^4
k_ctl <- 0.8
k_tx <- 0.6
c <- 0.8
b1 <- c - k_ctl
b2 <- c - k_tx
gams <- rgamma(N, c, scale=1)
mval_ctl <- rbeta(N, k_ctl, b1) * gams * mu/k_ctl
mval_tx <- rbeta(N, k_tx, b2) * gams * (mu*red)/k_tx
mean(mval_ctl)^2/var(mval_ctl)
mean(mval_tx)^2/var(mval_tx)
dat_ctl <- rpois(N, mval_ctl)
dat_tx <- rpois(N, mval_tx)
mean(dat_ctl)^2 / (var(dat_ctl)-mean(dat_ctl))
mean(dat_tx)^2 / (var(dat_tx)-mean(dat_tx))
cor(dat_ctl, dat_tx)
estimate_k(as.double(mean(dat_ctl)), as.double(var(dat_ctl)), as.double(mean(dat_tx)), as.double(var(dat_tx)), as.double(cov(dat_ctl/mean(dat_ctl), dat_tx/mean(dat_tx))))
var_eff_ctl = var(dat_ctl) - mean(dat_ctl);
var_eff_tx = var(dat_tx) - mean(dat_tx);
scaled_cov = as.double(cov(dat_ctl/mean(dat_ctl), dat_tx/mean(dat_tx)))
sdprod = sqrt(var_eff_ctl) * sqrt(var_eff_tx)
c_cor <- (scaled_cov * mean(dat_ctl) * mean(dat_tx)) / sdprod
c_cor <- scaled_cov / sdprod
var_eff_ctl
var_eff_ctl * (1-cor(dat_ctl, dat_tx))
var_eff_tx
var_eff_tx * (1-cor(dat_ctl, dat_tx))
var(dat_tx)-mean(dat_tx)
estimate_k(as.double(mean(dat_ctl)), as.double(var(dat_ctl)), as.double(mean(dat_tx)), as.double(var(dat_tx)), as.double(cov(dat_ctl, dat_tx)))
k_ctl
k_tx
# Approximating Beta_NB with gamma:
r=k <- 125
a <- 167
b <- 436
it <- 10^6
# Swap successes and failures:
sim <- rnbinom(it, k, prob=rbeta(it, a, b))
mean(sim)
var(sim)
p = (a/(a+b))
bb <- a
aa <- b
(totalvar = ((r*(aa+r-1)*bb*(aa+bb-1))/((aa-2)*(aa-1)^2)))
var(sim)
(totalmean = (r*bb)/(aa-1))
mean(sim)
(scale = totalvar/totalmean)
(shape = totalmean/scale)
gsim <- rgamma(it, shape, scale=scale)
plot.ecdf(sim)
plot.ecdf(gsim, col='red', add=TRUE)
sum <- 54
pbnb(sum, k, aa, bb, TRUE)
pgamma(sum+0.5, shape, scale=scale, lower=TRUE)
pbnb(sum, k, aa, bb, FALSE)
pgamma(sum-0.5, shape, scale=scale, lower=FALSE)
# Using a Poisson approximation to the hypergeometric:
library('hypergeo')
hypergeo(r,a,a+b+r,exp(sum))
var(rbeta(10^4,a,b)*rgamma(10^4,c,1))
var(rgamma(10^4,a,1))
df <- fecrt_sim_unpaired(as.integer(1000), 0.049, as.integer(20), as.integer(20), as.double(20), as.double(1.0), as.double(0.8), matrix(as.double(c(0.9,0.95)), ncol=2, byrow=TRUE), as.double(c(1,1)), as.integer(1), as.integer(10000), as.integer(1), as.double(0.025))
summary(df$ObsReduction)
# If the reduction is identical in all animals, should we have a reduced CI as for the Levecke and WAAVP methods ...? This does kind of make sense.
#
pre <- rnbinom(10, 1, mu=100)
post <- round(pre*0.1)
methodcomp(as.integer(sum(pre)), as.integer(length(pre)), as.double(1.0), as.double(mean(pre)), as.double(var(pre)), as.integer(sum(post)), as.integer(length(post)), as.double(1.0), as.double(mean(post)), as.double(var(post)), as.double(cov(pre,post)), as.double(1.0), as.double(0.9), as.double(0.95), as.double(c(1.0,1.0)), as.integer(1), as.integer(10000), as.integer(1), as.double(0.025))
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=TRUE, paired_data=TRUE, paired_analysis=FALSE, preN=20, premean=50, animalk=1, efficacyk=2, prek=2, postk=2)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=TRUE, paired_data=TRUE, paired_analysis=TRUE, preN=20, premean=50, animalk=1, efficacyk=2, prek=2, postk=2)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=FALSE, paired_data=TRUE, paired_analysis=FALSE, preN=20, premean=50, animalk=0.001, efficacyk=0.5, prek=1000, postk=1000)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=FALSE, paired_data=TRUE, paired_analysis=TRUE, preN=20, premean=50, animalk=0.001, efficacyk=0.5, prek=1000, postk=1000)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=FALSE, paired_data=FALSE, paired_analysis=FALSE, preN=50, premean=50, animalk=1, efficacyk=1, prek=1, postk=0.1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=TRUE, paired_data=FALSE, paired_analysis=FALSE, preN=50, premean=50, animalk=1, efficacyk=1, prek=1, postk=0.1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=1, efficacyk=1, prek=1, postk=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
# This works well when non-paired knows the true k
# So is it possible to guess the animal/efficacyk from the covariance and then add this to observed post k?
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, use_truek=TRUE, k_change=0.001, paired_data=TRUE, paired_analysis=FALSE, preN=50, premean=50, animalk=0.5, efficacyk=0.15, prek=1, postk=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=0.15, prek=1, postk=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=FALSE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, rep_pre=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, rep_pre=2)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, rep_pre=0.5)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, edt_pre=1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, edt_pre=10)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired_data=TRUE, paired_analysis=TRUE, preN=50, premean=50, animalk=0.5, efficacyk=1, prek=1, postk=1, edt_pre=0.1)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
stop('rep and edt pre dont work properly')
pre <- c(139,0,0,0,0,0,0,0,0,0)
post <- c(6,0,0,0,0,0,0,0,0,0)
res <- bayescount:::fecrt_analyses(pre, post, true_k=1, k_change=1)
res
139, 10, 1.000000, 13.900000, 411.211111, 6, 10, 1.000000, 0.600000, 0.488889, 0.000000, 1.000000, 0.900000, 0.950000, 1.000000, 1.000000, 1, 0, 10000, 0.016286, 0.601419
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired=FALSE, iterations=1)
pre = c(7, 12, 8, 31, 37, 68, 74, 40, 1, 53);post = c(2, 0, 9, 1, 0, 0, 4, 1, 10, 2)
mean(pre)
mean(pre)^2 / (var(pre)-mean(pre))
mean(post)
mean(post)^2 / (var(post)-mean(post))
library('bayescount')
otu <- bayescount:::fecrt_power_wrap(reduction=0.9, paired=FALSE)
otp <- bayescount:::fecrt_power_wrap(reduction=0.9, paired=TRUE)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
sum(otp$p_1 < 0.025) / nrow(otp)
sum(otp$p_2 < 0.025) / nrow(otp)
getstats <- function(H0_1=0.9, H0_2=0.95, ...){
otu <- bayescount:::fecrt_power_wrap(reduction=H0_1, H0_1=H0_1, H0_2=H0_2, paired=FALSE, ...)
otp <- bayescount:::fecrt_power_wrap(reduction=H0_1, H0_1=H0_1, H0_2=H0_2, paired=TRUE, ...)
power_1 <- c(sum(otu$p_1 < 0.025) / nrow(otu), sum(otp$p_1 < 0.025) / nrow(otp))
err_2 <- c(sum(otu$p_2 < 0.025) / nrow(otu), sum(otp$p_2 < 0.025) / nrow(otp))
otu <- bayescount:::fecrt_power_wrap(reduction=H0_2, H0_1=H0_1, H0_2=H0_2, paired=FALSE, ...)
otp <- bayescount:::fecrt_power_wrap(reduction=H0_2, H0_1=H0_1, H0_2=H0_2, paired=TRUE, ...)
err_1 <- c(sum(otu$p_1 < 0.025) / nrow(otu), sum(otp$p_1 < 0.025) / nrow(otp))
power_2 <- c(sum(otu$p_2 < 0.025) / nrow(otu), sum(otp$p_2 < 0.025) / nrow(otp))
ret <- expand.grid(Rate=NA, Method=c('Paired','Unpaired'), Hypothesis=1:2, Type=c('Power','Error'))[,4:1]
ret$Rate <- c(power_1, power_2, err_1, err_2)
return(ret)
}
getstats()
it <- 1000
pvals1=pvals2=obsred <- numeric(it)
premu <- 20
pb <- txtProgressBar(style=3)
for(i in 1:it){
pre <- rnbinom(20, 1, mu=premu)
post <- rnbinom(20, 1, mu=premu*0.11)
#post <- rnbinom(20, 1, mu=pre*0.1)
res <- bayescount:::fecrt_analyses(pre, post)
pvals1[i] <- res$p1[res$Method=='BNB unpaired']
pvals2[i] <- res$p2[res$Method=='BNB unpaired']
# pvals1[i] <- res$p1[res$Method=='BNB paired']
# pvals2[i] <- res$p2[res$Method=='BNB paired']
obsred[i] <- 1- mean(post)/mean(pre)
setTxtProgressBar(pb, i/it)
}
close(pb)
sum(pvals1 < 0.025) / it
sum(pvals2 < 0.025) / it
hist(obsred, breaks='fd')
hist(pvals1, breaks='fd')
library('bayescount')
preN <- 20
premean <- 20
prek <- 1
postk <- 1
otu <- bayescount:::fecrt_power_wrap(reduction=0.99, paired=FALSE, preN=preN, premean=premean, prek=prek, postk=postk)
otp <- bayescount:::fecrt_power_wrap(reduction=0.99, paired=TRUE, preN=preN, premean=premean, prek=prek, postk=postk)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
sum(otp$p_1 < 0.025) / nrow(otp)
sum(otp$p_2 < 0.025) / nrow(otp)
otu <- bayescount:::fecrt_power_wrap(reduction=0.95, paired=FALSE, preN=preN, premean=premean, prek=prek, postk=postk)
otp <- bayescount:::fecrt_power_wrap(reduction=0.95, paired=TRUE, preN=preN, premean=premean, prek=prek, postk=postk)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
sum(otp$p_1 < 0.025) / nrow(otp)
sum(otp$p_2 < 0.025) / nrow(otp)
otu <- bayescount:::fecrt_power_wrap(reduction=0.89, paired=FALSE, preN=preN, premean=premean, prek=prek, postk=postk)
otp <- bayescount:::fecrt_power_wrap(reduction=0.89, paired=TRUE, preN=preN, premean=premean, prek=prek, postk=postk)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
sum(otp$p_1 < 0.025) / nrow(otp)
sum(otp$p_2 < 0.025) / nrow(otp)
hist(otu$ObsEfficacy, breaks='fd', xlim=c(0.5,1))
hist(otu$p_1, breaks='fd')
otu <- bayescount:::fecrt_power_wrap(reduction=0.85, paired=FALSE, preN=preN, premean=premean, prek=prek, postk=postk)
otp <- bayescount:::fecrt_power_wrap(reduction=0.85, paired=TRUE, preN=preN, premean=premean, prek=prek, postk=postk)
sum(otu$p_1 < 0.025) / nrow(otu)
sum(otu$p_2 < 0.025) / nrow(otu)
sum(otp$p_1 < 0.025) / nrow(otp)
sum(otp$p_2 < 0.025) / nrow(otp)
it <- 10000
pvals1=pvals2=obsred <- numeric(it)
premu <- 20
pb <- txtProgressBar(style=3)
for(i in 1:it){
pre <- rnbinom(20, 1, mu=premu)
post <- rnbinom(20, 1, mu=premu*0.11)
#post <- rnbinom(20, 1, mu=pre*0.1)
obsred[i] <- 1- mean(post)/mean(pre)
setTxtProgressBar(pb, i/it)
}
close(pb)
hist(obsred, breaks='fd', xlim=c(0.5,1))
if(FALSE){
pow <- function(x,i) x^i
var1 <- var(pre)
var2 <- var(post)
cov12 <- cov(pre,post)
mu1 <- mean(pre)
mu2 <- mean(post)
varred = pow(mu2/mu1, 2) * (var1/pow(mu1,2) + var2/pow(mu2,2))
varred
varred = pow(mu2/mu1, 2) * (var1/pow(mu1,2) + var2/pow(mu2,2) - 2.0 * cov12 * sqrt(var1) * sqrt(var2) / (mu1 * mu2))
varred
Nd = length(pre)
r = mu2/mu1;
shape = (pow(r, 2) * Nd) / varred;
scale = varred / (r * Nd);
1-qgamma(c(0.975,0.025),shape,scale=scale)
}
bayescount:::fecrt_analyses(pre, post)
cor(pre,post)
bayescount:::fecrt_analyses(pre, post, replicates_ratio=1.5, edt_ratio=0.7)
bayescount:::fecrt_analyses(pre, post, edt_ratio=0.5)
bayescount:::fecrt_analyses(pre, c(0,0))
bayescount:::waavp_ci(pre, post, tail=0.025)
bayescount:::dobson_ci(pre, post)
bayescount:::conjbeta_ci(pre, post)
bayescount:::asymptotic_ci(pre, post)
bayescount:::fecrt_bnb(pre, post)
pre <- rnbinom(10, 1, mu=10)
post <- rnbinom(10, 1, mu=0.01)
bayescount:::waavp_ci(pre, post)
bayescount:::dobson_ci(pre, post)
bayescount:::conjbeta_ci(pre, post)
bayescount:::asymptotic_ci(pre, post)
bayescount:::fecrt_bnb(pre, post)
bayescount:::fecrt_power_comparison_wrap(reduction=0.99)
bayescount:::fecrt_power_comparison_wrap(reduction=0.95)
bayescount:::fecrt_power_comparison_wrap(reduction=0.9)
bayescount:::fecrt_power_comparison_wrap(reduction=0.8)
bayescount:::fecrt_power_wrap(reduction=0.99, H0_1=c(0.8,0.9), H0_2=c(0.99, 0.95))
bayescount:::fecrt_power_wrap(reduction=0.95, H0_1=c(0.8,0.9), H0_2=c(0.99, 0.95))
bayescount:::fecrt_power_wrap(reduction=0.9, H0_1=c(0.8,0.9), H0_2=c(0.99, 0.95))
bayescount:::fecrt_power_wrap(reduction=0.8, H0_1=c(0.8,0.9), H0_2=c(0.99, 0.95))
# bnb_pres(preN, presum, preK, postN, postsum, postK, H0_1, H0_2, prob_priors, delta, beta_iters){
bayescount:::bnb_ps(preN=100, presum=556724, preK=0.011865, postN=100, postsum=5405, postK=0.028920, H0_1=0.9, H0_2=0.95, prob_priors=c(1,1), delta=1, beta_iters=10^4)
mu = 0.9999
s2 = 0.000100
if(s2 > (mu * (1-mu)))
s2 <- (mu * (1-mu))*(1-10^-6)
ab = mu * (1.0 - mu) / s2 -1
mu * ab
(1-mu)*ab
# The asymptotic p-values seem to be quite close although asymptotic ones are always smaller:
predata <- rnbinom(1000, 0.1, mu=100)
postdata <- rnbinom(1000, 0.1, mu=6)
H0_1 <- 0.9
H0_2 <- 0.95
ps <- bayescount:::fecrt_bnb(predata, postdata, H0_1=H0_1, H0_2=H0_2)
format(ps[c(1,3)], scientific=FALSE)
format(ps[c(2,4)], scientific=FALSE)
# Something is broken with BNB when preN!=postN
red_se <- sqrt(((mean(postdata)^2) / (mean(predata)^4) * var(predata) + (mean(predata)^-2) * var(postdata)) / min(length(predata), length(postdata)))
meanchange = (1.0 - H0_1);
pnorm(meanchange,mean(postdata)/mean(predata),red_se,FALSE);
meanchange = (1.0 - H0_2);
pnorm(meanchange,mean(postdata)/mean(predata),red_se,TRUE);
# Small k is fine whatever:
bayescount:::pbnb1(10^4, 0.1, 16865.085493, 19481.403311)
bayescount:::pbnb1(10^6, 0.1, 16865.085493, 19481.403311)
# Small post sum is fine whatever:
bayescount:::pbnb1(100, 1, 16865.085493, 19481.403311)
bayescount:::pbnb1(100, 100, 16865.085493, 19481.403311)
bayescount:::pbnb1(100, 1000, 16865.085493, 19481.403311)
# Big k and big post sum is a problem:
bayescount:::pbnb1(1000, 1000, 16865.085493, 19481.403311)
# So use the asymptotic unpaired method when effK is big and obs sum is big
# Can still get p-value from asymptotic method
k <- 1000
alpha <- 168
beta <- 194
sum <- 100
bayescount:::pbnb1(sum, k, alpha, beta)
mean <- k*beta / (alpha-1)
var <- k*(alpha+k-1)*beta*(alpha+beta-1) / ((alpha-2)*(alpha-1)^2)
pnorm(sum, mean, sqrt(var))
predata <- rnbinom(10000, 10, mu=1000)
postdata <- rnbinom(10000, 10, mu=mean(predata)*0.05)
postdata <- rnbinom(10000, 10, mu=0.05)
sum(postdata)
bayescount:::fecrt_bnb(predata, postdata, H0_1=0.9, H0_2=0.95)
testing <- bayescount:::fecrt_power_wrap(reduction=0.95, preN=10^4, iterations=10, premean=1000)
testing
bayescount:::pbnb2(1036, 1000, 16865.085493, 19481.403311)
bayescount:::pbnb2(1036, 1000, 16865.085493, 19481.403311)
r=471
a=-7475.245189
n=-753.642449
bn=9352.048569
rp=r+1
((r-a)*(r-n))/(rp*(bn+rp))
A <- 10
dN <- 34
dn <- 12
dr <- 0.01
A * log((A*dN)/(dn*dr))
A * ((log(A)+log(dN)) - (log(dn)+log(dr)))
A * (log(A) + log(dn) - log(dN) - log(dr))
library('tidyverse')
ans <- bayescount:::fecrt_power_wrap(reduction=0.95, H0_1=c(0.8,0.9), H0_2=c(0.99, 0.95), iterations=10^4)
ans %>% group_by(H0_1, H0_2, TrueEfficacy, Classification) %>% tally
ans <- bayescount:::fecrt_power_wrap(reduction=0.95, H0_1=c(0.8), H0_2=c(0.99), iterations=10^4)
ans %>% group_by(H0_1, H0_2, Classification) %>% tally
ans <- bayescount:::fecrt_power_wrap(reduction=0.95, H0_1=c(0.9), H0_2=c(0.95), iterations=10^4)
ans %>% group_by(H0_1, H0_2, Classification) %>% tally
length(rv$p_1)
rv=ans
### OLDER
tt <- bayescount:::asymptotic_ci_wrap(1:10, 1:10)
fpr <- bayescount:::fecrt_power_wrap(paired=FALSE, iterations=10000, trues=0.90, rep_pre=1, rep_post=10, edt_pre=1, edt_post=0.1, preN=40, postN=40)
fpr <- bayescount:::fecrt_power_wrap(iterations=100000, red=0.9, pair_type=0)
fpr$classifications[1] / 100000
fpr$classifications[4] / 100000
fpr <- bayescount:::fecrt_power_wrap(iterations=10000, red=0.9, pair_type=1, delta=0)
fpr$classifications[1] / 10000
fpr$classifications[4] / 10000
# TOFIX:
# Failure values: p1: nan, p2: nan (presum: 235, preN: 20, prek: 0.183922, postsum: 16, postN: 20, postk: 6.080000, lt: 0.900000, ut: 0.950000)
rv <- bayescount:::fecrt_pee_direct(235, 20, 0.183922, 16, 20, 6.080000, 0.9, 0.95, delta=0)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_direct(235, 20, 0.183922, 16, 20, 6.080000, 0.9, 0.95, delta=1)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_direct(235, 20, 0.183922, 16, 20, 6.080000, 0.9, 0.95, delta=2)
rv$p_1; rv$p_2
# Failure values: p1: 0.626118, p2: nan (presum: 148, preN: 20, prek: 0.147283, postsum: 14, postN: 20, postk: 0.721705, lt: 0.900000, ut: 0.950000)
rv <- bayescount:::fecrt_pee_direct(148, 20, 0.147283, 14, 20, 0.721705, 0.9, 0.95)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_direct(148, 20, 0.147283, 100, 20, 0.721705, 0.9, 0.95)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_direct(148, 20, 0.147283, 0, 20, 0.721705, 0.9, 0.95)
rv$p_1; rv$p_2
pre <- rnbinom(20,1,mu=20)
post <- rnbinom(20,1,mu=1.5)
rv <- bayescount:::fecrt_pee_wrap(pre, post, delta=0)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_wrap(pre, post, delta=2)
rv$p_1; rv$p_2
post <- rnbinom(20,1,mu=0.1)
rv <- bayescount:::fecrt_pee_wrap(pre, post, delta=0)
rv$p_1; rv$p_2
rv <- bayescount:::fecrt_pee_wrap(pre, post, delta=2)
rv$p_1; rv$p_2
fpr$classifications[6] / 10000
fpr$classifications[9] / 10000
summary(fpr$obsred)
##### Christian's approach
r_mle <- function(pre, post){
stopifnot(length(post)==length(pre))
return(sum(post) / sum(pre))
}
mu1_mle <- function(pre){
return(sum(pre) / length(pre))
}
sig2 <- function(pre, post){
stopifnot(length(pre)==length(post))
N <- length(pre)
r <- r_mle(pre, post)
mu1 <- mu1_mle(pre)
p1 <- 1/(r*mu1)
p2 <- 1/(r*mu1) * 1/(N-1) * sum((pre-mean(pre))^2)
p3 <- - (mu1 / (r*mu1)^2)
p4 <- - (mu1 / (r*mu1)^2) * 1/(N-1) * sum((post-mean(post))^2)
return(p1*p2 + p3*p4)
}
# Wrong but kind of works:
sig2 <- function(pre, post){
stopifnot(length(pre)==length(post))
N <- length(pre)
r <- r_mle(pre, post)
mu1 <- mu1_mle(pre)
p1 <- 1/(r*mu1)
p2 <- 1/(N-1) * sum((pre-mean(pre))^2) * 1/(r*mu1) # Can also be / 1/(r*mu1) so OK when 1/(N-1)(r*mu1) == (r*mu1)/(N-1) ??
p3 <- - (mu1 / (r*mu1)^2)
p4 <- - (mu1 / (r*mu1)^2) * 1/(N-1) * sum((post-mean(post))^2)
return(1/(N-1)*p1*p2 + 1/(N-1)*p3*p4)
} # with N=1000 and tr=0.2 and any k/mu
# Work off this??
sig2 <- function(pre, post, k){
stopifnot(length(pre)==length(post))
N <- length(pre)
r <- r_mle(pre, post)
mu1 <- mu1_mle(pre)
p1 <- 1/(r*mu1)
p2 <- 1/(N-1) * sum((pre-mean(pre))^2) * 1/(r*mu1)
p3 <- - (mu1 / (r*mu1)^2)
p4 <- - (mu1 / (r*mu1)^2) * 1/(N-1) * sum((post-mean(post))^2)
# mu1+k*mu1^2; (1/(N-1))*sum((pre-mean(pre))^2)
# r*mu1+k*r^2*mu1^2; (1/(N-1))*sum((post-mean(post))^2)
p1 <- 1/(N-1) * p1
p3 <- 1/(N-1) * p3
return(p1*p2 + p3*p4)
}
sig2 <- function(pre, post, k){
stopifnot(length(pre)==length(post))
N <- length(pre)
r <- r_mle(pre, post)
mu1 <- mu1_mle(pre)
p1 <- 1/(r*mu1)
p2 <- 1/(N-1) * sum((pre-mean(pre))^2) * 1/(r*mu1)
p3 <- - (mu1 / (r*mu1)^2)
p4 <- - (mu1 / (r*mu1)^2) * 1/(N-1) * sum((post-mean(post))^2)
p1 <- 1/(N-1) * p1
p3 <- 1/(N-1) * p3
return(p1*p2 + p3*p4)
}
sig2 <- function(pre, post, k){
stopifnot(length(pre)==length(post))
N <- length(pre)
r <- r_mle(pre, post)
mu1 <- mu1_mle(pre)
p1 <- 1/(r*mu1)
p2 <- sum((pre-mean(pre))^2) * 1/(N-1) * 1/(r*mu1)
p3 <- - (mu1 / (r*mu1)^2)
p4 <- - (mu1 / (r*mu1)^2) * 1/(N-1) * sum((post-mean(post))^2)
# mu1 + (mu1^2)/k; (1/(N-1))*sum((pre-mean(pre))^2)
# r*mu1+r^2*mu1^2/k; (1/(N-1))*sum((post-mean(post))^2)
# p1 <- 1/(N-1) * p1
# p3 <- 1/(N-1) * p3
return(p1*p2 + p3*p4)
}
mu <- 1000
k <- 10
r <- 0.5
(mu + 1/k * mu^2) / (r*mu)^2 + mu^2/(r*mu)^4 * (r*mu + 1/k*r^2*mu^2)
s1 <- rnbinom(10000, k, mu=mu)
s2 <- rnbinom(10000, k, mu=mu*r)
ratio <- s2/s1
mean(ratio[ratio < Inf])
median(ratio[ratio < Inf])
sd(ratio[ratio < Inf])
r=a1=a2 <- 1
mu1 <- sample(250:1000,1)
delta2a = (mu1 + a1 * mu1^2) / (r*mu1)^2 + mu1^2/(r*mu1)^4 * (r*mu1 + a2*r^2*mu1^2)
delta2a
delta2b
# Fix r at 1:
r <- 0.8
# Randomly sample other parameters:
mu1 <- exp(runif(1, log(1), log(100)))
a1 <- runif(1, 0.1, 5)
a2 <- runif(1, 0.1, 5)
N <- sample(250:1000, 1)
# Monte Carlo approximation to the distribution of the ML estimator for r:
ratios <- sapply(1:1000, function(x) sum(rnbinom(N,size=1/a2,mu=mu1*r))/sum(rnbinom(N,size=1/a1,mu=mu1)))
# Generally good approximation to normal for the parameter ranges chosen:
hist(ratios, breaks='fd')
# Monte Carlo approximation to the variance of the distribution of ML estimator:
var(ratios)
# Direct calculation of the same quantity:
delta2 = (mu1 + a1 * mu1^2) / (r*mu1)^2 + mu1^2/(r*mu1)^4 * (r*mu1 + a2*r^2*mu1^2)
1/N * delta2
# Relative error:
(1/N * delta2 - var(ratios)) / var(ratios)
# Good agreement
# ECDF plots of both curves for good measure:
plot.ecdf(ratios, col='blue')
plot.ecdf(rnorm(10000, r, sd=sqrt(1/N * delta2)), col='red', add=TRUE)
### Best attempt:
# Obs vs calculated variances:
sum((pre-mean(pre))^2) / (N-1)
var(pre)
mu + mu^2 / k
sum((post-mean(post))^2) / (N-1)
var(post)
tr*mu + tr^2*mu^2 / k
# Assuming known mu, r, k:
sig2k <- function(mu1, r, k){
a1 <- 1/k
a2 <- 1/k
return((mu1+a1+mu1^2)/(r*mu1)^2 + (mu1^2/(r*mu1)^4 * (r*mu1 + a2*r^2*mu1^2)))
}
N <- 1000 #sample(250:1000,1)
k <- 10 #round(runif(1,0.1,5), 1)
mu <- 10000 #round(runif(1,5,100))
tr <- 0.2 #round(runif(1,0,0.25), 2)
iters <- 1000
reds <- numeric(iters)
for(i in 1:iters){
post <- rnbinom(N, size=k, mu=mum*rm)
pre <- rnbinom(N, k, mu=mum)
reds[i] <- sum(post) / sum(pre)
}
hist(reds, freq=FALSE, main=paste('k:', k, ', mu:', mu, ', r:', tr, ', N:', N), breaks='fd')
curve(dnorm(x, tr, sd=sqrt(1/N * sig2k(mu, tr, k))), col='red', add=TRUE)
sqrt(1/N * sig2k(mu, tr, k))
# If r=k=1:
a1=a2=r <- 1
m <- mu1
(mu1+a1+mu1^2)/(r*mu1)^2 + (mu1^2/(r*mu1)^4 * (r*mu1 + a2*r^2*mu1^2))
(m+1+m^2) / m^2 + (m+m^2)/m^2
m <- 10:100
var <- (m+1+m^2) / m^2 + (m+m^2)/m^2
plot(m, sqrt(var/50), type='l')
sig2d(mu,tr,k)
trues2 <- (mu1+k*mu1^2)/(r*mu1)^2 + (mu1^2/(r*mu1)^4 * (r*mu1 + k*r^2*mu1^2))
curve(dnorm(x,mu-(tr*mu),sqrt(trues2/N)), from=0, to=mu)
# There is some interaction between tr and N, but k and mu about right
# But this is just coincidence for correct sd
N <- 1000
pre <- rnbinom(N, size=k, mu=mu)
post <- rnbinom(N, size=k, mu=mu*tr)
s2 <- sig2(pre, post, 1/k)
trues2
s2
curve(dnorm(x, r_mle(pre, post), sd=sqrt(1/N * s2)), main='Sampling distribution of r')
###### Compare this to fecrt_precision
rm <- r_mle(pre, post)
mum <- mu1_mle(pre)
mdiff <- mean(pre) - mean(post)
iters <- 1000
diffs=reds <- numeric(iters)
for(i in 1:iters){
post <- rnbinom(N, k, mu=mum*rm)
pre <- rnbinom(N, k, mu=mum)
reds[i] <- sum(post) / sum(pre)
diffs[i] <- mean(pre) - mean(post)
}
hist(reds, freq=FALSE, main=paste('k:', k, ', mu:', mu, ', r:', tr, ', N:', N))
curve(dnorm(x, rm, sd=sqrt(1/N * s2)), col='red', add=TRUE)
hist(diffs, freq=FALSE, main=paste('k:', k, ', mu:', mu, ', r:', tr, ', N:', N))
curve(dnorm(x, mdiff, sd=sqrt(sig2d(mu,tr,k)/N)), col='red', add=TRUE)
ar <- rnorm(iters, rm, sd=sqrt(1/N * s2))
qqplot(reds, ar)
abline(0,1)
sums <- sapply(1:1000, function(x) return(sum(rnbinom(N,k,prob))))
inds <- rnbinom(1000,N*k,prob)
qqplot(sums, inds); abline(0,1)
N <- 20
k <- 1.5
pre <- rnbinom(N, k, mu=20)
post <- rnbinom(N, k, mu=20*0.1)
fecrt_pval <- bayescount:::reduction_pval
bayescount:::reduction_pval(pre, post, delta=FALSE)
sum(post)
post <- rnbinom(N, k, mu=20*0.2)
pre <- rnbinom(N, k, mu=20)
fecrt_pval(pre, post, true_k=1)
fecrt_pval(pre, post, true_k=NA)
post <- rnbinom(N, k, mu=20*0.075)
fecrt_pval(pre, post)
post <- rnbinom(N, k, mu=20*0.01)
fecrt_pval(pre, post)
post <- rnbinom(N, k, mu=20*0.1)
fecrt_pval(pre, post)
bayescount:::pbeta_nbinom(12, 1.5, 27, 2800)
meanp <- 27/(27+2800)
meanp
sim <- rnbinom(1000, 1.5, meanp)
bayescount:::pbeta_nbinom(12, 1.5, 26.617355, 2794.419795)
bayescount:::pghyper(12, -2794.419795, -27.967380, 25.617355)
pre
it <- 10^7
s <- Sys.time()
cbt <- .C('conjbeta_ci_wrap', preN=as.integer(N), presum=as.integer(sum(pre)), preK=as.numeric(k), postN=as.integer(N), postsum=as.integer(sum(post)), postK=as.numeric(k), iters=as.integer(it), prob_priors=as.numeric(c(1,1)), lci_c=as.numeric(0.025), uci_c=as.numeric(0.975), ci_l=as.numeric(0), ci_u=as.numeric(0), PACKAGE='bayescount')
cbt
difftime(Sys.time(), s)
s <- Sys.time()
b1 <- rbeta(it, N*k +1, sum(pre) +1)
b2 <- rbeta(it, N*k +1, sum(post) +1)
m1 <- k / b1 - k;
m2 <- k / b2 - k;
quantile(1- m2/m1, prob=c(0.025,0.975))
difftime(Sys.time(), s)
# Why doesn't reserve and push_back work on the laptop?
ps <- c(0.1,0.9)
qbeta(ps, 10, 5) / qbeta(ps[2:1], 10, 7)
get_waavp <- function(pre, post){
arith.pre <- mean(pre)
arith.post <- mean(post)
var.pre <- var(pre)
var.post <- var(post)
var.red <- ifelse(var.post==0, 0, var.post/(length(post) * arith.post^2)) + var.pre/(length(pre) * arith.pre^2)
return((1 - (arith.post/arith.pre * exp(c(-1,1)*2.048 * sqrt(var.red)))))
}
N <- 10
k <- 0.5
pre <- rnbinom(N, k, mu=20)
post <- rnbinom(N, k, mu=20*0.1)
unlist(fecrt_pval(pre, post))
fecrt_pval(pre, post, delta=FALSE)
round(get_pee(pre, post), 5)
tval <- 2.048
wvp <- .C('waavp_ci_wrap', presum=as.integer(sum(pre)), predata=as.integer(pre), preN=as.integer(length(pre)), postsum=as.integer(sum(post)), postdata=as.integer(post), postN=as.integer(length(post)), tval=as.numeric(tval), ci_l=as.numeric(0), ci_u=as.numeric(0))
wvp
get_waavp(pre, post)
res <- testpees(1000)
summary(res[,1]-res[,5])
summary(res[,2]-res[,6])
# Nothing wrong with underlying pval function
res2 <- fecrt_pvals(iterations=10000, N=10, pre_mean=50, reduction=0.01, pre_k=1)
table(Sus=res[,1]<0.025, Res=res[,2]<0.025)
table(Sus=res[,5]<0.025, Res=res[,6]<0.025)
table(Sus=res2[,1]<0.025, Res=res2[,2]<0.025)
# Can provoke a high error rate only with big discrepancy between pre and post k
# This can be offset with k_change=0.8 though
prek=1.5
postk=1.5
res2 <- fecrt_pvals(N=10, pre_mean=100, reduction=0.11, pre_k=prek, post_k=postk, k_change=1)
table(Sus=res2[,1]<0.025, Res=res2[,2]<0.025)
res <- testpees(N=20, premean=50, reduction=0.04, k=prek, postk=postk)
table(Sus=res[,1]<0.025, Res=res[,2]<0.025)
table(Sus=res[,5]<0.025, Res=res[,6]<0.025)
lci_c <- 0.025
uci_c <- 0.975
dobson_priors <- c(1,1)
dobson <- .C('dobson_ci_wrap', presum=as.integer(sum(pre)), postsum=as.integer(sum(post)), lci_c=as.numeric(lci_c), uci_c=as.numeric(uci_c), dobson_priors=as.numeric(dobson_priors), ci_l=as.numeric(0), ci_u=as.numeric(0))
wvp
dobson
# Matches publication:
dobson <- .C('dobson_ci_wrap', pre=as.integer(100), preN=as.integer(1), post=as.integer(10), postN=as.integer(1), lci_c=as.numeric(lci_c), uci_c=as.numeric(uci_c), dobson_priors=as.numeric(dobson_priors), ci_l=as.numeric(0), ci_u=as.numeric(0))
var(rgamma(1000, 1, scale=10))
res <- fecrt_pvals(10000, N=10, pre_mean=10, reduction=0.01, pre_k=0.2, H0_1=0.5, H0_2=0.5, delta=FAL)
table(Sus = res$p1 < 0.025, Res = res$p2 < 0.025)
testpees(1000)
hist(res$p2)
res <- fecrt_power(N=10, pre_mean=10, reduction=0.04, pre_k=0.4, psig=0.025, beta_iters=1000)
apply(res, c(3,4), sum)
apply(res, c(1,4), sum)
apply(res, c(1,4,5), sum)
apply(res, c(2,4,5), sum)
res <- fecrt_power(10000, N=10, pre_mean=20, reduction=0.11, pre_k=0.8, post_k=0.8, psig=0.025)
apply(res, c(1,3,4), sum)
apply(res, c(2,3,4), sum)
# Dobson method has variable false positive/negative rates
387/10000
res1 <- .C('fecrt_power_comparison', iters=as.integer(iters), preN=as.integer(length(pre)), postN=as.integer(length(post)), maxN=as.integer(length(maxN)), H0_1=as.numeric(H0_1), H0_2=as.numeric(H0_2), edt_change=as.numeric(edt_change), prob_priors=as.numeric(prob_priors), kchange=as.numeric(kchange), truek=as.numeric(truek), usetruek=as.integer(usetruek), delta=as.integer(TRUE), beta_iters=as.integer(beta_iters), p_1=as.numeric(0), p_2=as.numeric(0), package='bayescount')
pre=as.integer(pre),
fecrt_power_comparison(int *iters, int *preN, int *postN, int *maxN, double *premean, double *reduction, double *edt_change, double *animalk, double *prek, double *postk, double *H0_1, double *H0_2, double *lci_c, double *uci_c, double *dobson_priors, double *tval, double *psig, double *prob_priors, double *kchange, double *truek, int *usetruek, int *delta, int *beta_iters, int *predata, int *postdata, int *classifications)
N <- 10
k <- 1
pre <- rnbinom(N, k, mu=20)
post <- rnbinom(N, k, mu=20*0.1)
H0_1 <- 0.95
H0_2 <- 0.95
edt_change <- 1
prob_priors <- c(1,1)
kchange <- 1
truek <- 1
usetruek <- FALSE
delta <- TRUE
beta_iters <- 10^6
# Max 10^8 - 10^6 is pretty instant and gives the same results
res1 <- .C('fecrt_pee_wrap', pre=as.integer(pre), preN=as.integer(length(pre)), post=as.integer(post), postN=as.integer(length(post)), H0_1=as.numeric(H0_1), H0_2=as.numeric(H0_2), edt_change=as.numeric(edt_change), prob_priors=as.numeric(prob_priors), kchange=as.numeric(kchange), truek=as.numeric(truek), usetruek=as.integer(usetruek), delta=as.integer(TRUE), beta_iters=as.integer(beta_iters), p_1=as.numeric(0), p_2=as.numeric(0), package='bayescount')
res2 <- .C('fecrt_pee_wrap', pre=as.integer(pre), preN=as.integer(length(pre)), post=as.integer(post), postN=as.integer(length(post)), H0_1=as.numeric(H0_1), H0_2=as.numeric(H0_2), edt_change=as.numeric(edt_change), prob_priors=as.numeric(prob_priors), kchange=as.numeric(kchange), truek=as.numeric(truek), usetruek=as.integer(usetruek), delta=as.integer(FALSE), beta_iters=as.integer(beta_iters), p_1=as.numeric(0), p_2=as.numeric(0), package='bayescount')
res1$p_1
res2$p_1
res1$p_2
res2$p_2
iters <- 1000
preN=postN <- 10
premean <- 100
reduction <- 0.1
edt_change <- 1
animalk <- 1 # Can be >100 -> means unpaired
prek <- 1
postk <- 1
H0_1 <- c(0.95, 0.9)
H0_2 <- c(0.9, 0.95)
stopifnot(length(H0_1)==length(H0_2))
H0_N <- length(H0_1)
maxN <- max(preN, postN)
p_1=p_2 <- rep(0, iters*H0_N)
powres <- .C('fecrt_power', iters=as.integer(iters), preN=as.integer(length(pre)), postN=as.integer(length(post)), maxN=as.integer(maxN), premean=as.numeric(premean), reduction=as.numeric(reduction), edt_change=as.numeric(edt_change), animalk=as.numeric(animalk), prek=as.numeric(prek), postk=as.numeric(postk), H0_1=as.numeric(H0_1), H0_2=as.numeric(H0_2), H0_N=as.integer(H0_N), prob_priors=as.numeric(prob_priors), kchange=as.numeric(kchange), truek=as.numeric(truek), usetruek=as.integer(usetruek), delta=as.integer(delta), beta_iters=as.integer(beta_iters), predata=as.integer(rep(0,maxN)), postdata=as.integer(rep(0,maxN)), p_1=as.numeric(p_1), p_2=as.numeric(p_2), package='bayescount')
p_1 <- powres$p_1
p_2 <- powres$p_2
dim(p_1) <- c(iters, H0_N)
dim(p_2) <- c(iters, H0_N)
head(p_1)
head(p_2)
iters <- 1000
res <- expand.grid(iter=1:iters, r=NA, pal=NA, pau=NA, ual=NA, uau=NA, wal=NA, wau=NA, pv1=NA, pv2=NA)
pb <- txtProgressBar(style=3)
for(i in 1:iters){
pre <- rnbinom(N, 1, mu=100)
post <- rnbinom(N, 1, mu=5)
as <- bayescount:::asymptotic_ci_wrap(pre, post)
wa <- bayescount:::waavp_ci_wrap(pre, post)
pv <- bayescount:::fecrt_pee_wrap(pre, post)
res$r[i] <- 1 - mean(post) / mean(pre)
res$pal[i] <- as$p_ci_l
res$pau[i] <- as$p_ci_u
res$ual[i] <- as$u_ci_l
res$uau[i] <- as$u_ci_u
res$wal[i] <- wa$ci_l
res$wau[i] <- wa$ci_u
res$pv1[i] <- pv$p_1
res$pv2[i] <- pv$p_2
setTxtProgressBar(pb, i/iters)
}
close(pb)
get_type_ci <- function(lci, uci, m, t){
if(uci < m){
tp <- 1
}else if(uci < t && lci < m){
tp <- 2
}else if(lci < m && uci >= t){
tp <- 3
}else if(lci >= m && uci < t){
tp <- 4
}else if(lci >= m && uci >= t){
tp <- 5
}else if(lci >= t){
tp <- 6
}else{
stop('Error assigning type')
}
return(tp)
}
get_type_pv <- function(p1, p2, s=0.025){
if(p2 <= s && p1 > s){
tp <- 1.5
}else if(p2 > s && p1 > s){
tp <- 3
}else if(p2 <= s && p1 <= s){
tp <- 4
}else if(p2 > s && p1 <= s){
tp <- 5.5
}else{
stop('Error assigning type')
}
return(tp)
}
iters <- 1000
res <- expand.grid(iter=1:iters, N=50, k=1, mu=10, true=0.85, Target=0.95, tol=0.05, o1=NA, r=NA, ap=NA, au=NA, wa=NA, pv=NA)
pb <- txtProgressBar(style=3)
for(i in 1:iters){
pre <- rnbinom(res$N[i], 1/res$k[i], mu=res$mu[i])
post <- rnbinom(res$N[i], 1/res$k[i], mu=res$mu[i]*(1-res$true[i]))
as <- bayescount:::asymptotic_ci_wrap(pre, post)
wa <- bayescount:::waavp_ci_wrap(pre, post)
pv <- bayescount:::fecrt_pee_wrap(pre, post, res$Target[i] - res$tol[i], res$Target[i])
res$r[i] <- 1 - mean(post) / mean(pre)
res$ap[i] <- get_type_ci(as$p_ci_l, as$p_ci_u, res$Target[i] - res$tol[i], res$Target[i])
res$au[i] <- get_type_ci(as$u_ci_l, as$u_ci_u, res$Target[i] - res$tol[i], res$Target[i])
res$wa[i] <- get_type_ci(wa$ci_l, wa$ci_u, res$Target[i] - res$tol[i], res$Target[i])
res$pv[i] <- get_type_pv(pv$p_1, pv$p_2, 0.025)
res$o1[i] <- sum(post)==0
setTxtProgressBar(pb, i/iters)
}
close(pb)
library('tidyverse')
lres <- res %>% gather(Method, Type, -iter, -N, -k, -mu, -true, -Target, -tol, -o1, -r)
#lres$Type <- factor(lres$Type, levels=c(1,1.5,2,3,4,5,5.5,6))
#levels(lres$Type) <- c(1.5,1.5,1.5,3,4,5.5,5.5,5.5)
#levels(lres$Type) <- c(1.5,1.5,1.5,3,4,5.5,5.5,5.5)
lres %>% group_by(Method, Type, N, k, mu, true, Target, tol, o1) %>% summarise(num=n()) %>% group_by(Method, N, k, mu, true, Target, tol, o1) %>% mutate(rate=num/sum(num))
lres %>% group_by(Method, Type, N, k, mu, true, Target, tol) %>% summarise(num=n()) %>% group_by(Method, N, k, mu, true, Target, tol) %>% mutate(rate=num/sum(num))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.