2011-11-14 119 views
1

上下文:據我可以看到,R缺乏一致的功能,這有利於在存活/事件歷史分析,例如上下文數據準備情節分裂包括隨時間變化的協變量(有時被稱爲「計數過程數據」)。查找重疊的間隔

對於每個人(id),給出每集的開始(start.cp)和結束時間(stop.cp)。此外,對於每個1,2,...,P隨時間變化的協變量(TVC),我們知道這一事件開始時(tvc.start_),當它結束(tvc.stop_)。

在我的例子(見下文)的TVCS數爲2,但通常的數量可以變化(從1到p)。

實施例:

輸入數據:

id start.cp stop.cp tvc.start1 tvc.start2 tvc.stop1 tvc.stop2 
1 1  1  2   2   3   4   7 
2 1  2  3   2   3   4   7 
3 1  3  4   2   3   4   7 
4 1  4  7   2   3   4   7 
5 1  7  12   2   3   4   7 

structure(list(id = c(1, 1, 1, 1, 1), start.cp = c(1, 2, 3, 4, 
7), stop.cp = c(2, 3, 4, 7, 12), tvc.start1 = c(2, 2, 2, 2, 2 
), tvc.start2 = c(3, 3, 3, 3, 3), tvc.stop1 = c(4, 4, 4, 4, 4 
), tvc.stop2 = c(7, 7, 7, 7, 7)), .Names = c("id", "start.cp", 
"stop.cp", "tvc.start1", "tvc.start2", "tvc.stop1", "tvc.stop2"), 
row.names = c(NA, 5L), class = "data.frame") 

的TVCS的名稱是已知的,即,在這個例子中,已知

tvc.start <- c("tvc.start1", "tvc.start2") 
tvc.stop <- c("tvc.stop1", "tvc.stop2") 

預期結果:

id start.cp stop.cp tvc.start1 tvc.start2 tvc.stop1 tvc.stop2 tvc.d1 tvc.d2 
1 1  1  2   2   3   4   7  0  0 
2 1  2  3   2   3   4   7  1  0 
3 1  3  4   2   3   4   7  1  0 
4 1  4  7   2   3   4   7  0  1 
5 1  7  12   2   3   4   7  0  1 

structure(list(id = c(1, 1, 1, 1, 1), start.cp = c(1, 2, 3, 4, 
7), stop.cp = c(2, 3, 4, 7, 12), tvc.start1 = c(2, 2, 2, 2, 2 
), tvc.start2 = c(3, 3, 3, 3, 3), tvc.stop1 = c(4, 4, 4, 4, 4 
), tvc.stop2 = c(7, 7, 7, 7, 7), tvc.d1 = c(0, 1, 1, 0, 0), tvc.d2 = c(0, 
0, 0, 1, 1)), .Names = c("id", "start.cp", "stop.cp", "tvc.start1", 
"tvc.start2", "tvc.stop1", "tvc.stop2", "tvc.d1", "tvc.d2"), row.names = c(NA, 
5L), class = "data.frame") 

問題:對於每個TVC,我想創建一個新的載體(tvc.d1tvc.d2,參見實施例),其指示給定事件(由start.cpstop.cp定義)重疊(= 1)的間隔的電視廣告。假設[start.cp,stop.cp)。如何在不循環TVC集的情況下做到這一點,即我正在尋找一種矢量化解決方案。

P.S:請隨意更改標題...

+1

是'?findInterval'有用嗎? –

+0

您能否描述一下給出這些數據的預期結果? – Andrie

+0

@Andrie目標(在這個例子中有2個TVC)是創建矢量'tvc.d1'和'tvc.d2'。 –

回答

1

我認爲特里Therneau可能要爭你的要求,該tcut功能和推薦的生存包pyearshis technical article with Cindy Crowson on handling time-dependent covariates早期描述。我很難理解爲什麼tcv.d1在停止時間爲2的時間間隔2 - > 3期間應該有所貢獻?但後來讀者的解釋是在對這個問題的評論中。

你真的只需要start.cp stop.cp載體和第一行作爲輸入數據。您將區間定義向量與每個組件/個體的開始和停止向量的向量進行比較,並找出=='1的區間。我在想,如果數據不是真的以這種方式出現,並且您可能不需要在設置中重複開始和停止時間。

tvec <- with(dat, c(start.cp[1], stop.cp)) 
dat$tvc.d1 <- 1*(findInterval(tvec,  # the "1*" converts to numeric 
           as.numeric(dat[ 1, c("tvc.start1", "tvc.stop1")]) , 
           all.inside=FALSE)[1:5] == 1) 
dat$tvc.d2 <- 1*(findInterval(tvec, 
           as.numeric(dat[ 1, c("tvc.start2", "tvc.stop2")]) , 
           all.inside=FALSE)[1:5] == 1) 
+1

這可能*是因爲間隔在左側關閉而在右側打開,由OP在上面評論? –

+0

哦。似乎編輯問題會更「可見」。 –

+0

@DWin謝謝你的回覆!我知道Therneau/Crowson的論文,但與Stata在這方面的能力相比,它仍然很複雜(好吧,這是我的觀點)。但是,我將再次檢查他們的論文,以確保我對他們的方法有正確的理解。此外,本博爾克(謝謝你!)已經回答了你的第二個問題。 –