Lojistik regresyon modeli, yanıtın bir Bernoulli denemesi olduğunu varsayar (veya daha genel olarak bir binomdur, ancak basitlik için bunu 0-1'de tutacağız). Bir hayatta kalma modeli, yanıtın tipik olarak olay zamanı olduğunu varsayar (yine, bunun atlayacağımız genellemeler vardır). Koymak için başka bir yol birimleri olmasıdır geçen bir olay gerçekleşene kadar değerler bir dizi. Her noktada bir madalyonun aslında gizli bir şekilde çevrilmesi değil. (Bu olabilir ki , ancak daha sonra tekrarlanan önlemler için bir modele ihtiyacınız olabilir - belki de bir GLMM.)
Lojistik regresyon modeliniz, her ölümü o yaşta meydana gelen ve kuyruk haline gelen bir bozuk para olarak alır. Aynı şekilde, sansürlenen her veriyi, belirtilen yaşta meydana gelen ve başa çıkan tek bir bozuk para flip olarak kabul eder. Buradaki sorun, verilerin gerçekte ne olduğu ile tutarsız olmasıdır.
İşte bazı veriler ve modellerin çıktıları. (Çizginin koşullu yoğunluk grafiğiyle eşleşmesi için tahminleri lojistik regresyon modelinden canlı tahmin etmeye çevirdiğimi unutmayın.)
library(survival)
data(lung)
s = with(lung, Surv(time=time, event=status-1))
summary(sm <- coxph(s~age, data=lung))
# Call:
# coxph(formula = s ~ age, data = lung)
#
# n= 228, number of events= 165
#
# coef exp(coef) se(coef) z Pr(>|z|)
# age 0.018720 1.018897 0.009199 2.035 0.0419 *
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# exp(coef) exp(-coef) lower .95 upper .95
# age 1.019 0.9815 1.001 1.037
#
# Concordance= 0.55 (se = 0.026 )
# Rsquare= 0.018 (max possible= 0.999 )
# Likelihood ratio test= 4.24 on 1 df, p=0.03946
# Wald test = 4.14 on 1 df, p=0.04185
# Score (logrank) test = 4.15 on 1 df, p=0.04154
lung$died = factor(ifelse(lung$status==2, "died", "alive"), levels=c("died","alive"))
summary(lrm <- glm(status-1~age, data=lung, family="binomial"))
# Call:
# glm(formula = status - 1 ~ age, family = "binomial", data = lung)
#
# Deviance Residuals:
# Min 1Q Median 3Q Max
# -1.8543 -1.3109 0.7169 0.8272 1.1097
#
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -1.30949 1.01743 -1.287 0.1981
# age 0.03677 0.01645 2.235 0.0254 *
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# (Dispersion parameter for binomial family taken to be 1)
#
# Null deviance: 268.78 on 227 degrees of freedom
# Residual deviance: 263.71 on 226 degrees of freedom
# AIC: 267.71
#
# Number of Fisher Scoring iterations: 4
windows()
plot(survfit(s~1))
windows()
par(mfrow=c(2,1))
with(lung, spineplot(age, as.factor(status)))
with(lung, cdplot(age, as.factor(status)))
lines(40:80, 1-predict(lrm, newdata=data.frame(age=40:80), type="response"),
col="red")
Verilerin bir sağkalım analizi veya lojistik regresyon için uygun olduğu bir durumu değerlendirmek yararlı olabilir. Hastanın taburcu olduktan sonraki 30 gün içinde yeni bir protokol veya bakım standardı altında hastaneye yeniden kabul edilme olasılığını belirlemek için bir çalışma düşünün. Bununla birlikte, tüm hastalar geri kabul için takip edilir ve sansür yoktur (bu çok gerçekçi değildir), bu nedenle geri kabul için kesin zaman sağkalım analizi ile analiz edilebilir (yani burada Cox orantılı bir tehlike modeli). Bu durumu simüle etmek için, .5 ve 1 oranlı üstel dağılımları kullanacağım ve 30 değerini temsil etmek için 1 değerini bir kesme olarak kullanacağım:
set.seed(0775) # this makes the example exactly reproducible
t1 = rexp(50, rate=.5)
t2 = rexp(50, rate=1)
d = data.frame(time=c(t1,t2),
group=rep(c("g1","g2"), each=50),
event=ifelse(c(t1,t2)<1, "yes", "no"))
windows()
plot(with(d, survfit(Surv(time)~group)), col=1:2, mark.time=TRUE)
legend("topright", legend=c("Group 1", "Group 2"), lty=1, col=1:2)
abline(v=1, col="gray")
with(d, table(event, group))
# group
# event g1 g2
# no 29 22
# yes 21 28
summary(glm(event~group, d, family=binomial))$coefficients
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -0.3227734 0.2865341 -1.126475 0.2599647
# groupg2 0.5639354 0.4040676 1.395646 0.1628210
summary(coxph(Surv(time)~group, d))$coefficients
# coef exp(coef) se(coef) z Pr(>|z|)
# groupg2 0.5841386 1.793445 0.2093571 2.790154 0.005268299
Bu durumda, lojistik regresyon modeli (p-değeri görüyoruz 0.163
) idi (bir yaşam sürdürme analizi p-değerinden daha yüksek0.005
). Bu fikri daha fazla araştırmak için, bir lojistik regresyon analizinin gücünü bir hayatta kalma analizine karşı tahmin etmek için simülasyonu genişletebiliriz ve Cox modelindeki p-değerinin lojistik regresyondan p-değerinden daha düşük olma olasılığı . Ben de 1.4 olarak eşik olarak kullanacağım, böylece lojistik regresyonu en düşük düzeyde bir kesme kullanarak dezavantajlı değilim:
xs = seq(.1,5,.1)
xs[which.max(pexp(xs,1)-pexp(xs,.5))] # 1.4
set.seed(7458)
plr = vector(length=10000)
psv = vector(length=10000)
for(i in 1:10000){
t1 = rexp(50, rate=.5)
t2 = rexp(50, rate=1)
d = data.frame(time=c(t1,t2), group=rep(c("g1", "g2"), each=50),
event=ifelse(c(t1,t2)<1.4, "yes", "no"))
plr[i] = summary(glm(event~group, d, family=binomial))$coefficients[2,4]
psv[i] = summary(coxph(Surv(time)~group, d))$coefficients[1,5]
}
## estimated power:
mean(plr<.05) # [1] 0.753
mean(psv<.05) # [1] 0.9253
## probability that p-value from survival analysis < logistic regression:
mean(psv<plr) # [1] 0.8977
Lojistik regresyonun gücü sağkalım analizi (% 93 kadar) daha (% 75 kadar) daha düşük, ve hayatta kalma analizleri ile ilgili p-değerleri% 90 lojistik regresyon karşılık gelen p-değerleri daha düşüktür. Gecikme sürelerini hesaba katmak, bazı eşik değerlerden daha az veya daha büyük yerine, sezdiğiniz gibi daha fazla istatistiksel güç sağlar.