Создание новых наборов данных для каждой итерации анализа мощности - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующий код для оценки мощности моего исследования, который работает отлично. Проблема в том, что я выполняю n = 1000 итераций, но каждая итерация генерирует один и тот же набор данных. Я думаю, это потому, что команды в функции, которую я создал (powercrosssw), опираются на определения данных выше, которые имеют фиксированное значение? Как убедиться, что каждый сгенерированный набор данных (с именем dx ниже) отличается (т. Е. Значения для u_3, error и y различны для каждой итерации), так что я рассчитываю мощность соответствующим образом?

library(simstudy)
library(nlme)
library(gendata)
library(data.table)
library(geepack)

set.seed(12345)

clusterDef <- defDataAdd(varname = "u_3", dist = "normal", formula = 0, variance = 25.77) #cluster-level random effect
patError <- defDataAdd(varname = "error", dist = "normal", formula = 0, variance = 38.35) #error term 

#Generate cluster-level data
cohortsw <- genData(3, id = "cluster")
cohortsw <- addColumns(clusterDef, cohortsw) 
cohortswTm <- addPeriods(cohortsw, nPeriods = 6, idvars = "cluster", perName = "period")
cohortstep <- trtStepWedge(cohortswTm, "cluster", nWaves = 3, lenWaves = 1, startPer = 1, grpName = "Ijt")
cohortstep

#Generate individual patient-level data
pat <- genCluster(cohortswTm, cLevelVar = "timeID", numIndsVar = 5, level1ID = "id")
pat

dx <- merge(pat[, .(cluster, period, id)], cohortstep, by = c("cluster", "period")) 
dx <- addColumns(patError, dx)

setkey(dx, id, cluster, period)

#Define outcome y 
outDef <- defDataAdd(varname = "y", formula = "17.87 + 5.0*Ijt - 5.42*I(period == 1) - 5.72*I(period == 2) - 7.03*I(period == 3) - 6.13*I(period == 4) - 9.13*I(period == 5) + u_3 + error", dist = "normal")
dx <- addColumns(outDef, dx)

#Fit GLMM model to simulated dataset
model1 <- lme(y ~ factor(period) + factor(Ijt), random = ~1|cluster, data = dx, method = "REML")
summary(model1)

#Power analysis 
powercrosssw <- function(nclus = 3, clsize = 5) {

  cohortsw <- genData(nclus, id = "cluster")
  cohortsw <- addColumns(clusterDef, cohortsw) 
  cohortswTm <- addPeriods(cohortsw, nPeriods = 6, idvars = "cluster", perName = "period")
  cohortstep <- trtStepWedge(cohortswTm, "cluster", nWaves = 3, lenWaves = 1, startPer = 1, grpName = "Ijt")

  pat <- genCluster(cohortswTm, cLevelVar = "timeID", numIndsVar = clsize, level1ID = "id")

  dx <- merge(pat[, .(cluster, period, id)], cohortstep, by = c("cluster", "period"))
  dx <- addColumns(patError, dx)

  setkey(dx, id, cluster, period)

  return(dx)

}

bresult <- NULL
presult <- NULL
eresult <- NULL

intercept <- NULL 
trt <- NULL 
timecoeff1 <- NULL
timecoeff2 <- NULL
timecoeff3 <- NULL
timecoeff4 <- NULL
timecoeff5 <- NULL
ranclus <- NULL
error <- NULL 

i=1

while (i < 1000) {

  cohortsw <- powercrosssw()

  #Fit multi-level model to simulated dataset
  model1 <- tryCatch(lme(y ~ factor(period) + factor(Ijt), data = dx, random = ~1|cluster, method = "REML"),
                     warning = function(w) { "warning" }
  )

  if (! is.character(model1)) {

    coeff <- coef(summary(model1))["factor(Ijt)1", "Value"]
    pvalue <- coef(summary(model1))["factor(Ijt)1", "p-value"]
    error <- coef(summary(model1))["factor(Ijt)1", "Std.Error"]
    bresult <- c(bresult, coeff)
    presult <- c(presult, pvalue)
    eresult <- c(eresult, error)

   i <- i + 1
  }
}
...