2025-01-12 00:52:51 +08:00

182 lines
7.6 KiB
Plaintext

R Under development (unstable) (2024-04-17 r86441) -- "Unsuffered Consequences"
Copyright (C) 2024 The R Foundation for Statistical Computing
Platform: aarch64-unknown-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> options(na.action=na.exclude) # preserve missings
> options(contrasts=c('contr.treatment', 'contr.poly')) #ensure constrast type
> library(survival)
> aeq <- function(x,y) all.equal(as.vector(x), as.vector(y))
> #
> # These results can be found in Miller
> #
> fit <- coxph(Surv(aml$time, aml$status) ~ aml$x, method='breslow')
> fit
Call:
coxph(formula = Surv(aml$time, aml$status) ~ aml$x, method = "breslow")
coef exp(coef) se(coef) z p
aml$xNonmaintained 0.9042 2.4700 0.5122 1.765 0.0775
Likelihood ratio test=3.3 on 1 df, p=0.06945
n= 23, number of events= 18
> resid(fit, type='mart')
1 2 3 4 5 6
0.86225539 0.79200985 -0.20799015 0.74818869 0.65652976 -0.39796610
7 8 9 10 11 12
0.45424957 0.25475051 -1.05400917 -0.55400917 -1.55400917 0.87844483
13 14 15 16 17 18
0.87844483 0.74006941 0.74006941 0.57677292 -0.51373647 0.15162716
19 20 21 22 23
0.01702219 -0.14897252 -0.56448258 -1.15185244 -1.60340676
> resid(fit, type='score')
1 2 3 4 5 6
-0.546856248 -0.492501830 0.141063944 -0.479907930 -0.447416819 0.268453990
7 8 9 10 11 12
-0.235908976 -0.072655945 0.640826596 0.640826596 0.640826596 0.237767767
13 14 15 16 17 18
0.237767767 0.232585063 0.232585063 0.203878910 -0.165307985 0.044923326
19 20 21 22 23
0.007079721 -0.039651990 -0.181184547 -0.395076175 -0.472116894
> resid(fit, type='scho')
5 5 8 8 9 12 13
0.2706690 0.2706690 0.3081229 0.3081229 -0.6423931 0.3360212 -0.6335658
18 23 23 27 30 31 33
-0.6494307 -0.6791937 0.3208063 0.3269751 0.3360212 -0.5970995 0.3505693
34 43 45 48
-0.5525731 0.3778334 0.5484457 0.0000000
>
> # Test the drop of an itercept: should have no effect
> fit2 <- coxph(Surv(time, status) ~ x -1, method='breslow',
+ data=aml)
> aeq(fit$loglik, fit2$loglik)
[1] TRUE
> aeq(coef(fit), coef(fit2))
[1] TRUE
> aeq(fit$var, fit2$var)
[1] TRUE
>
> fit <- survfit(Surv(aml$time, aml$status) ~ aml$x)
> fit
Call: survfit(formula = Surv(aml$time, aml$status) ~ aml$x)
n events median 0.95LCL 0.95UCL
aml$x=Maintained 11 7 31 18 NA
aml$x=Nonmaintained 12 11 23 8 NA
> summary(fit)
Call: survfit(formula = Surv(aml$time, aml$status) ~ aml$x)
aml$x=Maintained
time n.risk n.event survival std.err lower 95% CI upper 95% CI
9 11 1 0.909 0.0867 0.7541 1.000
13 10 1 0.818 0.1163 0.6192 1.000
18 8 1 0.716 0.1397 0.4884 1.000
23 7 1 0.614 0.1526 0.3769 0.999
31 5 1 0.491 0.1642 0.2549 0.946
34 4 1 0.368 0.1627 0.1549 0.875
48 2 1 0.184 0.1535 0.0359 0.944
aml$x=Nonmaintained
time n.risk n.event survival std.err lower 95% CI upper 95% CI
5 12 2 0.8333 0.1076 0.6470 1.000
8 10 2 0.6667 0.1361 0.4468 0.995
12 8 1 0.5833 0.1423 0.3616 0.941
23 6 1 0.4861 0.1481 0.2675 0.883
27 5 1 0.3889 0.1470 0.1854 0.816
30 4 1 0.2917 0.1387 0.1148 0.741
33 3 1 0.1944 0.1219 0.0569 0.664
43 2 1 0.0972 0.0919 0.0153 0.620
45 1 1 0.0000 NaN NA NA
> survdiff(Surv(aml$time, aml$status)~ aml$x)
Call:
survdiff(formula = Surv(aml$time, aml$status) ~ aml$x)
N Observed Expected (O-E)^2/E (O-E)^2/V
aml$x=Maintained 11 7 10.69 1.27 3.4
aml$x=Nonmaintained 12 11 7.31 1.86 3.4
Chisq= 3.4 on 1 degrees of freedom, p= 0.07
>
> #
> # Test out the weighted K-M
> #
> # First, equal case weights- shouldn't change the survival, but will
> # halve the variance
> temp2 <-survfit(Surv(aml$time, aml$status)~1, weights=rep(2,23))
> temp <-survfit(Surv(time, status)~1, aml)
> aeq(temp$surv, temp2$surv)
[1] TRUE
> aeq(temp$std.err^2, 2*temp2$std.err^2)
[1] TRUE
>
> # Risk weights-- use a null Cox model
> tfit <- coxph(Surv(aml$time, aml$status) ~ offset(log(1:23)))
> sfit <- survfit(tfit, stype=2, ctype=1, censor=FALSE)
>
> # Now compute it by hand. The survfit program will produce a curve
> # corresponding to the mean offset.
> # Ties are a nuisance, the line above forced the Nelson rather than Efron
> # to make it easier
> rscore <- exp(log(1:23) - mean(log(1:23)))[order(aml$time)]
> atime <- sort(aml$time)
> denom <- rev(cumsum(rev(rscore)))
> denom <- denom[match(unique(atime), atime)]
> deaths <- tapply(aml$status, aml$time, sum)
> chaz <- cumsum(deaths/denom)
> all.equal(sfit$surv, as.vector(exp(-chaz[deaths>0])))
[1] TRUE
>
> # And the Efron result
> summary(survfit(tfit))
Call: survfit(formula = tfit)
time n.risk n.event survival std.err lower 95% CI upper 95% CI
5 23 2 0.932 0.0461 0.8463 1.000
8 21 2 0.863 0.0637 0.7467 0.997
9 19 1 0.827 0.0704 0.6999 0.977
12 18 1 0.793 0.0755 0.6576 0.955
13 17 1 0.757 0.0801 0.6152 0.931
18 14 1 0.719 0.0846 0.5709 0.905
23 13 2 0.645 0.0907 0.4893 0.849
27 11 1 0.607 0.0929 0.4496 0.819
30 9 1 0.565 0.0955 0.4054 0.787
31 8 1 0.519 0.0982 0.3579 0.752
33 7 1 0.474 0.0994 0.3140 0.715
34 6 1 0.423 0.1009 0.2649 0.675
43 5 1 0.373 0.1006 0.2198 0.633
45 4 1 0.312 0.1009 0.1657 0.588
48 2 1 0.199 0.1102 0.0674 0.589
>
> # Lots of ties, so its a good test case
> x1 <- coxph(Surv(time, status)~x, aml, method='efron')
> x1
Call:
coxph(formula = Surv(time, status) ~ x, data = aml, method = "efron")
coef exp(coef) se(coef) z p
xNonmaintained 0.9155 2.4981 0.5119 1.788 0.0737
Likelihood ratio test=3.38 on 1 df, p=0.06581
n= 23, number of events= 18
> x2 <- coxph(Surv(rep(0,23),time, status) ~x, aml, method='efron')
> aeq(x1$coef, x2$coef)
[1] TRUE
>
>
> proc.time()
user system elapsed
0.406 0.032 0.436