2015-04-24 3 views
3

У меня есть набор данных, как показано ниже:Как сопоставить данные пациента для условной логистической регрессии в R?

patient_id pre.int.outcome post.int.outcome 
    302949    1   1    
    993564    0   1   
    993570    1   1 
    993575    0   1  
    993792    1   0  

Я хочу, чтобы выполнить clogit вмешательство до/после каждого пациента

Я понимаю, что мне нужно, чтобы получить его в виде:

strata   outcome 
    1     1 
    1     1 
    2     0 
    2     0 
    3     0 
    3     1 

В этой форме страты представляют собой пары номеров пациентов и результат, но я не уверен, как это сделать. Может ли кто-нибудь помочь или обратиться к источнику, который поможет?

Редакция:

Редактирование: то, что я в конечном итоге закончил, состояло в том, чтобы использовать функцию reshape, чтобы сделать набор данных «длинным», а не широким;

ds1<-reshape(ds, varying=c('pre.int.outcome','post.int.outcome'), v.names='outcome', timevar='before_after', times=c(0,1), direction='long') 

Я отсортировал по patient_id, чтобы использовать это как мои «страты».

ds1[order(ds1$patient_id),] 
+1

Может использоваться «расплав» из библиотеки (reshape2), то есть 'melt (df1, id.var = 'patient_id') [- 2]' – akrun

ответ

4

Может быть, это помогает

data.frame(strata= rep(1:nrow(df1), each=2), outcome=c(t(df1[2:3]))) 
2

здание на комментарий akrun и ответ, вот решение с использованием reshape2 пакета 'melt: Edit

library(reshape2) 

# I created dummy data to make sure my answer works 
# I assumed 4 intervention treatments, but this would work with 
# two treatments. With the dummy data, just make sure nObs/4 is an integer 
nObs = 100 # number of observations 
d = data.frame(patient_id = 1:4, 
      pre.int.outcome = rbinom(4, 1, 0.7), 
      post.int.outcome = rbinom(4, 1, 0.5), 
      intervention = rep(c("a", "b", "c", "d"), each = nObs/4)) 
# melting the data as suggested by akrun 
d2 = melt(d, id.vars = c("patient_id", "intervention")) 

# Creating a strata variable for you with paste 
d2$strata = as.factor(paste(d2$patient_id, d2$variable)) 
# I also clean up the variable to remove patient_id 
# useful if you are concerned about protecting pii 
levels(d2$strata) = 1:length(d2$strata) 
# last, I clean up the data and create a third "pretty" data.frame 
d3 = d2[ , c("intervention", "value", "strata")] 
head(d3) 
# intervention value strata 
# 1   a  1  2 
# 2   a  1  4 
# 3   a  1  6 
# 4   a  1  8 
# 5   a  1  2 
# 6   a  1  4 
# I also throw in the logistic regression 
myGLM = glm(value ~ intervention, data = d3, family = 'binomial') 
summary(myGLM) 
# prints lots of outputs to screen ... 

# or if you need odds ratios 
myGLM2 = glm(value ~ intervention - 1, data = d3, family = 'binomial') 
exp(myGLM2$coef) 
exp(confint(myGLM2)) 
# also prints lots of outputs to screen ... 

: Я добавил в intervention основе по комментариям ОП. Я также добавил glm, чтобы помочь ей или ему.

+1

Кроме того, ["pii"] (https: //en.wikipedia. org/wiki/Personally_identifiable_information) - это личная информация. Я понял, что большинство людей, вероятно, не знают этого акронима. См. Связанную статью Wikipeida, если вы хотите узнать больше об этом. –

+1

Есть ли способ включить «pre» и «post» в качестве значения строки в вашем решении, то есть: значение, страты и вмешательство? – user1745691

+1

Да. Эта колонка отсутствует в манекене, данные правильные? Предполагая, что имя столбца является «вмешательством», вы изменили бы «расплав» на «расплавление» (d, id.vars = c («patient_id», «вмешательство») ». Я отредактирую свой ответ, чтобы включить это. –

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