chjackson / flexsurv

The flexsurv R package for flexible parametric survival and multi-state modelling
http://chjackson.github.io/flexsurv/
53 stars 28 forks source link

coefficients in opposite signs compared to survreg #184

Closed abduazizR closed 1 month ago

abduazizR commented 3 months ago

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 ``` r 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 #> #> ────────────────────────────────────────────────────────────────────────────── ```
chjackson commented 3 months ago

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.