flexsurv-dev icon indicating copy to clipboard operation
flexsurv-dev copied to clipboard

coefficients in opposite signs compared to survreg

Open abduazizR opened this issue 1 year ago • 1 comments

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
#> 
#> ──────────────────────────────────────────────────────────────────────────────

abduazizR avatar Mar 24 '24 19:03 abduazizR

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.

chjackson avatar Mar 25 '24 09:03 chjackson