-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmeta_analysis_aux.r
More file actions
78 lines (60 loc) · 2.73 KB
/
meta_analysis_aux.r
File metadata and controls
78 lines (60 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
library(dplyr)
library(metafor)
get_effect_size <- function(dat, effect_size_mean, effect_size_sd) {
#' Get the effect size and its standard error
#'
#' @param dat dataframe with the data
#' @param effect_size string with the name of the effect size
dat <- mutate(dat,
SE = dat[[effect_size_sd]] / sqrt(dat$"# Patients")
)
dat <- mutate(dat, vi = dat$SE^2)
dat <- mutate(dat, yi = dat[[effect_size_mean]])
colnames <- colnames(dat)
dat <- transform(dat, ci_low = dat$yi - 1.96 * sqrt(dat$vi), ci_upp = dat$yi + 1.96 * sqrt(dat$vi))
colnames(dat) <- c(colnames, c("ci_low", "ci_upp"))
return(dat)
}
prepare_subgroup_analysis <- function(dat, subgroup_strategy, subgroup_analysis = TRUE) {
# Order data according to subgroup and yi
dat <- mutate(dat, subgroup = dat[[subgroup_strategy]])
dat <- dat[order(dat$"First author, year", decreasing = TRUE), ]
subgroups <- sort(unique(dat$subgroup), decreasing = TRUE)
subgroup_counts <- table(dat$subgroup)
res_dict <- setNames(lapply(subgroups, function(x) list(count = subgroup_counts[[x]])), subgroups)
# Entry for titles (last entry) + empty entry after each subgroup summary
n_entries <- length((dat$yi)) + length(names(res_dict)) * 2 + 2
return(list(dat, res_dict, n_entries))
}
test_heterogeneity <- function(data, overall_res, mods) {
print(paste("overall I^2:", fmtx(overall_res$I2, digits = 2)))
for (mod in mods) {
overall_res_mods <- rma.uni(yi, vi, data = data, method = "REML", mods = ~ factor(data[[mod]]))
print(paste(
mod,
"| I^2 with mods", fmtx(overall_res_mods$I2, digits = 2),
"| relative decrease:", fmtx(((overall_res$I2 - overall_res_mods$I2) / overall_res$I2) * 100, digits = 2), "%",
sep = " "
))
}
cat("\n")
}
# Independent Effects: Each moderator's effect on the outcome (effect size) is estimated while holding the other moderators constant.
test_heterogeneity_multivariate <- function(data, overall_res, mods, interaction) {
print(paste("overall I^2:", fmtx(overall_res$I2, digits = 2)))
if (interaction) {
coll <- " * "
} else {
coll <- " + "
}
multivariate_string <- paste("~", paste(paste0("factor(data[[\"", mods, "\"]])"), collapse = coll))
multivariate_mods <- as.formula(multivariate_string)
overall_res_mods <- rma.uni(yi, vi, data = data, method = "REML", mods = multivariate_mods)
print(paste(
paste(paste0(mods), collapse = coll),
"| I^2 with mods", fmtx(overall_res_mods$I2, digits = 2),
"| relative decrease:", fmtx(((overall_res$I2 - overall_res_mods$I2) / overall_res$I2) * 100, digits = 2), "%",
sep = " "
))
cat("\n")
}