2012-07-11 25 views
0

另一個R新手問題。爲生存分析創建截尾DV(長形)

我正在研究一個需要我使用生存分析的項目。具體來說,我需要使用離散單元生存分析(所以Cox迴歸或假設我的DV是連續的其他方法不可能)。 (步驟1)找到最後一次變量(「q」)= 1時,我需要創建一個截尾DV(「dv」); (步驟2)在時間+1時將我的「dv」重新編碼爲「0」; (步驟3)在時間+ 2 ... n處將我的「dv」重新編碼爲「NA」; (步驟4)刪除當「dv」= NA時的所有觀察(行)。

在我這樣做之前,似乎我應該創造出我應該創建一個默認分配爲「1」的DV。我的數據是這樣的步驟3後:

id time q dv 
1 1 1 1 
1 2 0 1 
1 3 1 1 
1 4 0 0 
1 5 0 NA 
1 6 0 NA 
2 1 1 1 
2 2 1 1 
2 3 0 0 
2 4 0 NA 
2 5 0 NA 
2 6 0 NA 

請注意,「Q」可爲「0」之間變化或「1」隨着時間的推移(參見在時間= 2 ID = 1的觀察),但由於生存分析的本質,「dv」不能。我需要做的是創建一個變量,查找「q」在「1」和「0」之間變化的最後時間,然後進行相應審查。在步驟4之後,我的數據應該如下所示:

id time q dv 
1 1 1 1 
1 2 0 1 
1 3 1 1 
1 4 0 0 
2 1 1 1 
2 2 1 1 
2 3 0 0 

感謝您的任何和所有幫助!

+0

假設'dv'是你在DTSA發生的事件,你確定是outlin編輯步驟是最實用的方法?原始(寬)數據的外觀如何? – mhermans 2012-07-11 23:48:15

+0

雖然我不是專家,但是從我讀過的書中,我認爲他們是。每個問題也具有隨時間變化的屬性,這些屬性將在模型中用作預測因子,並且隨着它們不時地變化,需要很長的形式。 – roody 2012-07-12 02:04:42

+0

長格式是你想要的生存模式,而不是你的錄音工作所必需的......然而,我注意到了它,但請參見下文。 – mhermans 2012-07-12 16:19:47

回答

0

這引起了比預期更詳細的,但它的工作對你長格式的片段:

我從所提供的數據開始,而是使用的,而不是長期廣泛。

zz <- textConnection("id time q dv 
1 1 1 1 
1 2 0 1 
1 3 1 1 
1 4 0 0 
1 5 0 NA 
1 6 0 NA 
2 1 1 1 
2 2 1 1 
2 3 0 0 
2 4 0 NA 
2 5 0 NA 
2 6 0 NA 
") 
d <- read.table(zz, header = TRUE) 
d$dv <- NULL 
close(zz) 

# start out with wide instead of long 
dw <- reshape(d, direction='wide', timevar="time", sep="") 
dw 
## id q1 q2 q3 q4 q5 q6 
## 1 1 1 0 1 0 0 0 
## 7 2 1 1 0 0 0 0 

使用產生每行寬/觀測的正確「 」 DV變量的函數。

censor <- function(periods) { 
    n <- length(periods) 
    cperiods <- periods*1:n # multiply to get positions 
    n.obs <- max(cperiods) # position of last q=1, and one q=0 
    periods[(n.obs+1):n] <- NA # NA's for periods outside observed range 
    n.cens <- n - n.obs - 1 # number censored 
    c(rep(1, n.obs-1), 0, rep(NA, n.cens+1)) # fill "dv" accordingly 
} 

應用所述函數,導致適當審查的寬數據集。

 
# apply censored(), create dv variable in wide format 
dw.censored <- data.frame(t(apply(dw, 1, FUN = censor))) 
dw.censored 
## X1 X2 X3 X4 X5 X6 X7 
## 1 1 1 1 0 NA NA NA 
## 7 1 1 0 NA NA NA NA 

現在回到長格式(具有審美格式化,排序等)

dl.censored <- reshape(dw.censored, varying = 1:7, timevar = "time", 
         sep = "", direction = "long") 
dl.censored <- dl.censored[order(dl.censored$id, dl.censored$time),] 
dl.censored$dv <- dl.censored$X 
rownames(dl.censored) <- dl.censored$X <- NULL 
dl.censored 

## time id dv 
## 1  1 1 1 
## 2  2 1 1 
## 3  3 1 1 
## 4  4 1 0 
## 5  5 1 NA 
## 6  6 1 NA 
## 7  7 1 NA 
## 8  1 2 1 
## 9  2 2 1 
## 10 3 2 0 
## 11 4 2 NA 
## 12 5 2 NA 
## 13 6 2 NA 
## 14 7 2 NA 

而沒有NA ' S:

dl.censored <- na.omit(dl.censored) # without NA's 
dl.censored 
## time id dv 
## 1  1 1 1 
## 2  2 1 1 
## 3  3 1 1 
## 4  4 1 0 
## 8  1 2 1 
## 9  2 2 1 
## 10 3 2 0