2017-01-30 17 views
1

다른 질문을 본 적이 있지만 질문에 답하지 못합니다. 생존 분석을 위해 시변 변수를 만들어야하고 survSplit 명령 (survival 패키지)을 사용하고 싶지만 내 데이터는 이미 부분적으로 긴 형식으로되어 있으므로 내 데이터 집합을 확장하고 싶습니다. 예 데이터 :R survsplit을 사용하여 cox 회귀에 대한 시변 변수를 얻기 위해 데이터 집합을 재구성/확장

data1<-structure(list(id = c(1, 1, 1, 1, 5, 5, 5, 5, 5, 7, 7, 7, 7, 
7, 7), start = c(0, 183, 210, 241, 0, 183, 187, 212, 244, 0, 
118, 139, 188, 212, 237), no_days = c(NA, 28L, 28L, 28L, NA, 
7L, 28L, 28L, 28L, NA, 28L, 28L, 28L, 28L, 28L), stop = c(NA, 
211, 238, 269, NA, 190, 215, 240, 272, NA, 146, 167, 216, 240, 
265), drug = c(0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1), 
    dead = c(0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1)), .Names = c("id", 
"start", "no_days", "stop", "drug", "dead"), row.names = c(NA, 
15L), class = "data.frame") 

> head(data1,15) 
    id start no_days stop drug dead 
1 1  0  NA NA 0 0 
2 1 183  28 211 1 0 
3 1 210  28 238 1 0 
4 1 241  28 269 1 1 
5 5  0  NA NA 0 0 
6 5 183  7 190 1 0 
7 5 187  28 215 1 0 
8 5 212  28 240 1 0 
9 5 244  28 272 1 1 
10 7  0  NA NA 0 0 
11 7 118  28 146 1 0 
12 7 139  28 167 1 0 
13 7 188  28 216 1 0 
14 7 212  28 240 1 0 
15 7 237  28 265 1 1 

Start이 약이 처방 된 날은, no_days을 위해이었다 처방, drug이 사람이 내가해야 할 변수 (특정 기간에 대한 약물에 있던 여부를 나타냅니다 얼마나 오래 시간이 변함), dead은 사람이 사망 한 시점을 나타냅니다. 나는 기반으로 더 많은 행을 추가 할 필요가 어디

head(data1,18) 
    id start no_days stop drug dead 
1 1  0  NA 182 0 0 
2 1 183  28 211 1 0 
3 1 210  28 238 1 0 
4 1 239  NA 240 0 0 
5 1 241  28 269 1 1 
6 5  0  NA 182 0 0 
7 5 183  7 190 1 0 
8 5 187  28 215 1 0 
9 5 212  28 240 1 0 
10 5 241  NA 243 0 0 
11 5 244  28 272 1 1 
12 7  0  NA 117 0 0 
13 7 118  28 146 1 0 
14 7 139  28 167 1 0 
15 7 168  NA 187 0 0 
16 7 188  28 216 1 0 
17 7 212  28 240 1 0 
18 7 237  28 265 1 1 

어쩌면이 표준 데이터 조작 문제한다 : 내가 원하는 최종 데이터 세트는 다음과 같아야합니다 그래서 순간에 데이터 세트는 개인이 약물에 있던 시간을 포함 특정 기준을 고려하지만 생존 데이터이며 survSplit은 약간 다른 데이터 구조에서 시작하기 위해 설계되었지만 내 문제를 해결하기 위해 survSplit을 사용하는 쉬운 방법이 있는지 궁금합니다. 그렇지 않다면 누구나 데이터 프레임을 확장하라는 간단한 제안을 가지고 있습니까? 어떤 제안에 대한

coxph(Surv(data$start,data$stop,data$dead)~covariates + drug +cluster(id),data=data1) 

감사 :

내 궁극적 인 단계는 같은 콕스 모델 뭔가에 맞게하는 것입니다.

답변

1

자체에 본질적 merge dataframe 현재 및 다음 레코드를 정렬 한 행으로 이동 한 후 transform시작정지 계산을위한 기초 연구와 논쟁 다음 데이터를 고려하십시오.

참고 : merge은 중복 nextidcnt 열의 경고 (오류 아님)를 발생시킵니다. 조합 키로 ididcnt (새 df에서 하나가 시프트 됨)을 사용하여 병합을 위해 두 번째를 무시하거나 다시 생성하십시오.

# OBTAIN GROUP COUNT (FOR MERGE IDs) 
data1$idcnt <- sapply(1:nrow(data1), function(i) sum(data1[1:i, c("id")] == data1$id[i])) 
data1$nextidcnt <- data1$idcnt + 1 

# MERGE 
dfm <- merge(data1, data1, by.x=c("id", "nextidcnt"), by.y=c("id", "idcnt")) 

# CALCULATE NEW COLUMNS 
dfm <- transform(dfm, 
       start = ifelse(is.na(stop.x), start.x, stop.x + 1), 
       no_days = no_days.x, 
       stop = start.y - 1, 
       drug = 0, 
       dead = dead.x) 

# ROW BIND ORIGINAL SUBSET WITH NEW ROWS 
finaldf <- rbind(data1[data1$start != 0, c(1:6)], 
       dfm[dfm$start < dfm$stop, 
        c("id", "start", "no_days", "stop", "drug", "dead")]) 

finaldf <- finaldf[with(finaldf, order(id, start, stop)),] # ORDER BY ID, START, STOP 
rownames(finaldf) <- NULL         # RESET ROW NAMES 

출력

finaldf 

# id start no_days stop drug dead 
# 1 1  0  NA 182 0 0 
# 2 1 183  28 211 1 0 
# 3 1 210  28 238 1 0 
# 4 1 239  28 240 0 0 
# 5 1 241  28 269 1 1 
# 6 5  0  NA 182 0 0 
# 7 5 183  7 190 1 0 
# 8 5 187  28 215 1 0 
# 9 5 212  28 240 1 0 
# 10 5 241  28 243 0 0 
# 11 5 244  28 272 1 1 
# 12 7  0  NA 117 0 0 
# 13 7 118  28 146 1 0 
# 14 7 139  28 167 1 0 
# 15 7 168  28 187 0 0 
# 16 7 188  28 216 1 0 
# 17 7 212  28 240 1 0 
# 18 7 237  28 265 1 1 
+0

매우 현명한 일이, 감사합니다. 누군가가 survSplit 솔루션으로 돌아 오면 관심이 있습니다. – user63230