簡體   English   中英

R 使用 survSplit 重塑/擴展數據集以獲得 cox 回歸的時變變量

[英]R reshaping / expanding dataset using survSplit to obtain time-varying variable for cox regression

我看過其他類似的問題,但他們沒有回答我的問題。 我想擴展我的數據集,因為我需要為生存分析創建一個時變變量,並且想要使用survSplit命令( survival包),但我的數據已經部分采用長格式。 示例數據:

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而設計的,盡管開始時數據結構略有不同,我想知道是否有一個簡單的方法使用survSplit解決我的問題的方法。 如果沒有,是否有人有一個簡單的建議來擴展數據框。

我的最終步驟是擬合 cox 模型,例如:

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

感謝您的任何建議。

考慮以下與基礎 R 的數據爭用,其中基本上您merge數據幀與自身移動一行以對齊當前和下一條記錄,然后transform以進行開始停止計算。

注意: merge將引發重復nextidcnt列的警告(不是錯誤)。 使用ididcnt (在新 df 中移動一個)作為連接鍵,忽略或為合並創建第二個data1

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM