LogisticRCI
The LogisticRCI
package is designed to make the
calculation of the linear and logistic reliable change index easy and
streamlined. In this vignette we give short examples on how to use the
package based on a simulated sample dataset with 100 patients.
LogisticRCI
installation and loadThe LogisticRCI
package is installed from CRAN and
loaded in the typical way.
We can load the sample dataset and see the first 6 rows by executing:
data("RCI_sample_data")
head(RCI_sample_data)
#> age education gender score baseline
#> 1 71 20 female 6 7
#> 2 74 15 female 5 10
#> 3 55 16 male 3 8
#> 4 63 12 female 7 5
#> 5 82 18 female 1 3
#> 6 73 14 female 2 9
In this dataset, we have baseline scores for a memory test with 15
items calculated for 100 patients (baseline
), and their
follow-up scores (score
). We have age
,
education
and gender
as covariates.
We begin by fitting linear and logistic models.
linear_fit <- lm(score ~ baseline + age + gender + education,
data = RCI_sample_data)
logistic_fit <- glm(cbind(score, 15 - score) ~ baseline + age + gender + education,
family = binomial,
data = RCI_sample_data)
We can explore the significance of the covariate effects in the usual
way, using anova
:
anova(linear_fit)
#> Analysis of Variance Table
#>
#> Response: score
#> Df Sum Sq Mean Sq F value Pr(>F)
#> baseline 1 713.16 713.16 91.7423 1.317e-15 ***
#> age 1 14.64 14.64 1.8836 0.1732
#> gender 1 5.28 5.28 0.6792 0.4119
#> education 1 4.14 4.14 0.5325 0.4674
#> Residuals 95 738.49 7.77
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(logistic_fit, test = "Chisq")
#> Analysis of Deviance Table
#>
#> Model: binomial, link: logit
#>
#> Response: cbind(score, 15 - score)
#>
#> Terms added sequentially (first to last)
#>
#>
#> Df Deviance Resid. Df Resid. Dev Pr(>Chi)
#> NULL 99 459.31
#> baseline 1 201.030 98 258.28 < 2e-16 ***
#> age 1 5.193 97 253.09 0.02268 *
#> gender 1 1.810 96 251.28 0.17849
#> education 1 1.290 95 249.99 0.25611
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
To compute the reliable change index we only need to pass the fitted
model objects fo the RCI
function.
The RCI
function automatically detects whether we are
passing a linear or logistic regression model and performs the
appropriate computations internally.
Let’s proceed with the Logistic RCI. We can check for normality using, e.g. the Shapiro-Wilk test.
shapiro.test(logistic_RCI)
#>
#> Shapiro-Wilk normality test
#>
#> data: logistic_RCI
#> W = 0.98577, p-value = 0.3604
We don’t reject the null hypothesis that the sample may have arisen from a normal distribution. We may now check how many patients are showing reliable decline using a threshold of −1.64, representing the lower 5th percentile of the standard normal distribution.
We may also identify who these patients are by looking at their IDs.
So we have that patients 3, 6, 38 and 89 are exhibiting reliable cognitive decline at a 5% level.
Suppose we have the scores for a new patient, who is male, aged 68
years old, has 12 years of education, a baseline score of 11 and a
follow-up score of 9. We first create a data.frame
with the
new patient information.
new_patient <- data.frame("age" = 68,
"gender" = "male",
"score" = 9,
"baseline" = 11,
"education" = 12)
Now we may calculate the RCI based on either the linear or logistic
models we fitted in the previous section without having to re-fit the
model to an updated sample by using the RCI_newpatient
function.
RCI_newpatient(model = linear_fit, new = new_patient)
#> [1] -0.2691052
RCI_newpatient(model = logistic_fit, new = new_patient)
#> [1] -0.3361395
According to both the linear and logistic models, this new patient does not exhibit reliable cognitive decline at a 5% level.
Moral, R.A., Diaz-Orueta, U., Oltra-Cucarella, J. (PsyArXiv preprint) Logistic versus linear regression-based Reliable Change Index: implications for clinical studies with diverse sample sizes. DOI: 10.31234/osf.io/gq7az