Как использовать функцию «caralloc» (в R-пакете SeqAlloc), чтобы рандомизировать людей в три условия? - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу использовать функцию "caralloc" из пакета SeqAlloc, чтобы рандомизировать людей в три, а не в два условия по умолчанию.

function (xmat, carwt, p, tol) 
{
  if (!is.matrix(xmat)) 
  xmat = as.matrix(xmat)
  n = nrow(xmat)
  result = rbinom(n, 1, 0.5)
 if (n > 1) {
for (j in 2:n) {
  matchx = apply(xmat[1:(j - 1), , drop = FALSE], 
    1, function(x, xrow) {
      as.numeric(x == xrow)
    }, xmat[j, ])
  sumsofar = matchx %*% (2 * result[1:(j - 1)] - 1)
  imbalance1 = crossprod(abs(sumsofar + 1), carwt)
  imbalance0 = crossprod(abs(sumsofar - 1), carwt)
  if (imbalance1 < imbalance0 & imbalance0 >= tol) 
    result[j] = rbinom(1, 1, p)
  if (imbalance0 < imbalance1 & imbalance1 >= tol) 
    result[j] = rbinom(1, 1, 1 - p)
 }
}
result
}

Используйте пример пакета:

sampsize <- 200
percent <- c(0.5,0.8,0.2,0.4)
carwt <- c(.4,.3,.2,.1)

set.seed(5798)

xmat <- matrix(rbinom(sampsize*length(percent),1,rep(percent,sampsize)),
          nrow=sampsize,ncol=length(percent),byrow=TRUE)
colnames(xmat) = c("C1","C2","C3","C4")
strat_factor = xmat[,1]*4 + xmat[,2]*2 + xmat[,4] + 1

caralloc(xmat,carwt,1,3)

Два условия по умолчанию будут выглядеть так: 1 1 0 0 1 0 0 1 0 0 0 ... Я хочу увидеть три условия, такие как: 1 1 2 0 1 0 0 2 0 1 0 ...

1 Ответ

0 голосов
/ 05 ноября 2019

Звучит невероятно сложно, чтобы просто рандомизировать ваши группы.

Разве вы не можете просто использовать функцию sample()?

df <- data.frame(
  # some 1000 test patients:  
  patient = paste0(letters, round(runif(1000, 100, 999))), 
  # assigning a group: 0, 1 or 2:
  group = sample(c(0:2), 1000, replace = TRUE))

head(df)
#>   patient group
#> 1    a729     1
#> 2    b633     2
#> 3    c831     2
#> 4    d111     2
#> 5    e406     1
#> 6    f491     0

# evenly distributed?
hist(df$group)

enter image description here

Чтобы использовать предопределенные размеры групп, используйте аргумент prob:

df <- data.frame(
  # some 1000 test patients:  
  patient = paste0(letters, round(runif(1000, 100, 999))), 
  # assigning a group: 0, 1 or 2:
  group = sample(c(0:2), 1000, replace = TRUE, prob = c(0.1, 0.4, 0.5)))

hist(df$group)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...