After day 3 and 4, I think I kind of getting what is the highlight of RMS course- Bayesianlongitudinal ordinal model for clinical data.
Why longitudinal ordinal model for clinical data instead of just using Cox model?
Dynamic versus static - with the Cox model, usually, we can only model 1 end-point for the outcome of interests. This does not translate well into clinical practice with patients constantly moving between different stages of the disease. By incorporating ordinal model along with Markov process to handle correlation, it allows us to generate more knowledge with the same trials
This would provide more info to inform decisions and maybe solve some arbitrary cut off points. For example on more info, when conducting a trial on hospital treatment outcomes on pneumonia, instead of just having a time to re-hopsitalization, we ignored the nuances happened between and lose power. With ordinal structure, we can nest it in like:
Visiting pharmacy for respiratory problem
Seeing a GP for respiratory problem
Re-hospitalization for respiratory problem
Flexibility of ordinal models
Frank posits ordinal model with Markov process as a general case to handle variety of data:
“Elegantly handling absorbing states like death within the same model structure**,** which can be challenging for recurrent event models”
Can be used on diverse outcomes (binary, discrete ordinal, continuous, mixed)
Computationally efficient with current software for the full likelihood
Why Bayesian?
I shared Frank’s sentiment on the philosophy of frequentist statistics- repeating the exact experiment many times. In reality, most events and trials are closed to unique events because of circumstances (different time, population and available treatment to name a few). It does not seem to be feasible to repeat the same experiments.
“The Bayesian framework provides a continuous bridge between standalone mortality evidence and evidence drawn from the combination of nonfatal and fatal endpoints” - Frank’s quote from “burrowing information on outcomes”
Longitudinal ordinal Markov models can estimate clinically meaningful quantities like state occupancy probabilities (the probability of being in a specific state at a given time) or expected time spent in various states (like mean time unwell or restricted mean survival time)
Frequentist methods, while they can also estimate these quantities, often rely on approximations or provide less direct statements about the parameters themselves compared to the Bayesian posterior distribution
“And the unique contribution of a Bayesian model is the ability to borrow information about covariate effects across levels of the outcome variable, i.e., to constrain how different a treatment effect is on death compared to its effect on nonfatal outcomes.” - Frank comments on this post
Current drawbacks and the road-ahead
Every model has its assumptions. The assumptions for ordinal models are:
a) Relationship between X and Y (e.g., linearity/shape of effects, additivity)
b) The “parallelism” assumption on the link scale (that covariate effects are constant across different cutoffs or outcome levels) - Frank said he’s working to overcome b) and I’m looking forward to hearing about this in the future
Solutions to overcome these assumptions:
Splines and chunk test to overcame a), and it is a lot of work to have the correct functional form
ordParallel, partial proportional odd and Bayesian prior to overcame the b) assumption
I think the potential is definitely there and there are a lot of work needs to be done. With Bayesian ordinal longitudinal model, picking priors to incorporate prior data and non-parallelism seems to be more of an art, which would be met with a lot of resistance where things are demanded to standardized.
I’m hopeful. Thank you Frank and Drew for the course again and would love to hear people thoughts on this.
Nicely put. Instead of Markov chain we usually say Markov process in this context. And the unique contribution of a Bayesian model is the ability to borrow information about covariate effects across levels of the outcome variable, i.e., to constrain how different a treatment effect is on death compared to its effect on nonfatal outcomes.
I am still learning, but one of the things I struggle with is how to apply RMS principles into PK/PD world. We have the hidden variable, distribution assumption and assumed additivity of covariate effects etc… Further, the equation of interest an ODE that must be solved numerically.
I am sure with some modification it all can come in but struggling to employ in practice. RMS is great for E-R though obviously.
Interested to get your take on nonlinear mixed effects modeling and how to tackle.
Many of the RMS methods and principles will apply to PK/PD. But be ready for one of the principles to annoy you: correlation structures of chosen model should match the data generating process. Random effects will seldom do that for serial/longitudinal data.
I view PK/PD as empirical driven- model from observations and beliefs. I only think about:
Compartment models (oral drugs, for example: gut → systemic → liver → target) (I think the correlation part @f2harrell mentioned is here?)
Association/disassociate rate (binding and tissue distribution)
Half lives
I solved ODE through Python packages, have never modeled PK/PD in R before.
I don’t think about hidden variable, distribution assumption very often… because of the approach above has served me well enough. To be specific, I model drug distribution to achieve the minimum viable dose for patients. There could be a lot of variety of PK/PD models.
Maybe I should look into what you outlined, do you have any pointers for me to read?
I have only played with it but give the following a look GitHub - nlmixr2/nlmixr2: nlmixr2 it was developed by a few industry folks and is an active project.
I use commercial packages but I am looking to move to more open source approaches because the prepackaged software options tend to reinforce bad practices by making it easy to do so.
@f2harrell point taken… I did have one question in this context the RCS usage in modeling in my area. In the complex example, the elegant fitting was done at the population level. While, one of the outcomes of a popPK model are population values, that is an calculated quantity that I extracting from the data rather than taken as an input. I am wondering if a fitting exercise like this would make sense as a post hoc exercise to check the model, using more of the methods outlined in the RMS text.
I think at the crux of my confusion is adaptation needed when the data requires multi level techniques for something like repeated measures.
My outcome is continuous (BMI), ranging from 13 to 60 in my dataset. I’m modeling BMI as a function of exposure and covariates, and my primary interest is the coefficient for exposure, which is small but positive (~0.05).
When plotting partial effects (BMI vs. exposure), should I set the y-axis limits to reflect the full range of BMI (13–60), or narrow it to something like 15–25? The narrower y axis range makes the small exposure estimates (0.05) appear more dramatic, whereas using the full range reflects the small effect size. What is the best practice for setting the y-axis in this context.
Good question. The default behavior for partial effect plots in rms is based on the philosophy of avoiding extrapolation into regions of the data (here, BMI) that are not well supported sample-size-wise. The issue is not related to relative but rather to absolute sample size. The default x-axis limits are the 10^\text{th} smallest to the 10^\text{th} largest covariate values in the observed data. The limits are not selected to achieve a certain impression about the steepness of the covariate effect. But for extremely large samples there are some occasions where I’ve found that plotting from the 0.01 to the 0.99 quantile of the covariate gives the reader a more honest impression of the strength of the covariate.
Hey there,
is there any way to sort the panels of plot(Predict(f)) when used for a whole cox model like f<-cph(Surv(survivaltime, eventg) ~ age + sex + bmi + smoking (datadist is active) but for example I want to have bmi in the left top corner and age as second panel, sex and smoking as factor at the second row then?
With sepdiscrete='no' (the default) to ggplot.Predict you should be able to control this by the order predictors are specified in the model. To have more control, use ggexpr=TRUE and look at the result to fashion your own “manual” specification of ggplot() using the ggplot2 package directly. Also look at flipxdiscrete.