0

В основном я хочу, чтобы написать программу, которая будет рандомизацией порядка моих данных n раз, а затем завершить анализ выживаемости и построить выход через nнаписания программы по внедрению перестановок

Так позволяет принимать следующие общие данные пакет matching() и создать набор данных обработанных и необработанных людей. Link to package

set.seed(123) 

library(Matching) 
data(lalonde) 

lalonde$age_cat <- with(lalonde, ifelse(age < 24, 1, 2)) 
attach(lalonde) 

lalonde$ID <- 1:length(lalonde$age) 


#The covariates we want to match on 
X = cbind(age_cat, educ, black, hisp, married, nodegr, u74, u75, re75, re74) 
#The covariates we want to obtain balance on 
BalanceMat <- cbind(age_cat, educ, black, hisp, married, nodegr, u74, u75, re75, re74, 
        I(re74*re75)) 
genout <- GenMatch(Tr=treat, X=X, BalanceMatrix=BalanceMat, estimand="ATE", M=1, 
        pop.size=16, max.generations=10, wait.generations=1) 
detach(lalonde) 

# now lets pair the the non-treated collisions to the treated 
# BUT lets pair WITHOUT REPLACEMENT 

mout <- Match(Y=NULL, Tr=lalonde$treat, X=X, 
       Weight.matrix=genout, M=2, 
       replace=FALSE, ties=TRUE) 

summary(mout) 
# we see that for 130 treated observations, we have 260 non-treated 
# this is because we set M=2 
# and yes length(lalonde$age[lalonde$treat==0]) == 260 but just follow me please 
# but this was done for a specific reason 

# now lets create a table for our 130+260 collisions 
treated <- lalonde[mout$index.treated,] 
# now we only want one occurence of the treated variables 
library(dplyr) 
treat_clean <- treated %>% 
    group_by(ID) %>% 
    slice(1) 

non.treated <- lalonde[mout$index.control,] 

# finally we can combine to form one clear data.set 
matched.data <- rbind(treat_clean, non.treated) 

Теперь мы можем сделать условную логистическую регрессию для определения ИЛИ ассоциированный с re78 (деньгами, заработанные в 1987 году) и лечением. Для этого нам нужен пакет выживания. Link to package

library(survival) 

Допустим, успех происходит, если пассажир получает больше, чем 8125 в 1978 году

matched.data$success <- with(matched.data, ifelse(re78 > 8125, 1, 0)) 

output <- clogit(success ~ treat, matched.data, method = 'efron') 

summary(output) 

таким образом мы видим, что OR для обработанного (лакомство = 1) 1,495

Мы его можно сохранить следующим образом:

iteration.1 <- exp(output$coefficients[1]) 

Теперь мы читаем из соответствующего пакета (link), что для replace = FALSEОбратите внимание, что если FALSE, , порядок совпадений обычно имеет значение. Матчи будут найдены в же порядке, как данные сортируются

Так что я хочу сделать, создать функцию, которая будет для n раз

  • рандомизации в Лалонде $ ID заказа
  • Запустите процесс согласования
  • запустить алгоритм clogit
  • сохранить вывод каждый раз exp(output$coefficients[1])
  • Постройте OR (exp(output$coefficients[1])) для каждого n

Is essenece Я хочу ввести перестановки в анализ. Как это может быть сделано, когда позволяет сказать, п ​​= 5

ответ

1

Я большой поклонник replicate что-то вроде этого:

X <- cbind(...)       # what you had before 
BalanceMat <- cbind(...)    # ditto 
lalonde$ID <- seq.int(nrow(lalonde)) 

results <- replicate(1000, { 
    ## not certain if it's just $ID order that matters 
    lalonde$ID <- sample(nrow(lalonde)) 
    ## lalonde <- lalonde[ sample(nrow(lalonde)), ] 

    ## ... 
    ## rest of your computation 
    ## ... 

    #### optionally return everything 
    ## output 
    #### return just the minimum 
    exp(output$coefficients[1]) 
}) 

#### if you returned output earlier, you'll need this, otherwise not 
## coef <- exp(sapply(results, function(z) z$coefficients[1])) 

## plot as needed 

Я не знаю, имел ли смысл только порядок ID вопросов или, если порядок всей базы данных; отрегулируйте первые пары линий петли replicate соответственно.

+0

\ replicate \ отлично работает, и мне нравится, как вы использовали \ sample (nrow (lalonde)) \ – lukeg

1

Вы можете использовать sample ввести перестановки

data(lalonde) 
lalonde$age_cat <- with(lalonde, ifelse(age < 24, 1, 2)) 
lalonde$ID <- 1:length(lalonde$age) 
n <- 5 
res <- rep(NA, n) 
for (i in 1:n) { 
    lalonde <- lalonde[sample(1:nrow(lalonde)), ] # randomise order 
    ## rest of code 
    res[i] <- exp(output$coefficients[1]) 
} 

plot(1:n, res, main="Odds Ratios") 
+0

также отличный ответ, который отлично работает.Спасибо за большой вклад – lukeg

+0

Почему при рандомизации заказа вы используете 'lalonde [sample (1: nrow (lalonde)),]', а не lalonde [sample ((lalonde)),] ' – lukeg

+0

Спасибо за добавленное предложение, и если вы должны были пропустить 'lalonde <-' из цикла' for' на L1 (т.е. написать 'lalonde [sample (1: nrow (lalonde)),]', а не 'lalonde <- lalonde [sample (1: nrow (lalonde)),] рандомизация не будет применена, правильно? – lukeg

Смежные вопросы