Figure 1 - Hazard Ratio Analysis of Fiber Intake

The data we are visualizing here has the following structure:

Panel B

Mortality Hazard for PFS by daily average fiber intake, visualized via partial smoothing spline. Ticks along the x axis represent individual patients.

makeSpline(all_metadata_fiber, all_metadata_fiber$pfs_mo, all_metadata_fiber$pod_status, 
           all_metadata_fiber$aofib,
           xlab = "Daily average fiber intake (g/day)", ylab="Hazard ratio (95% CI)",
           title="Smoothing spline for progression-free survival",
           knots=2,
           centerpoint = 15) +
  scale_x_log10()

Panel C

Mortality Hazard for OS by daily average fiber intake, visualized via partial smoothing spline. Ticks along the x axis represent individual patients.

makeSpline(all_metadata_fiber, all_metadata_fiber$os_mo, all_metadata_fiber$os_status, 
           all_metadata_fiber$aofib,
           xlab = "Daily average fiber intake (g/day)", ylab="Hazard ratio (95% CI)",
           title="Smoothing spline for overall survival",
           knots=2, 
           centerpoint = 15) +
  scale_x_log10()

Panel D

Kaplan-Meier PFS by daily average fiber intake, two groups >= 15 grams/day.

kmPFS<-survfit(Surv(pfs_mo, pod_status)~fiber_dichotomized,
               type="kaplan-meier", data=all_metadata_fiber)

ggsurvplot(kmPFS,risk.table=TRUE,
           xlab="Time (months)", 
           ylab="Progression-free survival",
           pval = TRUE,
           legend=c(0.8,0.9),
           title="Patients with urothelial or renal cell cancer on ICB",
           legend.title="Fiber intake",
           legend.labs=c("<15 g/day","15+ g/day"),
           #surv.median.line = "hv",
           conf.int=TRUE,
           break.x.by=6,
           axes.offset=FALSE,
           xlim=c(0,25),
           data = all_metadata_fiber)

Panel E

Kaplan-Meier OS by daily average fiber intake, two groups >= 15 grams/day.

kmOS<-survfit(Surv(os_mo, os_status)~fiber_dichotomized,
              type="kaplan-meier", data=all_metadata_fiber)

ggsurvplot(kmOS,risk.table=TRUE,
           xlab="Time (months)", 
           ylab="Overall survival",
           pval = TRUE,
           legend="none",
           title="Patients with urothelial or renal cell cancer on ICB",
           legend.title="Fiber intake",
           legend.labs=c("<15 g/day","15+ g/day"),
           #surv.median.line = "hv",
           conf.int=TRUE,
           break.x.by=6,
           axes.offset=FALSE,
           xlim=c(0,25),
           data = all_metadata_fiber)

Panel F

Univariate HRs for PFS among clinically relavant subgroups.

cox_pfs_all_uv <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                    all_metadata_fiber)
summary(cox_pfs_all_uv)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = all_metadata_fiber)

  n= 86, number of events= 55 

                      coef exp(coef) se(coef)      z Pr(>|z|)   
fiber_dichotomized -0.8011    0.4488   0.2780 -2.882  0.00395 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.4488      2.228    0.2603    0.7739

Concordance= 0.606  (se = 0.033 )
Likelihood ratio test= 7.82  on 1 df,   p=0.005
Wald test            = 8.31  on 1 df,   p=0.004
Score (logrank) test = 8.74  on 1 df,   p=0.003
cox_pfs_RC <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                   mRCdataFiber)
summary(cox_pfs_RC)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = mRCdataFiber)

  n= 48, number of events= 28 

                      coef exp(coef) se(coef)      z Pr(>|z|)   
fiber_dichotomized -1.0541    0.3485   0.3945 -2.672  0.00754 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.3485      2.869    0.1608    0.7551

Concordance= 0.641  (se = 0.046 )
Likelihood ratio test= 6.46  on 1 df,   p=0.01
Wald test            = 7.14  on 1 df,   p=0.008
Score (logrank) test = 7.8  on 1 df,   p=0.005
cox_pfs_RC_IpiNivo <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                           dataRCIpiNivoFiber)
summary(cox_pfs_RC_IpiNivo)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = dataRCIpiNivoFiber)

  n= 15, number of events= 8 

                      coef exp(coef) se(coef)      z Pr(>|z|)
fiber_dichotomized -0.7864    0.4555   0.7387 -1.065    0.287

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.4555      2.196    0.1071     1.937

Concordance= 0.627  (se = 0.094 )
Likelihood ratio test= 1.04  on 1 df,   p=0.3
Wald test            = 1.13  on 1 df,   p=0.3
Score (logrank) test = 1.19  on 1 df,   p=0.3
cox_pfs_RC_TKI_IO <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                          dataRCioTKIFiber)
summary(cox_pfs_RC_TKI_IO)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = dataRCioTKIFiber)

  n= 24, number of events= 12 

                      coef exp(coef) se(coef)      z Pr(>|z|)  
fiber_dichotomized -1.1926    0.3034   0.6183 -1.929   0.0538 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.3034      3.295   0.09031      1.02

Concordance= 0.635  (se = 0.073 )
Likelihood ratio test= 3.16  on 1 df,   p=0.08
Wald test            = 3.72  on 1 df,   p=0.05
Score (logrank) test = 4.17  on 1 df,   p=0.04
cox_pfs_UC <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                           mUCdataFiber)
summary(cox_pfs_UC)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = mUCdataFiber)

  n= 38, number of events= 27 

                      coef exp(coef) se(coef)      z Pr(>|z|)
fiber_dichotomized -0.3084    0.7346   0.3919 -0.787    0.431

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.7346      1.361    0.3408     1.584

Concordance= 0.53  (se = 0.052 )
Likelihood ratio test= 0.61  on 1 df,   p=0.4
Wald test            = 0.62  on 1 df,   p=0.4
Score (logrank) test = 0.62  on 1 df,   p=0.4
cox_pfs_UC_NOTavelumab <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                   dataUC_NOTavelumabFiber)
summary(cox_pfs_UC_NOTavelumab)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = dataUC_NOTavelumabFiber)

  n= 24, number of events= 19 

                       coef exp(coef) se(coef)      z Pr(>|z|)
fiber_dichotomized -0.03016   0.97029  0.46269 -0.065    0.948

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.9703      1.031    0.3918     2.403

Concordance= 0.473  (se = 0.07 )
Likelihood ratio test= 0  on 1 df,   p=0.9
Wald test            = 0  on 1 df,   p=0.9
Score (logrank) test = 0  on 1 df,   p=0.9
cox_pfs_UC_avelumab <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized,
                            dataUCavelumabFiber)
summary(cox_pfs_UC_avelumab)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized, 
    data = dataUCavelumabFiber)

  n= 14, number of events= 8 

                      coef exp(coef) se(coef)      z Pr(>|z|)
fiber_dichotomized -0.1060    0.8994   0.8239 -0.129    0.898

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.8994      1.112    0.1789     4.521

Concordance= 0.527  (se = 0.091 )
Likelihood ratio test= 0.02  on 1 df,   p=0.9
Wald test            = 0.02  on 1 df,   p=0.9
Score (logrank) test = 0.02  on 1 df,   p=0.9
forestplot_data <- tibble::tibble(mean  = c(0.4488,0.3485, 0.4555, 0.3034, 0.7346, 0.97029, 0.8994),
                            lower = c(0.26032,0.1608, 0.1071, 0.09031, 0.3408, 0.3918, 0.1789),
                            upper = c( 0.7739,0.7551, 1.937, 1.02, 1.584, 2.403, 4.521),
                            study = c("All","RCC", "RCC ipi-nivo", "RCC TKI-ICB",
                                      "UC", "UC non-maintenance ICB", "UC maintenance ICB"),
                            n = c("86","48","15","24","38","24","14"),
                            events = c("55","28","8","12","27","19","8"),
                            HR = c("0.45","0.35", "0.46", "0.30", "0.73", "0.97", "0.90"))

forestplot_data |>
  forestplot(labeltext = c(study, n, events, HR),
             clip = c(0.09, 2.5),
             xlog = TRUE,
             xlab = "Hazard ratio for PFS (95% CI)",
             xticks = c(0.1,0.25,0.5,1.0,2.5),
             title = "Univariable progression-free survival subgroup analyis") |>
  fp_set_style(box = "royalblue",
               line = "darkblue",
               summary = "royalblue") |> 
  fp_add_header(study = c("Subgroup"),
                n = c("n"),
                events = c("Events"),
                HR = c("HR")) 

Panel G

Multivariate HR for PFS adjusted for age, diagnosis, and performance status.

cox_pfs_all <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized + ageby10 + 
                      ecog_1to5_final + cancer_RCCvsUC_NAME + stage.simplified.factor,
                   all_metadata_fiber)
summary(cox_pfs_all)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized + 
    ageby10 + ecog_1to5_final + cancer_RCCvsUC_NAME + stage.simplified.factor, 
    data = all_metadata_fiber)

  n= 86, number of events= 55 

                                   coef exp(coef) se(coef)      z Pr(>|z|)   
fiber_dichotomized              -0.7851    0.4561   0.2946 -2.665   0.0077 **
ageby10                          0.3098    1.3631   0.1463  2.118   0.0342 * 
ecog_1to5_final                  0.3067    1.3589   0.3375  0.909   0.3635   
cancer_RCCvsUC_NAMEUC            0.4615    1.5864   0.2986  1.546   0.1222   
stage.simplified.factorStage IV  0.3596    1.4327   1.0407  0.346   0.7297   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                                exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized                 0.4561     2.1925    0.2560    0.8125
ageby10                            1.3631     0.7336    1.0233    1.8157
ecog_1to5_final                    1.3589     0.7359    0.7013    2.6332
cancer_RCCvsUC_NAMEUC              1.5864     0.6303    0.8836    2.8482
stage.simplified.factorStage IV    1.4327     0.6980    0.1864   11.0150

Concordance= 0.675  (se = 0.036 )
Likelihood ratio test= 19.37  on 5 df,   p=0.002
Wald test            = 19.17  on 5 df,   p=0.002
Score (logrank) test = 20.29  on 5 df,   p=0.001
cox_pfs_RC <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized + ageby10 + ecog_1to5_final,
                   mRCdataFiber) #could not adjust for stage because all patients with RCC were stage IV
summary(cox_pfs_RC)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized + 
    ageby10 + ecog_1to5_final, data = mRCdataFiber)

  n= 48, number of events= 28 

                      coef exp(coef) se(coef)      z Pr(>|z|)   
fiber_dichotomized -1.1441    0.3185   0.4488 -2.549  0.01079 * 
ageby10             0.5361    1.7093   0.2011  2.666  0.00769 **
ecog_1to5_final     0.5315    1.7015   0.4766  1.115  0.26483   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                   exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized    0.3185     3.1396    0.1322    0.7676
ageby10               1.7093     0.5850    1.1525    2.5352
ecog_1to5_final       1.7015     0.5877    0.6685    4.3306

Concordance= 0.727  (se = 0.048 )
Likelihood ratio test= 15.03  on 3 df,   p=0.002
Wald test            = 15.1  on 3 df,   p=0.002
Score (logrank) test = 16.22  on 3 df,   p=0.001
cox_pfs_UC <-coxph(Surv(pfs_mo,pod_status)~ fiber_dichotomized+ ageby10 + ecog_1to5_final + stage.simplified.factor,
                   mUCdataFiber)
summary(cox_pfs_UC)
Call:
coxph(formula = Surv(pfs_mo, pod_status) ~ fiber_dichotomized + 
    ageby10 + ecog_1to5_final + stage.simplified.factor, data = mUCdataFiber)

  n= 38, number of events= 27 

                                   coef exp(coef) se(coef)      z Pr(>|z|)
fiber_dichotomized              -0.3016    0.7397   0.4143 -0.728    0.467
ageby10                          0.1800    1.1973   0.1998  0.901    0.367
ecog_1to5_final                 -0.2445    0.7831   0.5621 -0.435    0.664
stage.simplified.factorStage IV  0.8216    2.2742   1.1013  0.746    0.456

                                exp(coef) exp(-coef) lower .95 upper .95
fiber_dichotomized                 0.7397     1.3520    0.3284     1.666
ageby10                            1.1973     0.8352    0.8094     1.771
ecog_1to5_final                    0.7831     1.2770    0.2603     2.356
stage.simplified.factorStage IV    2.2742     0.4397    0.2627    19.689

Concordance= 0.551  (se = 0.07 )
Likelihood ratio test= 1.97  on 4 df,   p=0.7
Wald test            = 1.83  on 4 df,   p=0.8
Score (logrank) test = 1.86  on 4 df,   p=0.8
forestplot_data <- tibble::tibble(mean  = c(0.4561, 0.3185, 0.7397),
                                  lower = c(0.2560, 0.1322, 0.3284),
                                  upper = c(0.8125, 0.7676, 1.666),
                                  study = c("All", "RCC", "UC"),
                                  n = c("86","48","38"),
                                  events = c("55","28","27"),
                                  HR = c("0.46","0.32","0.74"))

forestplot_data |>
  forestplot(labeltext = c(study, n, events, HR),
             clip = c(0.09, 2.5),
             xlog = TRUE,
             xlab = "Hazard ratio for PFS (95% CI)",
             xticks = c(0.1,0.25,0.5,1.0,2.5),
             title = "Multivariable progression-free survival subgroup analyis") |>
  fp_set_style(box = "royalblue",
               line = "darkblue",
               summary = "royalblue") |> 
  fp_add_header(study = c("Subgroup"),
                n = c("n"),
                events = c("Events"),
                HR = c("HR"))