आर में समय निर्भर गुणांक - इसे कैसे करें?


17

अपडेट : एक और अपडेट के लिए क्षमा करें, लेकिन मुझे आंशिक पॉलीओनॉमियल और प्रतिस्पर्धी जोखिम-पैकेज के साथ कुछ संभावित समाधान मिल गए हैं जिनकी मुझे कुछ मदद चाहिए।


समस्या

मुझे समय पर निर्भर गुणांक विश्लेषण करने का एक आसान तरीका नहीं मिल रहा है। आर में है। मैं अपने चर को गुणांक लेने में सक्षम होना चाहता हूं और यह एक समय पर निर्भर गुणांक (चर नहीं) में करना चाहता हूं और फिर समय के खिलाफ भिन्नता की साजिश कर सकता हूं:

βmy_variable=β0+β1t+β2t2...

संभव समाधान

1) डेटासेट विभाजित करना

मैंने इस उदाहरण को देखा है (प्रयोगशाला सत्र का से भाग 2) लेकिन एक अलग डेटासेट का निर्माण जटिल, कम्प्यूटेशनल रूप से महंगा और बहुत सहज नहीं लगता है ...

2) कम रैंक मॉडल - coxvc पैकेज

Coxvc पैकेज समस्या से निपटने का एक सुंदर तरीका प्रदान करता है - यहाँ एक है मैनुअल । समस्या यह है कि लेखक अब पैकेज विकसित नहीं कर रहा है (अंतिम संस्करण 05/23/2007 के बाद से है), कुछ ई-मेल वार्तालाप के बाद मैंने काम करने के लिए पैकेज प्राप्त कर लिया है, लेकिन मेरे डाटासेट पर एक घंटे में 5 घंटे लग गए (140 000) प्रविष्टियाँ) और अवधि के अंत में अत्यधिक अनुमान देता है। आप यहां थोड़ा अद्यतन पैकेज पा सकते हैं - मैंने ज्यादातर प्लॉट फ़ंक्शन को अपडेट किया है।

यह सिर्फ ट्वीकिंग का सवाल हो सकता है लेकिन चूंकि सॉफ्टवेयर आसानी से विश्वास अंतराल प्रदान नहीं करता है और इस प्रक्रिया में इतना समय लगता है कि मैं अन्य समाधानों में अभी देख रहा हूं।

3) टाइमरेग पैकेज

प्रभावशाली टाइमेरेग पैकेज भी समस्या का समाधान करता है, लेकिन मैं इसका उपयोग करने के तरीके के बारे में निश्चित नहीं हूं और यह मुझे एक चिकनी साजिश नहीं देता है।

4) आंशिक बहुपद समय (FPT) मॉडल

मुझे अनिका बुचोलज़ का "समय का आकलन-उपचारों और रोग-संबंधी कारकों के दीर्घकालिक-अलग-अलग प्रभावों पर उत्कृष्ट शोध " मिला, जो विभिन्न मॉडलों को कवर करने के लिए एक उत्कृष्ट काम करता है। वह निष्कर्ष निकालती है कि Sauerbrei et al's प्रस्तावित FPT समय-निर्भर गुणकों के लिए सबसे उपयुक्त प्रतीत होता है:

एफपीटी समय-भिन्न प्रभावों का पता लगाने में बहुत अच्छा है, जबकि कम रैंक दृष्टिकोण के परिणामस्वरूप बहुत अधिक जटिल मॉडल होते हैं, क्योंकि इसमें समय-भिन्न प्रभावों का चयन शामिल नहीं है।

अनुसंधान बहुत पूरा लगता है, लेकिन यह मेरे लिए पहुंच से थोड़ा बाहर है। मैं भी थोड़ा हैरान हूं क्योंकि वह सॉरेबी के साथ काम करती है। यह ध्वनि लगता है और मुझे लगता है कि विश्लेषण mfp पैकेज के साथ किया जा सकता है लेकिन मुझे यकीन नहीं है कि कैसे।

5) cmprsk पैकेज

मैं अपने प्रतिस्पर्धी जोखिम विश्लेषण करने के बारे में सोच रहा हूं, लेकिन गणना समय लेने वाली है इसलिए मैंने नियमित कॉक्स प्रतिगमन पर स्विच किया। सीआरआर समय निर्भर covariates के लिए एक विकल्प thoug है:

....
cov2        matrix of covariates that will be multiplied 
            by functions of time; if used, often these 
            covariates would also appear in cov1 to give 
            a prop hazards effect plus a time interaction
....

द्विघात उदाहरण है, लेकिन मैं वास्तव में दिखाई देने वाले समय का बिल्कुल पालन नहीं कर रहा हूं और मुझे यकीन नहीं है कि इसे कैसे प्रदर्शित किया जाए। मैं भी test.R फ़ाइल पर देखा है, लेकिन उदाहरण वहाँ मूल रूप से एक ही है ...

मेरा उदाहरण कोड

यहां एक उदाहरण है जिसका उपयोग मैं विभिन्न संभावनाओं का परीक्षण करने के लिए करता हूं

library("survival")
library("timereg")
data(sTRACE)

# Basic cox regression    
surv <- with(sTRACE, Surv(time/365,status==9))
fit1 <- coxph(surv~age+sex+diabetes+chf+vf, data=sTRACE)
check <- cox.zph(fit1)
print(check)
plot(check, resid=F)
# vf seems to be the most time varying

######################################
# Do the analysis with the code from #
# the example that I've found        #
######################################

# Split the dataset according to the splitSurv() from prof. Wesley O. Johnson
# http://anson.ucdavis.edu/~johnson/st222/lab8/splitSurv.ssc
new_split_dataset = splitSuv(sTRACE$time/365, sTRACE$status==9, sTRACE[, grep("(age|sex|diabetes|chf|vf)", names(sTRACE))])

surv2 <- with(new_split_dataset, Surv(start, stop, event))
fit2 <- coxph(surv2~age+sex+diabetes+chf+I(pspline(stop)*vf), data=new_split_dataset)
print(fit2)

######################################
# Do the analysis by just straifying #
######################################
fit3 <- coxph(surv~age+sex+diabetes+chf+strata(vf), data=sTRACE)
print(fit3)

# High computational cost!
# The price for 259 events
sum((sTRACE$status==9)*1)
# ~240 times larger dataset!
NROW(new_split_dataset)/NROW(sTRACE)

########################################
# Do the analysis with the coxvc and   #
# the timecox from the timereg library #
########################################
Ft_1 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=3))
fit_coxvc1 <- coxvc(surv~vf+sex, Ft_1, rank=2, data=sTRACE)

fit_coxvc2 <- coxvc(surv~vf+sex, Ft_1, rank=1, data=sTRACE)

Ft_3 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=5))
fit_coxvc3 <- coxvc(surv~vf+sex, Ft_3, rank=2, data=sTRACE)

layout(matrix(1:3, ncol=1))
my_plotcoxvc <- function(fit, fun="effects"){
    plotcoxvc(fit,fun=fun,xlab='time in years', ylim=c(-1,1), legend_x=.010)
    abline(0,0, lty=2, col=rgb(.5,.5,.5,.5))
    title(paste("B-spline =", NCOL(fit$Ftime)-1, "df and rank =", fit$rank))
}
my_plotcoxvc(fit_coxvc1)
my_plotcoxvc(fit_coxvc2)
my_plotcoxvc(fit_coxvc3)

# Next group
my_plotcoxvc(fit_coxvc1)

fit_timecox1<-timecox(surv~sex + vf, data=sTRACE)
plot(fit_timecox1, xlab="time in years", specific.comps=c(2,3))

इन ग्राफ़ों में कोड परिणाम: कॉक्स पीवीसी और कॉक्स पीवीसी और टाइमकोक्स भूखंडों के लिए विभिन्न सेटिंग्स की तुलना । मुझे लगता है कि परिणाम ठीक हैं, लेकिन मुझे नहीं लगता कि मैं टाइमकोक्स ग्राफ की व्याख्या कर पाऊंगा - यह जटिल लगता है ...

मेरे (वर्तमान) सवाल

  • मैं आरपीटी में एफपीटी विश्लेषण कैसे करूं?
  • मैं cmprsk में समय कोवरिएट का उपयोग कैसे करूं?
  • मैं परिणाम की साजिश कैसे कर सकता हूं (अधिमानतः आत्मविश्वास अंतराल के साथ)?

3
y=एक्सβyy=एक्सβ0+एक्सटीβ1+एक्सटी2β2y~xy~x*(t+t^2)-ty~x+x:t+x:t^2

मैंने दूसरा भाग सोचा: "2. पीएच निर्धारक की जांच के लिए मॉडल निर्धारक समय-निर्भर सहसंयोजक" मेरे प्रश्न से निपटने वाला भाग होगा। मैं आपके द्वारा वर्णित सूत्र के कुछ करने की उम्मीद कर रहा था, लेकिन जब मैंने इसकी कोशिश की तो मुझे या तो एक त्रुटि मिली या एक अलग समय चर ... मुझे समय के लिए कम पी-मान मिला हालांकि: -ड
मैक्स गॉर्डन

@ मैक्स-गोर्डन, क्या आपकी प्रतिक्रिया एक मात्रा है, या समय तब तक बीतता है जब तक कि एक भी नहीं होता? क्योंकि आपके द्वारा बताए गए अधिकांश तरीके विशेष रूप से समय-समय पर होने वाले डेटा के लिए हैं।
f1r3br4nd

@ f1r3br4nd: यह एक मात्रा (मेरे अध्ययन में आयु) है जहां खतरा गैर-आनुपातिक है, यानी यह समय-समय पर मेरे मॉडल में भिन्न होता है। अंत में मैंने दो अलग-अलग समय-फ़्रेमों में विभाजित करने का फैसला किया क्योंकि मैं 3-डी ग्राफ़ करके रोमांचित नहीं था - जो कि समीक्षकों को कभी भी पारित नहीं हुआ होगा ...
मैक्स गॉर्डन

समय पर निर्भर / बदलती भविष्यवाणियों और समय के बीच अंतर होता है। अधिकांश चर समय पर निर्भर होते हैं (सेक्स एक अपवाद है)। यदि आपके पास प्रति व्यक्ति एक अवलोकन है, तो आपके पास समय पर निर्भर / बदलती विश्लेषण करने के लिए बहुत कम या कोई मौका नहीं होगा। एंडरसन-गिल का तरीका समय-निर्भर अस्तित्व विश्लेषण के लिए सबसे अधिक बार उपयोग किया जाता है। समय पर निर्भर विधियों का लाभ यह है कि अनुवर्ती के दौरान मान आधारभूत मूल्यों की तुलना में उत्तरजीविता के अनुभव का अधिक पूर्वानुमान हो सकता है। दूसरी स्थिति, समय की व्याख्या करने वाले भविष्यवक्ता केवल PH धारणा के परीक्षण हैं।
एडम रॉबिंसन

जवाबों:


8

@mpiktas एक व्यवहार्य मॉडल की पेशकश करने के करीब आया, हालांकि इस शब्द का उपयोग द्विघात समय के लिए करने की आवश्यकता है = t होगा I(t^2))। ऐसा इसलिए है क्योंकि R में "^" की सूत्र व्याख्या अंतर्क्रिया का निर्माण करती है और प्रतिरूपण का प्रदर्शन नहीं करती है, इसलिए "t" के साथ "t" की पारस्परिक क्रिया सिर्फ "t" है। (क्या यह [r] टैग के साथ SO पर माइग्रेट नहीं किया जाना चाहिए?)

इस प्रक्रिया के विकल्पों के लिए, जो मुझे अनुमान के उद्देश्यों के लिए कुछ हद तक संदिग्ध लग रहा है, और एक जो शायद हार्ले के आरएमएस / हमीस्क पैकेजों में सहायक कार्यों का उपयोग करने में आपकी रुचि को फिट करता है, हैरेल की "प्रतिगमन मॉडल रणनीतियाँ" देखें। वह उल्लेख करता है (लेकिन केवल पास करने में हालांकि वह अपने कुछ कागजों का हवाला देता है) स्पाइन का निर्माण बाथटब के आकार के खतरों के समय के पैमाने पर फिट बैठता है। पैरामीट्रिक उत्तरजीविता मॉडल पर उनका अध्याय आनुपातिक खतरों की मान्यताओं की जाँच करने और समय के पैमाने पर अनुमानित लॉग-खतरा प्रभावों की रैखिकता की जांच करने के लिए विभिन्न प्रकार की साजिश रचने की तकनीकों का वर्णन करता है।

संपादित करें: एक अतिरिक्त विकल्प coxph"एस-टीटी" पैरामीटर का उपयोग करना है जिसे "समय-परिवर्तन कार्यों की वैकल्पिक सूची" के रूप में वर्णित किया गया है।


मैं सहमत हूं कि इसे संभवतः SO [r] टैग में ले जाना चाहिए।
Zach

आपके उत्तर के लिए +1, मुझे नहीं पता था कि यह इतना कठिन उत्तर होगा। यह एक आम समस्या की तरह लगता है, शायद सवाल कोडिंग के सवाल से अधिक है और आप एसओ के बारे में सही हो सकते हैं। मैंने आपके सूत्र की कोशिश की, ऐसा लगता है कि vf + I (vf log (समय)) में एक उत्कृष्ट फिट है, मैंने सिर्फ vf समय और vf * समय ^ 2 की कोशिश की, लेकिन लॉग ने सबसे कम पी-मूल्य दिया। मैंने एआईसी को प्राप्त करने के लिए इसे cph () फ़ंक्शन के साथ चलाने की कोशिश की, लेकिन इसने एक त्रुटि दी :( क्या आपको अनुमान है कि अनुमान पर एक प्लॉट कैसे करना है?
मैक्स गॉर्डन

मैंने सोचा था कि check <- cox.zph(fit1); print(check); plot(check, resid=F)जैसा कि आपके सेट अप ने समय "प्रभाव" के सूचनात्मक भूखंडों को दिया था। क्या आपका मतलब cph () है जो rms पैकेज से है या अस्तित्व से coxph?
डीडिन

हां, स्कोनफेल्ड अवशिष्ट समय भिन्नता का एक अच्छा विचार देता है, लेकिन मुझे लगता है कि लोगों को इसे समझने में कठिन समय हो सकता है। जैसा कि मैं समझता हूं कि यह अवशिष्ट विविधता मेरे मॉडल द्वारा नहीं समझाया गया है। मैं चाहूंगा कि यद्यपि एक ऐसा प्लॉट जहां मेरे पास x- अक्ष पर y- अक्ष और समय पर पूर्ण परिवर्तनीय प्रभाव हो, मेरा मानना ​​है कि यह व्याख्या करना आसान होगा क्योंकि आपको टेबल और प्लॉट दोनों को देखना नहीं है। समय में एक विशिष्ट बिंदु पर खतरा प्राप्त करने के लिए ... हां मेरा मतलब था cph () और न कि कॉक्सफ () क्योंकि AIC के साथ काम नहीं करता है ()
अधिकतम गॉर्डन

मैं थोड़ा उलझन में हूँ कि मैंने अपने प्रश्न में वर्णित सभी जटिल विधियों को क्यों पाया है जबकि यह मैं (चर * समय) बहुत सीधा और सहज लगता है - एक गैर-सांख्यिकीविद् के रूप में मैं सोच रहा हूं - मैंने क्या याद किया है ?
मैक्स गॉर्डन

6

मैंने इसका उत्तर न तो @ DWIN's के रूप में बदला है और न ही @ ज़ाच के उत्तरों ने पूरी तरह से उत्तर दिया है कि समय-भिन्न गुणांक को कैसे मॉडल किया जाए। मैंने हाल ही में इस बारे में एक पोस्ट लिखी है । यहाँ इसका सार है।

(टी)

(टी)=(टी)एस(टी)

जहां (टी) किसी भी समय एक घटना होने का जोखिम है, जबकि एस(टी)उस किराया से बचने की संभावना है। संख्या इस प्रकार से एक सैद्धांतिक सीमा के साथ एक अंश है0 सेवा

खतरे के कार्य की एक दिलचस्प विशेषता यह है कि हम समय के साथ अन्य बिंदुओं पर टिप्पणियों को शामिल कर सकते हैं टीमैं0, उदाहरण के लिए अगर "पीटर" इंग्लैंड में एक हिप आर्थ्रोप्लास्टी के साथ संचालित होता है, तो 1 साल के बाद स्वीडन पहुंचता है, वह 1 साल तक जीवित रहा है जब हम उसे शामिल करना चुनते हैं। ध्यान दें कि इससे पहले मर चुके किसी भी मरीज को कभी भी हमारा ध्यान नहीं आया होगा और इसलिए हम पीटर को इसमें शामिल नहीं कर सकते हैंएस(टी)1 वर्ष से पहले के खतरे को देखते हुए। 1 साल के बाद हम पीटर को शामिल कर सकते हैं।

जब अन्य समय बिंदुओं पर प्रवेश करने की इजाजत दी विषयों हम परिवर्तन करना होगा Survसे Surv(time, status)करने के लिए Surv(start_time, end_time, status)। जबकि end_timeजोरदार सहसंबंध परिणाम के साथ start_timeअब एक बातचीत अवधि (मूल सुझाव में संकेत के रूप में) के रूप में उपलब्ध है। एक नियमित सेटिंग में start_timeकुछ विषयों को छोड़कर 0 है जो बाद में दिखाई देता है, लेकिन क्या हम प्रत्येक अवलोकन को कई अवधियों में विभाजित करते हैं जो हमारे पास अचानक से बहुत बार शुरू होते हैं जो गैर-शून्य होते हैं। अंतर केवल इतना है कि प्रत्येक अवलोकन कई बार होता है जहां सभी लेकिन अंतिम अवलोकन में बिना सेंसर किए परिणाम का विकल्प होता है।

अभ्यास में समय विभाजन

मैंने अभी CRAN ग्रेग पैकेज पर प्रकाशित किया है जो इस समय-विभाजन को आसान बनाता है। पहले हम कुछ सैद्धांतिक टिप्पणियों से शुरू करते हैं:

library(Greg)
test_data <- data.frame(
  id = 1:4,
  time = c(4, 3.5, 1, 5),
  event = c("censored", "dead", "alive", "dead"),
  age = c(62.2, 55.3, 73.7, 46.3),
  date = as.Date(
    c("2003-01-01", 
      "2010-04-01", 
      "2013-09-20",
      "2002-02-23"))
)

हम इस रेखांकन को * घटना का सूचक होने के साथ दिखा सकते हैं:

यहाँ छवि विवरण दर्ज करें

यदि हम timeSplitterनिम्नलिखित लागू करते हैं :

library(dplyr)
split_data <- 
  test_data %>% 
  select(id, event, time, age, date) %>% 
  timeSplitter(by = 2, # The time that we want to split by
               event_var = "event",
               time_var = "time",
               event_start_status = "alive",
               time_related_vars = c("age", "date"))

हम निम्नलिखित प्राप्त करते हैं:

यहाँ छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं कि प्रत्येक वस्तु को कई घटनाओं में विभाजित किया गया है जहां अंतिम समय अवधि में वास्तविक घटना की स्थिति होती है। यह अब हमें उन मॉडल का निर्माण करने की अनुमति देता है, जिनमें सरल :इंटरैक्शन शब्द होते हैं ( *इसका विस्तार करने के लिए उपयोग नहीं करते हैं time + var + time:varऔर हम प्रति सेकेन्ड में रुचि नहीं रखते हैं)। I()फ़ंक्शन का उपयोग करने की कोई आवश्यकता नहीं है, हालांकि यदि आप समय के साथ गैर-शुद्धता की जांच करना चाहते हैं, तो मैं अक्सर एक अलग समय-इंटरैक्शन चर बनाता हूं जिसे मैं एक स्पलाइन जोड़ता हूं और फिर उपयोग करके प्रदर्शित करता हूं rms::contrast। वैसे भी, आपके प्रतिगमन कॉल को अब इस तरह दिखना चाहिए:

coxp(Surv(start_time, end_time, event) ~ var1 + var2 + var2:time, 
     data = time_split_data)

अस्तित्व पैकेज के ttफ़ंक्शन का उपयोग करना

ttफ़ंक्शन का उपयोग करके उत्तरजीविता पैकेज में सीधे आश्रित गुणांक को मॉडल करने का एक तरीका भी है । प्रो Therneau अपने में इस विषय के लिए एक संपूर्ण परिचय प्रदान करता है शब्दचित्र । दुर्भाग्य से बड़े डेटासेट में यह मेमोरी सीमाओं के कारण करना मुश्किल है। ऐसा लगता है कि ttफ़ंक्शन प्रक्रिया में समय को एक महान मैट्रिक्स में उत्पन्न होने वाले बहुत महीन टुकड़ों में विभाजित करता है।


2

आप रोलिंग विंडो के माध्यम से रेखीय प्रतिगमन को चलाने के लिए PerformanceAnalytics में apply.rolling फ़ंक्शन का उपयोग कर सकते हैं, जो आपके गुणांक को समय के साथ अलग-अलग करने की अनुमति देगा।

उदाहरण के लिए:

library(PerformanceAnalytics)
library(quantmod)
getSymbols(c('AAPL','SPY'), from='01-01-1900')
chart.RollingRegression(Cl(AAPL),Cl(SPY), width=252, attribute='Beta')
#Note: Alpha=y-intercept, Beta=regression coeffient

यह अन्य कार्यों के साथ भी काम करता है।


आपके उत्तर के लिए धन्यवाद, मुझे लगता है कि एक चलती समय-खिड़की को मेरे दृष्टिकोण के साथ-साथ काम करना चाहिए। हालाँकि, मुझे चलाने के लिए आपका उदाहरण नहीं मिल रहा है, क्या आप कृपया मेरे sTRACE उदाहरण के आधार पर एक उदाहरण दे सकते हैं ताकि मुझे पता चले कि इसे कैसे लागू किया जाए?
मैक्स गॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.