2015-06-28 13 views
6

Bir spline terimine dayanan zamana bağlı katsayıya sahip bir coxph modelinde tahmin edilen tehlike oranını zamanın bir fonksiyonu olarak çizmek istiyorum.Coxph nesnesinden tahmini HR'yi zamana bağlı katsayı ve splinelarla çizme

# Fit a time transform model using current age 
cox = coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung, 
    tt=function(x,t,...) pspline(x + t/365.25)) 

survfit bir tt dönem (as described in 2011 by Terry Therneau) olan modeller anlamıyor hatayla survfit(cox) sonuçları çağrılması: Ben ?coxph düz geliyor bu örneğe benzer işlevi tt kullanılarak zamana bağlı katsayısı yarattı.

Doğrusal yordayıcıyı cox$linear.predictors kullanarak ayıklayabilirsiniz, ancak bir şekilde yaşları ve daha az önemsiz, her biriyle gitmek için zamanları ayıklamak gerekir. tt, veri kümesini olay zamanlarına böldüğünden, giriş verileri çerçevesinin sütunlarını coxph çıktısıyla eşleştiremiyorum. Ek olarak, gerçekten gözlenen veri noktalarının tahminlerini, değil sadece gözlenen veri noktaları için tahmin etmek istiyorum.

Burada spline içeren a related question var, ancak tt'u içermiyor.

Düzenleme (7/7)

Hala bu üzerinde şaşırıp.

spline.obj = pspline(lung$age) 
str(spline.obj) 

# something that looks very useful, but I am not sure what it is 
# cbase appears to be the cardinal knots 
attr(spline.obj, "printfun") 

function (coef, var, var2, df, history, cbase = c(43.3, 47.6, 
51.9, 56.2, 60.5, 64.8, 69.1, 73.4, 77.7, 82, 86.3, 90.6)) 
{ 
    test1 <- coxph.wtest(var, coef)$test 
    xmat <- cbind(1, cbase) 
    xsig <- coxph.wtest(var, xmat)$solve 
    cmat <- coxph.wtest(t(xmat) %*% xsig, t(xsig))$solve[2, ] 
    linear <- sum(cmat * coef) 
    lvar1 <- c(cmat %*% var %*% cmat) 
    lvar2 <- c(cmat %*% var2 %*% cmat) 
    test2 <- linear^2/lvar1 
    cmat <- rbind(c(linear, sqrt(lvar1), sqrt(lvar2), test2, 
     1, 1 - pchisq(test2, 1)), c(NA, NA, NA, test1 - test2, 
     df - 1, 1 - pchisq(test1 - test2, max(0.5, df - 1)))) 
    dimnames(cmat) <- list(c("linear", "nonlin"), NULL) 
    nn <- nrow(history$thetas) 
    if (length(nn)) 
     theta <- history$thetas[nn, 1] 
    else theta <- history$theta 
    list(coef = cmat, history = paste("Theta=", format(theta))) 
} 

Yani, düğüm vardır, ama yine de aslında işlevi çizmek amacıyla knot ile coxph katsayılarını nasıl birleştirileceğini emin değilim: Ben bu nesneye derinlemesine bakıyordum. Herhangi bir yol çok takdir etti.

+0

Bildiğim kadarıyla akciğer veri kümesi her hasta için sadece tek bir satır vardır söyleyebilirim. Veri kümesini, 't'-vektörlü çok sayıda veri satırı olacak şekilde genişletmeniz gerekir. –

+0

Öyleyse temelde 'tt' başlık altında ne yapıyor yeniden yaratmalıyım? Uzun vadeli veri kümesini döndürmenin bir yolu olduğuna inanmıyorum ... –

+0

Ayrıca, eğer bunu yaparsam, gözlemlenen veri noktası için sadece tahminleri çizmekle kaldım, değil mi? –

cevap

3

pspline kullanarak bir giriş matrisi oluşturarak ve bunu coxph çıktısından ilgili katsayılar ile bunu matrisle çarparak ihtiyaç duyduğunuz şeyi üretebilirim. İK almak için üssü almanız gerekiyor.

yani

output <- data.frame(Age = seq(min(lung$age) + min(lung$time)/365.25, 
           max(lung$age + lung$time/365.25), 
           0.01)) 
output$HR <- exp(pspline(output$Age) %*% cox$coefficients[-1] - 
       sum(cox$means[-1] * cox$coefficients[-1])) 
library("ggplot2") 
ggplot(output, aes(x = Age, y = HR)) + geom_line() 

Plot of HR vs age

Not burada yaş ilgi konusu zaman (diğer bir deyişle taban yaş toplamı ve çalışma başlangıcından itibaren geçen süre) de yaşı. Orijinal modeldeki parametrelerle eşleştirmek için belirtilen aralığı kullanmalıdır. Ayrıca olarak gösterilen x = TRUE kullanarak x çıkışı kullanılarak hesaplanabilir:

cox <- coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung, 
      tt=function(x,t,...) pspline(x + t/365.25), x = TRUE) 
index <- as.numeric(unlist(lapply(strsplit(rownames(cox$x), "\\."), "[", 1))) 
ages <- lung$age[index] 
output2 <- data.frame(Age = ages + cox$y[, 1]/365.25, 
         HR = exp(cox$x[, -1] %*% cox$coefficients[-1] - 
           sum(cox$means[-1] * cox$coefficients[-1]))) 
+0

Mükemmel! Çok teşekkürler! Muhtemelen devam eden bir makalede bu yaklaşımı temel alan bir çizim kullanacağım ve eğer isterseniz, sizi kabul etmekten mutluluk duyacağım. –

+0

@ Yarım onay, beni kabul etmen için çok mutlu. Bunu biraz daha fazla düşünmekteyim (ve hayatta kalma ::: coxpenal.fit 'koduna bakarak) ve log'dan (HR) "ortalamalar katsayıları" nın toplamını çıkarmam gerektiğini fark ettim. Bunu yansıtmak için yukarıdaki kodu düzenledim. Grafiğin şekli aynıdır, ancak y eksenindeki sayılar değişir. HR çizgisinin 1'den geçmesi daha mantıklıdır. –

+0

Ah, evet! Benim asıl örneğim ikili değişkenleri kullandı, bu yüzden gerekli değildi. Teşekkürler! –