2019
DOI: 10.1111/biom.13106
|View full text |Cite
|
Sign up to set email alerts
|

Robust inference for the stepped wedge design

Abstract: Stepped wedge designed trials are a type of cluster‐randomized study in which the intervention is introduced to each cluster in a random order over time. This design is often used to assess the effect of a new intervention as it is rolled out across a series of clinics or communities. Based on a permutation argument, we derive a closed‐form expression for an estimate of the intervention effect, along with its standard error, for a stepped wedge design trial. We show that these estimates are robust to misspecif… Show more

Help me understand this report

Search citation statements

Order By: Relevance

Paper Sections

Select...
2
1
1

Citation Types

0
31
0

Year Published

2019
2019
2024
2024

Publication Types

Select...
6

Relationship

2
4

Authors

Journals

citations
Cited by 28 publications
(32 citation statements)
references
References 15 publications
0
31
0
Order By: Relevance
“…# Null condition, 40 clusters, with random treatment effect, time effect, correlation = 0 gm1a = NULL gm2a = NULL gmz1 = NULL gmz2 = NULL gm3a = NULL gm4a = NULL gmz3 = NULL gmz4 = NULL for(i in 1:500) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # mu1 is the difference between a0 and a1 # tau: random intercept # eta: random treatment swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=100, mu0=3, mu1=3, time.effect=c(0,.2,.3,.4,.5), sigma=1, tau=2, eta=0, rho=0, seed=i, retTimeOnTx=FALSE) # time effect, no random treatment effect glmod1 <-glmer(response.var ~ tx.var+as.factor(time.var)+(1|cluster.var), data = swGenData.nScalar, gaussian, nAGQ = 10) storep1, storep1_z, storep2, storep2_z, storep3, storep3_z) zscore1 = summary(mod1)$coefficients [2,5] mod2 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "exchangeable") result2 = mod2$coefficients myfunc <-function(n, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, myfunc <-function(n, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, zscore1 = summary(mod1)$coefficients [2,5] mod2 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "exchangeable") result2 = mod2$coefficients[ [2]][1] zscore2 = summary(mod2)$coefficients [2,5] mod3 <-gee(response.var~tx.var, data = swdata, family = "gaussian",id = cluster.var, corstr = "independence") result3 = mod3$coefficients [ storep1, storep1_z, storep2, storep2_z, storep3, storep3_z)) } finalp1 = 0 finalp1_z = 0 finalp2 = 0 finalp2_z = 0 finalp3 = 0 finalp3_z = 0 for(i in 1:500) { resultList = NULL resultList = checkfunc(1000, 40, i) finalp1 = finalp1 + resultList [1] finalp1_z = finalp1_z + resultList [2] finalp2 = finalp2 + resultList [3] finalp2_z = finalp2_z + resultList [4] finalp3 = finalp3 + resultList [5] finalp3_z = finalp3_z + resultList[6] } print(finalp1/500) print(finalp1_z/500) print(finalp2/500) print(finalp2_z/500) print(finalp3/500) print(finalp3_z/500)…”
Section: G3mentioning
confidence: 99%
See 4 more Smart Citations
“…# Null condition, 40 clusters, with random treatment effect, time effect, correlation = 0 gm1a = NULL gm2a = NULL gmz1 = NULL gmz2 = NULL gm3a = NULL gm4a = NULL gmz3 = NULL gmz4 = NULL for(i in 1:500) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # mu1 is the difference between a0 and a1 # tau: random intercept # eta: random treatment swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=100, mu0=3, mu1=3, time.effect=c(0,.2,.3,.4,.5), sigma=1, tau=2, eta=0, rho=0, seed=i, retTimeOnTx=FALSE) # time effect, no random treatment effect glmod1 <-glmer(response.var ~ tx.var+as.factor(time.var)+(1|cluster.var), data = swGenData.nScalar, gaussian, nAGQ = 10) storep1, storep1_z, storep2, storep2_z, storep3, storep3_z) zscore1 = summary(mod1)$coefficients [2,5] mod2 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "exchangeable") result2 = mod2$coefficients myfunc <-function(n, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, myfunc <-function(n, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, zscore1 = summary(mod1)$coefficients [2,5] mod2 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "exchangeable") result2 = mod2$coefficients[ [2]][1] zscore2 = summary(mod2)$coefficients [2,5] mod3 <-gee(response.var~tx.var, data = swdata, family = "gaussian",id = cluster.var, corstr = "independence") result3 = mod3$coefficients [ storep1, storep1_z, storep2, storep2_z, storep3, storep3_z)) } finalp1 = 0 finalp1_z = 0 finalp2 = 0 finalp2_z = 0 finalp3 = 0 finalp3_z = 0 for(i in 1:500) { resultList = NULL resultList = checkfunc(1000, 40, i) finalp1 = finalp1 + resultList [1] finalp1_z = finalp1_z + resultList [2] finalp2 = finalp2 + resultList [3] finalp2_z = finalp2_z + resultList [4] finalp3 = finalp3 + resultList [5] finalp3_z = finalp3_z + resultList[6] } print(finalp1/500) print(finalp1_z/500) print(finalp2/500) print(finalp2_z/500) print(finalp3/500) print(finalp3_z/500)…”
Section: G3mentioning
confidence: 99%
“…myfunc <-function(n, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swGenData.nScalar <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, mu1=3.21, time.effect=c(0,.2,.3,.4,.5), sigma=1, tau=2, eta=0, rho=0, seed = seed, retTimeOnTx=FALSE) data = swSummary(response.var, tx.var, time.var, cluster.var, swGenData.nScalar, type="mean", digits=3)$swDsn newdata = NULL listn=c(1:n) x = sample(listn) newdata=data[x,] return(newdata) } checkfunc = function(numberOfPermutation, nCluster, seed) { design <-swDsn(clusters=c(10,10,10,10), extra.time=0, all.ctl.time0=TRUE) # first generate the original dataset with a time effect and 0 treatment effect, # rho is the correlation between slope and intercept swdata <-swSim(design,family=gaussian(link="identity"), n=10, mu0=3, mu1=3.21, time.effect=c(0,.2,.3,.4,.5), sigma=1, tau=2, eta=0, rho=0, seed = seed, retTimeOnTx=FALSE) storep1 = 0 storep1_z = 0 storep2 = 0 storep2_z = 0 storep3 = 0 storep3_z = 0 matrix = myfunc(nCluster, seed) mod1 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "independence") result1 = mod1$coefficients[ [2]][1] zscore1 = summary(mod1)$coefficients [2,5] mod2 <-gee(response.var~tx.var+as.factor(time.var), data = swdata, family = "gaussian",id = cluster.var, corstr = "exchangeable") result2 = mod2$coefficients storep1, storep1_z, storep2, storep2_z, storep3, storep3_z)) } finalp1 = 0 finalp1_z = 0 finalp2 = 0 finalp2_z = 0 finalp3 = 0 finalp3_z = 0 for(i in 1:500) { resultList = NULL resultList = checkfunc(1000, 40, i) finalp1 = finalp1 + resultList [1] finalp1_z = finalp1_z + resultList [2] finalp2 = finalp2 + resultList [3] finalp2_z = finalp2_z + resultList [4] finalp3 = finalp3 + resultList [5] finalp3_z = finalp3_z + resultList[6] } print(finalp1/500) print(finalp1_z/500) print(finalp2/500) print(finalp2_z/500) print(finalp3/500) print(finalp3_z/500)…”
Section: # S7mentioning
confidence: 99%
See 3 more Smart Citations