[R-meta] meta-regression analysis slope from Fisher's z to r values
Tzlil Shushan
tz|||21092 @end|ng |rom gm@||@com
Mon Dec 21 01:23:03 CET 2020
Dear Wolfgang and all the colleagues in the group.
I have a question regarding my interpretation of my meta-regression
analysis. For making it easier for you to get a full insight of my
questions, I attached part of my code.
I’m conducting a multilevel meta-analysis combined with RVE on measurement
properties such reliability and validity. Accordingly, I’m using effect
sizes of correlation (ICC and r) which were transformed to z Fisher’s value
via “ZCOR” in the escalc function.
Apart from the overall model, I’m interested in the effects of specific
moderators (continuous and categorical) on the pooled estimate and source
of heterogeneity. For each statistical model I have approx. 4-6 potential
moderators. To address my question, I’ll use one example of a continuous
moderator.
######
library(dplyr)
library(metafor)
ES.ID <- c(1:34)
Study.ID <-
c(1,1,1,2,3,4,4,5,6,7,8,9,10,10,10,10,11,12,13,14,14,14,15,15,15,16,16,16,17,18,18,19,20,21)
con_mod
<-c(75.0,78.3,81.9,81.1,NA,74.6,88.6,91.3,90.1,95.7,88.7,84.3,NA,NA,NA,NA,76.7,82.1,80.5,92.1,94.7,97.0,91.5,94.1,96.7,91.4,94.0,94.6,87.0,88.6,93.2,95.3,92.3,89.2)
yi <- c(1.6583900, 1.7380493, 2.0922957, 1.5275244, 1.0986123, 1.7380493,
1.9459101, 1.0453705, 0.6328332, 1.1270290, 0.9729551, 1.4722195,
1.5890269, 1.6583900, 1.4722195, 0.9076450, 1.8317808, 1.9459101,
1.0203278, 0.8871839, 0.8479558, 0.9076450, 1.2933447, 1.0714317,
1.2933447, 1.3757677, 1.5890269, 1.3757677, 1.3330796, 1.8317808,
1.8317808, 1.5890269, 1.8317808, 1.8317808)
vi = c(0.04545454, 0.04545454, 0.04545454, 0.05263158, 0.03448276,
0.11111111, 0.11111111, 0.04761905, 0.07142857, 0.10000000, 0.08333333,
0.06666667, 0.03333333, 0.03333333, 0.02941176, 0.14285714, 0.11111111,
0.14285714, 0.08333333, 0.04166667, 0.04347826, 0.06250000, 0.04166667,
0.04347826, 0.06666667, 0.16666667, 0.20000000, 1.00000000, 0.05000000,
0.20000000, 0.20000000, 0.05263158, 0.14285714, 1.00000000)
data <- cbind(ES.ID, Study.ID, con_mod, yi, vi)
data <- as_data_frame(data)
# overall model
overall_model <- rma.mv(yi, vi, random = list(~ 1 | ES.ID, ~ 1 | Study.ID),
data = data)
overall_model_robust <- robust.rma.mv(overall_model, cluster =
data$Study.ID, adjust = T)
summary(overall_model_robust)
# values back-transformed to icc values
predict(overall_model_robust, transf = transf.ztor, digits = 2, addx = T)
# meta-regression
icc_mod <- rma.mv(yi, vi, mods = ~ con_mod, random = list(~ 1 | ES.ID, ~ 1
| Study.ID), data = data) # overall three level model
icc_mod_robust <- robust.rma.mv(icc_mod, cluster = data$Study.ID, adjust =
T)
summary(icc_mod_robust)
# then, I’m interested in the slope associated with ±5 point. For this I
first multiply the slope and its CIs by 5
-0.0162*5 # slope
-0.0326*5 # ci.lb
0.0002*5 # ci.ub
# I also created a new column with standardising raw data around the mean
(just to make sure about the new slope)
data$con_mod_stan <- (data$con_mod - mean(data$con_mod, na.rm = T))/5
icc_mod_stan <- rma.mv(yi, vi, mods = ~ con_mod_stan, random = list(~ 1 |
ES.ID, ~ 1 | Study.ID), data = data)
icc_mod_stan_robust <- robust.rma.mv(icc_mod_stan, cluster = data$Study.ID,
adjust = T)
summary(icc_mod_stan_robust)
# the new slope is -0.08 (95% CI -0.16; 0.001) in z values
# similar in icc (r) values -0.08 (95% CI -0.16; 0.001) in z values
round(transf.ztor(-0.08),2)
round(transf.ztor(-0.16),2)
round(transf.ztor(-0.001),2)
# however, when I’m using the predict function for obtaining the same ±5
point change in moderatos gives me a change 0.02 and not 0.08
# mean moderator in the dataset
round(mean(data$con_mod, na.rm = T),0)
# icc values using predict
predict(icc_mod_robust, newmods = c(88,88+5,88-5), transf=transf.ztor,
digits=3, addx = T)
# or for every 5 point changes
predict(icc_mod_robust, newmods = cbind(seq(from = 70, to =100,by =
5)),transf=transf.ztor, digits=3, addx = T)
# I think that the reason for such difference in results is because the
high differences between z and r values in values close to 1.0?
r = seq(0,1,by=.05)
z = round(transf.rtoz(r),2)
diff = round(z-r,2)
cbind(r,z,diff)
# so, long story in short. Is it a validated way for obtaining the contrast
in CIs between two adjusted effects? For example, between the effect at 88
and 83
predict(icc_mod_robust, newmods = cbind(seq(83,88,5)), transf =
transf.ztor, digits = 2, addx = T)
# pred ci.lb ci.ub pi.lb pi.ub X.intrcpt X.con_mod
# 1 0.881 0.834 0.916 0.665 0.961 1 88
# 2 0.898 0.863 0.925 0.711 0.966 1 83
# This is what I found in this study:
https://www.elsevier.es/en-revista-revista-psiquiatria-salud-mental-486-articulo-a-method-for-comparing-correlations-S2173505016300371
##in this case r1 rould be 83 and r2 would be 88
## L stands for lower bound confidence interval and r
# lCI = r1-r2-sqrt((r1-L1)^2+(U2-r2)^2)
# UCL = r1-r2+sqrt((U1-r1)^2+(r2-L2)^2)
low = (0.898-0.881)-sqrt((0.898-0.863)^2+(0.916-0.881)^2)
up = (0.898-0.881)+sqrt((0.925-0.898)^2+(0.881-0.834)^2)
# This formula reveals that -5 point in moderator is 0.017 [95% CI: -0.032;
0.071] change in icc
######
I have another general question. Do I need to address in some way the
relationships between different moderators in my analysis (for example,
between two continuous moderators or categorical and continuous)? Just to
note, given our aims, we are not conducting meta-regression involving
multiple moderators. I thought of creating a correlation table between all
moderators and present it as a supplementary file to the analysis. Do you
have any insights about it?
Thanks in advance and apologise for the long story!
Kind regards,
Tzlil Shushan | Sport Scientist, Physical Preparation Coach
BEd Physical Education and Exercise Science
MSc Exercise Science - High Performance Sports: Strength &
Conditioning, CSCS
PhD Candidate Human Performance Science & Sports Analytics
[[alternative HTML version deleted]]
More information about the R-sig-meta-analysis
mailing list