Part II - Cox PH with Time varying Covariate

Update 20191018: Some R codes have been updated and modified.

Definitions

Cox regression with time-independent covariates assumes that the hazard ratio for any two observations is constant over time. There are three methods to asses the proportional hazard (PH) assumption:

  • graphical, e.g. by using log-log survival curves
  • using a goodness-of-fit (GOF) test
  • using an extended Cox model

We will mainly focus on the extended Cox model.

Extended Cox model

In Cox PH model, the \(p\) time-independent covaraites \(X\)’s are measured at study entry (\(t=0\)).

\[\small \mathsf{ h(t, \mathbf{X}) = h_0(t) \exp\Big[ \sum_{i=1}^{p} \beta_i X_i \Big] }\] The important feature of this model is that hazard ratio depends on the covariates \(X_1,\dots,X_p\) but not on time \(t\). Now we want to relax this assumption and allow the hazard ratio to depend on time \(t\).

\[\small \mathsf{ h(t, \mathbf{X}(t)) = h_0(t) \exp \Big[ \sum_{i=1}^{p} \beta_i X_i + \sum_{i=1}^{p} \delta_i X_i g_i(t) \Big]}, \] where \(g_i(t)\) is some function of time for the \(i\)th covariate. What is crucial now is to define what form should the function \(g_i(t)\) take. For instance:

  • \(g_i(t) = 0\) for all \(i\) implies no time-dependent covariates. This is the original Cox PH model.
  • Let \(X_L\) be one particular time-dependent variable, then \(g_i(t) = t\) for \(i=L\), but \(g_i(t) = 0\) for all other \(i\). The corresponding Cox model is:

\[\small \mathsf{ h(t, \mathbf{X}(t)) = h_0(t) \exp \Big[ \sum_{i=1}^{p} \beta_i X_i + \delta_L (X_L \times t) \Big]} \]

  • We can choose \(g_i(t)\) as a heaviside function. Here \(g_i(t) = 1\), when time \(t\) is above some specific time \(t_0\) and \(g_i(t) = 0\) when \(t\) is below \(t_0\).

\[\small \mathsf{ g_i(t) = \begin{cases} 1 & \text{if } t \geq t_0 \\ 0 & \text{if } t < t_0 \end{cases} }\]

The idea of this model is: If we use one or more heaviside functions, the HR will yield constant values for different time intervals. For instance, a single heaviside function yields two hazard ratios:

\[\small \mathsf{ \begin{cases} t \geq t_0: & \hat{HR} = exp(\hat \beta + \hat \delta) \\ t < t_0: & \hat{HR} = exp(\hat \beta) \end{cases} }\]

This can be extended to a situation with several time intervals - for instance, four-time intervals as illustrated below.

Let us look at the lung available in the survival package. The North Central Cancer Treatment Group (NCCTG) data set records the survival of 228 patients with advanced lung cancer, together with assessments of the patients’ performance status measured either by the physician ph.karno and by the patients themselves pat.karno.

Variable name Description
inst Institution code
time Survival time in days
status censoring status 1=censored, 2=dead
age Age in years
sex Male=1 Female=2
ph.ecog ECOG performance score (0=good 5=dead)
ph.karno Karnofsky performance score (bad=0-good=100) rated by physician
pat.karno Karnofsky performance score as rated by patient
meal.cal Calories consumed at meals
wt.loss Weight loss in last six months
## load libraries
library(survival)
library(survminer)
library(arsenal)
library(tidyverse)
library(knitr)
library(kableExtra)
library(ggplot2)
library(wesanderson) 
library(plotly)
library(htmlTable)
> # Cox Models with time-independent covariates
> cox_multi <- coxph(Surv(time, status) ~ age + sex + ph.karno, data = lung)
> coef(summary(cox_multi))
                coef exp(coef)   se(coef)         z    Pr(>|z|)
age       0.01237540 1.0124523 0.00940461  1.315887 0.188211979
sex      -0.49717029 0.6082494 0.16771275 -2.964416 0.003032584
ph.karno -0.01332184 0.9867665 0.00588006 -2.265596 0.023476158

> # To test for the proportional-hazards (PH) assumption
> (testph_cox_multi <- cox.zph(cox_multi))
             rho    chisq       p
age      0.00701  0.00871 0.92566
sex      0.12249  2.42336 0.11954
ph.karno 0.23135  8.24167 0.00409
GLOBAL        NA 11.54750 0.00911

You can use the ggcoxzph to plot scaled Schoenfeld residuals against the transformed time, as in the code below.

> # No output shown here
> ggcoxzph(testph_cox_multi[3]) 

In the plot we include horizontal reference lines at 0 and at \(\hat\beta\), the Cox model’s estimate of the best overall ph.karno effect. The variation in \(\hat\beta(t)\) is quite large compared to \(\hat\beta\).

> # A similar plot as the one created by ggcoxzph
> {plot(testph_cox_multi[3]) # a plot for the ph.karno variable 
+ abline(h = 0, lty = 3)  # the reference line for null effect
+ abline(h=cox_multi$coef[3], col=2, lwd=1, lty=2) # the red dashed lines = average hazard over time 
+ } 

Schoenfeld’s global test indicates a lack of fit of the model. There is a significant violation of the PH assumption for the ph.karno variable. The effect of Karnofsky performance score is not constant over time. In this case, a time-dependent coefficient is a more useful summary. There appear to be two turning points approximately at the value of 180 and 340.

Step funtion to explore time-dependent variables

The survSplit() function can split each record into subrecordes at specific cut points. The resulting data frame is in a long format where each patient is split and takes several rows. For example, patient 2 takes three rows will intervals (0, 180], (180, 340] and (340, 455].

> lugn_split <- survSplit( 
+   Surv(time, status) ~ ., data = lung, 
+   cut=c(180, 340),
+   episode = "tgroup",
+   id="id")
> 
> head(lugn_split[1:5, c("id", "tgroup", "age", "sex", "pat.karno", "tstart", "time", "status")])
  id tgroup age sex pat.karno tstart time status
1  1      1  74   1       100      0  180      0
2  1      2  74   1       100    180  306      1
3  2      1  68   1        90      0  180      0
4  2      2  68   1        90    180  340      0
5  2      3  68   1        90    340  455      1

What can be useful to observe: If you re-run the same model as above:

> cox_multi <- coxph(Surv(time, status) ~ age + sex + ph.karno, data = lung)

using the created lugn_split data set (instead of lugn), the regression outputs will be identical.

> # Reruning the above model but using the lugn_split dataset instead
> cox_multi_rerun <-
+   update(cox_multi, 
+          Surv(tstart, time, status) ~ .,
+          data = lugn_split)
> 
> # Comparing the two models
> cbind(cox_multi = coef(cox_multi),
+       cox_multi_rerun = coef(cox_multi_rerun)) %>% 
+   txtRound(digits = 5) %>% 
+   knitr::kable(align = "r")
cox_multi cox_multi_rerun
age 0.01238 0.01238
sex -0.49717 -0.49717
ph.karno -0.01332 -0.01332

Let us now proceed with the time-dependent analysis.

> # Cox regression model stratifies by the tgroup variable
> fit_split <- coxph(Surv(tstart, time, status) ~ age + sex + ph.karno:strata(tgroup), 
+                    data = lugn_split,
+                    ties = "breslow")
> 
> coef(summary(fit_split))
                                        coef exp(coef)    se(coef)
age                              0.012991491 1.0130762 0.009473134
sex                             -0.515726192 0.5970669 0.167598009
ph.karno:strata(tgroup)tgroup=1 -0.034996748 0.9656086 0.009628158
ph.karno:strata(tgroup)tgroup=2 -0.013186300 0.9869003 0.011283841
ph.karno:strata(tgroup)tgroup=3  0.005653419 1.0056694 0.009756564
                                         z     Pr(>|z|)
age                              1.3714037 0.1702491515
sex                             -3.0771618 0.0020898182
ph.karno:strata(tgroup)tgroup=1 -3.6348331 0.0002781607
ph.karno:strata(tgroup)tgroup=2 -1.1686003 0.2425647010
ph.karno:strata(tgroup)tgroup=3  0.5794477 0.5622871023
> 
> # To test for the PHs assumption in our new model
> (test.ph <- cox.zph(fit_split))
                                     rho   chisq     p
age                              0.00932 0.01551 0.901
sex                              0.12302 2.42113 0.120
ph.karno:strata(tgroup)tgroup=1 -0.02820 0.13927 0.709
ph.karno:strata(tgroup)tgroup=2  0.03851 0.14764 0.701
ph.karno:strata(tgroup)tgroup=3  0.00717 0.00679 0.934
GLOBAL                                NA 2.72624 0.742

It appears that the variable ph.karno has a significant effect in the first time interval (tgroup=1). The corresponding HR was 0.9656, p = 0.000278. The effects of ph.karno on the remaining two time intervals are not statistically significant. One explanation is that, in this very acute illness, any measure that is over six months old is no longer relevant.

With the stratified analysis, the PH assumption is no longer violated, the global p = 0.742.

> # Use broom package to tidy up the output  
> d <- broom::tidy(fit_split, exponentiate = TRUE) %>% 
+   #arrange(desc(estimate)) %>%
+   mutate(term = factor(term, levels = term))
> 
> # Create an interactive plot using plot_ly 
> plot_ly(d, x = ~estimate, y = ~term) %>%
+   add_markers(error_x = ~list(array = std.error)) %>%
+   layout(title = 'Cox Model Hazard Ratio Estimates and 95% CI for Lung Data')

Continuous time-dependent coefficients

In the previous section, we use heaviside functions to provide several distinct hazard ratios that remain constant within several time intervals. Now we want to define an extended Cox model that provides for diverging survival curves over time. Generally, time-varying effects can have different specifications:

  • x * t: linear covariate effect, linearly time-varying effect
    • f(x) * t: non-linear covariate effect, linearly time-varying effect
    • x * f(t): linear covariate effect, non-linearly time-varying
      • for categorical x - this essentially represents a stratified baseline hazard
    • f(x, t): non-linear covariate and non-linearly time-varying effect

Wrong coding approach

In lung data, in addition to the ph.karno variable, we want to incorporate an interaction term between the covariate ph.karno and time t, i.e. ph.karno * log(t + 20). By including the product term, we can estimate the effect of ph.karno on survival for any specific time t.

In particular, you may be tempted to code it as follow:

> # by using ph.karno:log(time + 5)
> wrong_cph_1 <- coxph(
+       formula = Surv(time, status) ~ age + sex + ph.karno:log(time + 20),
+       data    = lung)
> 
> # by using I(ph.karno * log(time + 5))
> wrong_cph_2 <- coxph(
+       formula = Surv(time, status) ~ age + sex + I(ph.karno * log(time + 20)),
+       data    = lung)
> 
> # Comparing the coefficients
> cbind(Wrong_model_1 = coef(wrong_cph_1),
+       Wrong_model_2 = coef(wrong_cph_2)) %>% 
+   txtRound(digits = 5) %>% 
+   knitr::kable(align = "r")
Wrong_model_1 Wrong_model_2
age -0.00363 -0.00363
sex -0.35264 -0.35264
ph.karno:log(time + 20) -0.00851 -0.00851

Both the models generate the same but wrong result. In Using Time Dependent Covariates and Time Dependent Coefficients in the Cox Model, the authors point out:

The issue is that the above code does not actually create a time dependent covariate, rather it creates a time-static value for each subject based on their value for the covariate time; no differently than if we had constructed the variable outside of a coxph call. This variable most definitely breaks the rule about not looking into the future, and one would quickly find the circularity: large values of time appear to predict long survival because long survival leads to large values for time.

Warning! Don’t use the I() option.

Right coding approach

In the coxph() function, there is a tt argument to specify the specific transformation of time.

> # Right approach
> cph_tt <- coxph(
+       formula = Surv(time, status) ~ age + sex + ph.karno + tt(ph.karno),
+       data    = lung,
+       tt      = function(x, t, ...) x * log(t + 20),
+       ties = "breslow")
> 
> coef(summary(cph_tt))
                    coef exp(coef)    se(coef)         z    Pr(>|z|)
age           0.01302476 1.0131099 0.009451162  1.378112 0.168168832
sex          -0.51264592 0.5989088 0.167654625 -3.057750 0.002230056
ph.karno     -0.09796616 0.9066796 0.038644532 -2.535059 0.011242844
tt(ph.karno)  0.01524410 1.0153609 0.006917607  2.203667 0.027547764

Both the coefficients for ph.karno and tt(ph.karno) are statistically significant. The time-varying effect of ph.karno can be written as: \[\small \mathsf{ \beta(t) = -0.09796616 + 0.01524410 \times log(t + 20) }\]

Alternative coding approach

If you don’t want to use the tt argument in the coxph() function, use the following steps:

> # Step 1 - transform to long format
> lung_long <- survSplit(Surv(time, status)~., 
+                        data = lung, 
+                        id = "id",
+                        cut = unique(lung$time)) %>%
+   mutate(log_time = log(time + 20)) # create a new variable log(t + 20)
> 
> # Step 2 - Add cph.karno:log_time to the Cox model 
> cph_long <- coxph(formula = Surv(tstart, time, status) 
+                   ~ age + sex + ph.karno + ph.karno:log_time, 
+                   data = lung_long,
+                   ties = "breslow")

Observe that we add a time interaction using the : variant, using the * for interactions gives a separate variable for the log_time and that is not of interest. Now we can verify if the two approaches are equivalent:

> ## Step 3 - verifying that the two approaches are equivalent 
> cbind(TT_argument = coef(cph_tt),
+       Alternative = coef(cph_long)) %>% 
+   txtRound(digits = 5) %>% 
+   knitr::kable(align = "r")
TT_argument Alternative
age 0.01302 0.01302
sex -0.51265 -0.51265
ph.karno -0.09797 -0.09797
tt(ph.karno) 0.01524 0.01524
Drop unnecessary variables from your dataset before applying survSplit and/or tt. It can both minimise the risk of running out of memory but also reduce the execution time of your regression model.

Model evaluation

> # Calculations made previously
> # cox_multi <- coxph(Surv(time, status) ~ age + sex + ph.karno, data = lung) 
> temp <- cox.zph(cox_multi, transform= function(time) log(time + 20))
> 
> {plot(temp[3]) # a plot for the ph.karno variable 
+ abline(coef(cph_tt)[3:4], col=2) # the red solid lines 
+ abline(h = 0, lty = 3)  # the reference line for null effect
+ abline(h = coef(cox_multi)[3], col=2, lwd=1, lty=2)} # the red dashed lines

A likelihood ratio (LR) test are commonly used to compare two (nested) Cox regression models.

  • The question is can we use the likelihood ratio test to evaluate if the time-dependent covariates contribute to the model?
> # anova(cox_multi, cph_tt)  #this fails
> 
> # This statistic has a Chi^2 distribution with 1 degrees of freedom 
> 2*(cph_tt$loglik - cox_multi$loglik)[2] 
[1] 4.397189

The null hypothesis is that there is no improvement in the fit of the model, by including the time-dependent covariate tt(ph.karno) . The LR = 4.4 with df = 1 is statistically significant, $p = $0.036.

For part III

Time-varying coefficient can also be investigated with timecox() function in the timereg package. It can fit Cox models with both time-independent and time-varying coefficients. Let’s review this in the next comming post.

Reproducibility

─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 3.5.3 (2019-03-11)
 os       macOS Mojave 10.14.6        
 system   x86_64, darwin15.6.0        
 ui       X11                         
 language (EN)                        
 collate  en_US.UTF-8                 
 ctype    en_US.UTF-8                 
 tz       Europe/Stockholm            
 date     2019-11-10                  

─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
 package     * version    date       lib source                         
 arsenal     * 3.3.0      2019-09-07 [1] CRAN (R 3.5.2)                 
 assertthat    0.2.1      2019-03-21 [1] CRAN (R 3.5.2)                 
 backports     1.1.5      2019-10-02 [1] CRAN (R 3.5.2)                 
 blogdown      0.16       2019-10-01 [1] CRAN (R 3.5.2)                 
 bookdown      0.14       2019-10-01 [1] CRAN (R 3.5.2)                 
 broom         0.5.2      2019-04-07 [1] CRAN (R 3.5.2)                 
 callr         3.3.2      2019-09-22 [1] CRAN (R 3.5.2)                 
 cellranger    1.1.0      2016-07-27 [1] CRAN (R 3.5.0)                 
 checkmate     1.9.4      2019-07-04 [1] CRAN (R 3.5.2)                 
 cli           1.1.0      2019-03-19 [1] CRAN (R 3.5.2)                 
 colorspace    1.4-1      2019-03-18 [1] CRAN (R 3.5.2)                 
 crayon        1.3.4      2017-09-16 [1] CRAN (R 3.5.0)                 
 crosstalk     1.0.0      2016-12-21 [1] CRAN (R 3.5.0)                 
 data.table    1.12.2     2019-04-07 [1] CRAN (R 3.5.2)                 
 desc          1.2.0      2018-05-01 [1] CRAN (R 3.5.0)                 
 devtools    * 2.2.1      2019-09-24 [1] CRAN (R 3.5.2)                 
 digest        0.6.21     2019-09-20 [1] CRAN (R 3.5.2)                 
 dplyr       * 0.8.3      2019-07-04 [1] CRAN (R 3.5.2)                 
 ellipsis      0.3.0      2019-09-20 [1] CRAN (R 3.5.2)                 
 evaluate      0.14       2019-05-28 [1] CRAN (R 3.5.2)                 
 fansi         0.4.0      2018-10-05 [1] CRAN (R 3.5.0)                 
 fastmap       1.0.1      2019-10-08 [1] CRAN (R 3.5.3)                 
 forcats     * 0.4.0      2019-02-17 [1] CRAN (R 3.5.2)                 
 fs            1.3.1      2019-05-06 [1] CRAN (R 3.5.2)                 
 generics      0.0.2      2018-11-29 [1] CRAN (R 3.5.0)                 
 ggplot2     * 3.2.1      2019-08-10 [1] CRAN (R 3.5.2)                 
 ggpubr      * 0.2.3      2019-09-03 [1] CRAN (R 3.5.2)                 
 ggsignif      0.6.0      2019-08-08 [1] CRAN (R 3.5.2)                 
 glue          1.3.1.9000 2019-10-12 [1] Github (tidyverse/glue@71eeddf)
 gridExtra     2.3        2017-09-09 [1] CRAN (R 3.5.0)                 
 gtable        0.3.0      2019-03-25 [1] CRAN (R 3.5.2)                 
 haven         2.1.1      2019-07-04 [1] CRAN (R 3.5.2)                 
 highr         0.8        2019-03-20 [1] CRAN (R 3.5.2)                 
 hms           0.5.1      2019-08-23 [1] CRAN (R 3.5.2)                 
 htmlTable   * 1.13.2     2019-09-22 [1] CRAN (R 3.5.2)                 
 htmltools     0.4.0      2019-10-04 [1] CRAN (R 3.5.2)                 
 htmlwidgets   1.5.1      2019-10-08 [1] CRAN (R 3.5.2)                 
 httpuv        1.5.2      2019-09-11 [1] CRAN (R 3.5.2)                 
 httr          1.4.1      2019-08-05 [1] CRAN (R 3.5.2)                 
 jsonlite      1.6        2018-12-07 [1] CRAN (R 3.5.0)                 
 kableExtra  * 1.1.0      2019-03-16 [1] CRAN (R 3.5.2)                 
 km.ci         0.5-2      2009-08-30 [1] CRAN (R 3.5.0)                 
 KMsurv        0.1-5      2012-12-03 [1] CRAN (R 3.5.0)                 
 knitr       * 1.25       2019-09-18 [1] CRAN (R 3.5.2)                 
 later         1.0.0      2019-10-04 [1] CRAN (R 3.5.2)                 
 lattice       0.20-38    2018-11-04 [1] CRAN (R 3.5.3)                 
 lazyeval      0.2.2      2019-03-15 [1] CRAN (R 3.5.2)                 
 lifecycle     0.1.0      2019-08-01 [1] CRAN (R 3.5.2)                 
 lubridate     1.7.4      2018-04-11 [1] CRAN (R 3.5.0)                 
 magrittr    * 1.5        2014-11-22 [1] CRAN (R 3.5.0)                 
 Matrix        1.2-17     2019-03-22 [1] CRAN (R 3.5.2)                 
 memoise       1.1.0      2017-04-21 [1] CRAN (R 3.5.0)                 
 mime          0.7        2019-06-11 [1] CRAN (R 3.5.2)                 
 modelr        0.1.5      2019-08-08 [1] CRAN (R 3.5.2)                 
 munsell       0.5.0      2018-06-12 [1] CRAN (R 3.5.0)                 
 nlme          3.1-141    2019-08-01 [1] CRAN (R 3.5.2)                 
 pillar        1.4.2      2019-06-29 [1] CRAN (R 3.5.2)                 
 pkgbuild      1.0.6      2019-10-09 [1] CRAN (R 3.5.2)                 
 pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 3.5.2)                 
 pkgload       1.0.2      2018-10-29 [1] CRAN (R 3.5.0)                 
 plotly      * 4.9.0      2019-04-10 [1] CRAN (R 3.5.3)                 
 prettyunits   1.0.2      2015-07-13 [1] CRAN (R 3.5.0)                 
 processx      3.4.1      2019-07-18 [1] CRAN (R 3.5.2)                 
 promises      1.1.0      2019-10-04 [1] CRAN (R 3.5.2)                 
 ps            1.3.0      2018-12-21 [1] CRAN (R 3.5.0)                 
 purrr       * 0.3.2      2019-03-15 [1] CRAN (R 3.5.2)                 
 R6            2.4.0      2019-02-14 [1] CRAN (R 3.5.2)                 
 Rcpp          1.0.2      2019-07-25 [1] CRAN (R 3.5.2)                 
 readr       * 1.3.1      2018-12-21 [1] CRAN (R 3.5.0)                 
 readxl        1.3.1      2019-03-13 [1] CRAN (R 3.5.2)                 
 remotes       2.1.0      2019-06-24 [1] CRAN (R 3.5.2)                 
 rlang         0.4.0      2019-06-25 [1] CRAN (R 3.5.2)                 
 rmarkdown     1.16       2019-10-01 [1] CRAN (R 3.5.2)                 
 rprojroot     1.3-2      2018-01-03 [1] CRAN (R 3.5.0)                 
 rstudioapi    0.10       2019-03-19 [1] CRAN (R 3.5.2)                 
 rvest         0.3.4      2019-05-15 [1] CRAN (R 3.5.2)                 
 scales        1.0.0      2018-08-09 [1] CRAN (R 3.5.0)                 
 sessioninfo   1.1.1      2018-11-05 [1] CRAN (R 3.5.0)                 
 shiny         1.4.0      2019-10-10 [1] CRAN (R 3.5.2)                 
 stringi       1.4.3      2019-03-12 [1] CRAN (R 3.5.2)                 
 stringr     * 1.4.0      2019-02-10 [1] CRAN (R 3.5.2)                 
 survival    * 2.44-1.1   2019-04-01 [1] CRAN (R 3.5.2)                 
 survminer   * 0.4.6      2019-09-03 [1] CRAN (R 3.5.2)                 
 survMisc      0.5.5      2018-07-05 [1] CRAN (R 3.5.0)                 
 testthat      2.2.1      2019-07-25 [1] CRAN (R 3.5.2)                 
 tibble      * 2.1.3      2019-06-06 [1] CRAN (R 3.5.2)                 
 tidyr       * 1.0.0      2019-09-11 [1] CRAN (R 3.5.2)                 
 tidyselect    0.2.5      2018-10-11 [1] CRAN (R 3.5.0)                 
 tidyverse   * 1.2.1      2017-11-14 [1] CRAN (R 3.5.0)                 
 usethis     * 1.5.1      2019-07-04 [1] CRAN (R 3.5.2)                 
 utf8          1.1.4      2018-05-24 [1] CRAN (R 3.5.0)                 
 vctrs         0.2.0      2019-07-05 [1] CRAN (R 3.5.2)                 
 viridisLite   0.3.0      2018-02-01 [1] CRAN (R 3.5.0)                 
 webshot       0.5.1      2018-09-28 [1] CRAN (R 3.5.0)                 
 wesanderson * 0.3.6      2018-04-20 [1] CRAN (R 3.5.0)                 
 withr         2.1.2      2018-03-15 [1] CRAN (R 3.5.0)                 
 xfun          0.10       2019-10-01 [1] CRAN (R 3.5.2)                 
 xml2          1.2.2      2019-08-09 [1] CRAN (R 3.5.2)                 
 xtable        1.8-4      2019-04-21 [1] CRAN (R 3.5.2)                 
 yaml          2.2.0      2018-07-25 [1] CRAN (R 3.5.0)                 
 zeallot       0.1.0      2018-01-28 [1] CRAN (R 3.5.0)                 
 zoo           1.8-6      2019-05-28 [1] CRAN (R 3.5.2)                 

[1] /Library/Frameworks/R.framework/Versions/3.5/Resources/library

References

Did you find this page helpful? Consider sharing it 🙌

Avatar
Leyla Nunez
Statistician

Related

comments powered by Disqus