Mô hình hồi quy logistic giả định rằng phản hồi là một thử nghiệm Bernoulli (hay nói chung hơn là nhị thức, nhưng để đơn giản, chúng tôi sẽ giữ nguyên 0-1). Một mô hình sinh tồn giả định rằng phản hồi thường là thời gian xảy ra sự kiện (một lần nữa, có những khái quát về điều này mà chúng ta sẽ bỏ qua). Một cách khác để nói rằng các đơn vị đang truyền qua một loạt các giá trị cho đến khi một sự kiện xảy ra. Nó không phải là một đồng tiền thực sự được lật một cách riêng biệt tại mỗi điểm. (Tất nhiên điều đó có thể xảy ra, nhưng sau đó bạn sẽ cần một mô hình cho các biện pháp lặp đi lặp lại có lẽ là một GLMM.)
Mô hình hồi quy logistic của bạn lấy mỗi cái chết như một đồng xu lật xảy ra ở tuổi đó và đưa ra đuôi. Tương tự như vậy, nó coi mỗi mốc dữ liệu bị kiểm duyệt là một lần lật đồng xu duy nhất xảy ra ở độ tuổi quy định và đưa ra các đầu. Vấn đề ở đây là không phù hợp với dữ liệu thực sự là gì.
Dưới đây là một số sơ đồ của dữ liệu và đầu ra của các mô hình. (Lưu ý rằng tôi chuyển các dự đoán từ mô hình hồi quy logistic sang dự đoán còn sống để đường thẳng khớp với biểu đồ mật độ có điều kiệ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")
Có thể hữu ích để xem xét một tình huống trong đó dữ liệu phù hợp cho phân tích sinh tồn hoặc hồi quy logistic. Hãy tưởng tượng một nghiên cứu để xác định xác suất bệnh nhân sẽ được đưa vào bệnh viện trong vòng 30 ngày sau khi xuất viện theo một giao thức mới hoặc tiêu chuẩn chăm sóc. Tuy nhiên, tất cả các bệnh nhân đều được theo dõi để nhận lại, và không có kiểm duyệt (điều này không thực tế lắm), vì vậy thời gian chính xác để nhận lại có thể được phân tích với phân tích tỷ lệ sống sót (viz., Mô hình mối nguy theo tỷ lệ Cox ở đây). Để mô phỏng tình huống này, tôi sẽ sử dụng các phân phối theo cấp số nhân với tỷ lệ 0,5 và 1 và sử dụng giá trị 1 làm điểm cắt để biểu thị trong 30 ngày:
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
Trong trường hợp này, chúng ta thấy rằng giá trị p từ mô hình hồi quy logistic ( 0.163
) là cao hơn so với giá trị p từ một phân tích tồn tại ( 0.005
). Để khám phá ý tưởng này hơn nữa, chúng ta có thể mở rộng mô phỏng để ước tính sức mạnh của phân tích hồi quy logistic so với phân tích sinh tồn và xác suất giá trị p từ mô hình Cox sẽ thấp hơn giá trị p từ hồi quy logistic . Tôi cũng sẽ sử dụng 1,4 làm ngưỡng, để tôi không gây bất lợi cho hồi quy logistic bằng cách sử dụng ngưỡng cắt tối ưu:
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
Vì vậy, sức mạnh của hồi quy logistic là thấp hơn (khoảng 75%) so với phân tích tồn tại (khoảng 93%), và 90% của p-giá trị từ việc phân tích tồn tại đã thấp hơn so với p-giá trị tương ứng từ hồi quy logistic. Nếu tính đến thời gian trễ, thay vì chỉ nhỏ hơn hoặc lớn hơn một số ngưỡng sẽ mang lại nhiều sức mạnh thống kê hơn như bạn đã trực giác.