coefficients in opposite signs compared to survreg
Hi
I see conflicting results between survival and flexsurv. Is there a reason for this? Below is a reproducible example.
From the data, I know that the output from survival is the correct one and flexsurv is also correct, but it's in the opposite sign.
library(survival)
#> Warning: package 'survival' was built under R version 4.3.3
library(flexsurv)
#> Warning: package 'flexsurv' was built under R version 4.3.3
library(haven)
df <- read_dta("http://web1.sph.emory.edu/dkleinb/allDatasets/surv2datasets/anderson.dta")
mod1 <- flexsurv::flexsurvreg(Surv(survt, status) ~ rx, data = df, dist = "exponential")
mod2 <- survival::survreg(Surv(survt, status) ~ rx, data = df, dist = "exponential")
mod1
#> Call:
#> flexsurv::flexsurvreg(formula = Surv(survt, status) ~ rx, data = df,
#> dist = "exponential")
#>
#> Estimates:
#> data mean est L95% U95% se exp(est) L95%
#> rate NA 0.02507 0.01304 0.04818 0.00836 NA NA
#> rx 0.50000 1.52661 0.74575 2.30748 0.39841 4.60256 2.10801
#> U95%
#> rate NA
#> rx 10.04909
#>
#> N = 42, Events: 30, Censored: 12
#> Total time at risk: 541
#> Log-likelihood = -108.524, df = 2
#> AIC = 221.0481
mod2
#> Call:
#> survival::survreg(formula = Surv(survt, status) ~ rx, data = df,
#> dist = "exponential")
#>
#> Coefficients:
#> (Intercept) rx
#> 3.686098 -1.526614
#>
#> Scale fixed at 1
#>
#> Loglik(model)= -108.5 Loglik(intercept only)= -116.8
#> Chisq= 16.49 on 1 degrees of freedom, p= 4.9e-05
#> n= 42
Created on 2024-03-24 with reprex v2.1.0
Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.3.2 (2023-10-31 ucrt)
#> os Windows 11 x64 (build 22631)
#> system x86_64, mingw32
#> ui RTerm
#> language (EN)
#> collate English_United States.utf8
#> ctype English_United States.utf8
#> tz America/Chicago
#> date 2024-03-24
#> pandoc 3.1.1 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> cli 3.6.2 2023-12-11 [1] CRAN (R 4.3.2)
#> colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.2)
#> curl 5.2.1 2024-03-01 [1] CRAN (R 4.3.3)
#> data.table 1.15.2 2024-02-29 [1] CRAN (R 4.3.3)
#> deSolve 1.40 2023-11-27 [1] CRAN (R 4.3.3)
#> digest 0.6.35 2024-03-11 [1] CRAN (R 4.3.3)
#> dplyr 1.1.4 2023-11-17 [1] CRAN (R 4.3.2)
#> evaluate 0.23 2023-11-01 [1] CRAN (R 4.3.2)
#> fansi 1.0.6 2023-12-08 [1] CRAN (R 4.3.2)
#> fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.2)
#> flexsurv * 2.2.2 2023-02-01 [1] CRAN (R 4.3.3)
#> forcats 1.0.0 2023-01-29 [1] CRAN (R 4.3.2)
#> fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.2)
#> generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.2)
#> ggplot2 3.5.0 2024-02-23 [1] CRAN (R 4.3.3)
#> glue 1.7.0 2024-01-09 [1] CRAN (R 4.3.3)
#> gtable 0.3.4 2023-08-21 [1] CRAN (R 4.3.2)
#> haven * 2.5.4 2023-11-30 [1] CRAN (R 4.3.2)
#> hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.2)
#> htmltools 0.5.7 2023-11-03 [1] CRAN (R 4.3.2)
#> knitr 1.45 2023-10-30 [1] CRAN (R 4.3.2)
#> lattice 0.22-6 2024-03-20 [2] CRAN (R 4.3.2)
#> lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.2)
#> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.2)
#> Matrix 1.6-5 2024-01-11 [2] CRAN (R 4.3.3)
#> mstate 0.3.2 2021-11-08 [1] CRAN (R 4.3.3)
#> muhaz 1.2.6.4 2021-04-21 [1] CRAN (R 4.3.3)
#> munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.2)
#> mvtnorm 1.2-4 2023-11-27 [2] CRAN (R 4.3.2)
#> numDeriv 2016.8-1.1 2019-06-06 [2] CRAN (R 4.3.1)
#> pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.2)
#> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.2)
#> purrr 1.0.2 2023-08-10 [1] CRAN (R 4.3.2)
#> quadprog 1.5-8 2019-11-20 [1] CRAN (R 4.3.1)
#> R.cache 0.16.0 2022-07-21 [1] CRAN (R 4.3.2)
#> R.methodsS3 1.8.2 2022-06-13 [1] CRAN (R 4.3.1)
#> R.oo 1.26.0 2024-01-24 [1] CRAN (R 4.3.2)
#> R.utils 2.12.3 2023-11-18 [1] CRAN (R 4.3.2)
#> R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.2)
#> Rcpp 1.0.12 2024-01-09 [1] CRAN (R 4.3.3)
#> readr 2.1.5 2024-01-10 [1] CRAN (R 4.3.3)
#> reprex 2.1.0 2024-01-11 [1] CRAN (R 4.3.3)
#> rlang 1.1.3 2024-01-10 [1] CRAN (R 4.3.3)
#> rmarkdown 2.26 2024-03-05 [1] CRAN (R 4.3.3)
#> rstudioapi 0.16.0 2024-03-24 [1] CRAN (R 4.3.2)
#> scales 1.3.0 2023-11-28 [1] CRAN (R 4.3.2)
#> sessioninfo 1.2.2 2021-12-06 [2] CRAN (R 4.3.2)
#> statmod 1.5.0 2023-01-06 [1] CRAN (R 4.3.3)
#> styler 1.10.2 2023-08-29 [1] CRAN (R 4.3.2)
#> survival * 3.5-8 2024-02-14 [2] CRAN (R 4.3.3)
#> tibble 3.2.1 2023-03-20 [1] CRAN (R 4.3.2)
#> tidyr 1.3.1 2024-01-24 [1] CRAN (R 4.3.3)
#> tidyselect 1.2.1 2024-03-11 [1] CRAN (R 4.3.3)
#> tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.2)
#> utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.2)
#> vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.2)
#> withr 3.0.0 2024-01-16 [1] CRAN (R 4.3.3)
#> xfun 0.42 2024-02-08 [1] CRAN (R 4.3.3)
#> yaml 2.3.8 2023-12-11 [1] CRAN (R 4.3.2)
#>
#> [1] C:/Users/aabdel51/AppData/Local/R/win-library/4.3
#> [2] C:/Users/aabdel51/AppData/Local/Programs/R/R-4.3.2/library
#>
#> ──────────────────────────────────────────────────────────────────────────────
It is just a different parameterisation of the same model. flexsurv parameterises all distributions in a way that is consistent with the distribution functions (such as dexp, dweibull) in base R. survreg is based on a "location+scale" parameterisation - see the textbook referred to on its help page.
The interpretation of this coefficient in flexsurv is explained in the distributions reference. Generally, some transform of the coefficient can be interpreted as a time acceleration factor or a hazard ratio, depending on the distribution.