GitHub Repository
The Rmarkdown file can be downloaded from the Code drop down menu (top right).
This supplementary file contains the R workflow for processing and analysing the raw data, and creating figures for the manuscript ID: GCB-23-0861 titled “Sub-lethal consequences of ultraviolet radiation exposure on vertebrates: synthesis through meta-analysis”.
Fig. S1. PRISMA flow diagram for the systematic data-collection process. n = number of papers remaining after each stage of selection. k = number of effect size after processing individual data, and n is number of observations/records after processing data. Searches were grouped by taxonomic groups.
The raw data for analysis is available on GitHub. This section is the workflow to import and clean the raw data for analysis. Effect size as the natural log-transformed response ratio, lnRR (1), and the sampling variance, \(v_i\) (2), was calculated following Hedges and Olkin (2014):
\[ \begin{equation} lnRR = \ln \left( \frac{\bar{X}_{1}}{\bar{X}_{2}}\right), \tag{1} \end{equation} \] \[ \begin{equation} v_i = \frac{SD_{1}^2} {\bar{X}^2_{1}n_{1}} + \frac{SD_{2}^2} {\bar{X}^2_{2}n_{2}}, \tag{2} \end{equation} \]
where \(\bar{X}_1\), \(SD_1\), and \(n_1\) are the mean, standard deviation, and sample size of the exposed group, respectively, while \(\bar{X}_2\), \(SD_2\), and \(n_2\) are the mean, standard deviation, and sample size of the control group, respectively. The standard error, \(se_i\) (3), was calculated as:
\[ \begin{equation} se_{i} =\sqrt{v_i}. \tag{3} \end{equation} \]
The inverse of \(se_i\) or precision (4) was calculated as:
\[ \begin{equation} p_{i} = \frac{1}{se_i}. \tag{4} \end{equation} \]
To account for unbalanced sampling, we used the ‘effective sample size’ instead of the sample size (\(n_1\) + \(n_2\)) for the meta-analysis of lnRR (Nakagawa et al., 2022). The effective sample size (5) is formulated as:
\[ \begin{equation} 4\tilde{n_{i}} = \frac{4n_{1i} n_{2i}}{n_{1i} + n_{2i}}. \tag{5} \end{equation} \]
When \(n\) = \(n_1\) = \(n_2\), the formula reduces to 2\(n\). Indeed, the inverse of \(\tilde{n_{i}}\) is a part of sampling variance in lnRR (6):
\[ \begin{equation} \frac{1}{\tilde{n_{i}}} = \frac{n_{1i} + n_{2i}}{n_{1i} n_{2i}} = \frac{1}{n_{1i}} + \frac{1}{n_{2i}}. \tag{6} \end{equation} \]
All conversions for the standard error (\(se_i\)), sampling variance, precision (the inverse of \(se_i\)), effective sample size (\(4\tilde{n_{i}}\)) and the inverse of \(\tilde{n_{i}}\) (\(\frac{1}{\tilde{n_{i}}}\)) followed Nakagawa et al. (2022). Data were also prepared to test for publication bias, and sources of non-independance such as shared controls, study effect, species effect, and phylogeny.
# Load and clean raw data
raw_dat <- read.csv("/Users/nicholaswu/Library/CloudStorage/OneDrive-WesternSydneyUniversity/UV meta-analysis/Vertebrate_UV_MetaAnalysis_FINAL.csv") %>%
tibble::rowid_to_column("es_ID") %>% # add effect size ID
dplyr::mutate(vi = t_SD ^ 2 / (t_n * t_mean ^ 2) + c_SD ^ 2 / (c_n * c_mean ^ 2), # Sampling variance (v)
sei = sqrt(vi), # Standard error (SE)
sei_inv = 1 / sei, # Precision (inverse of SE)
eff_n = (4 * c_n * t_n) / (c_n + t_n), # Effective sample size
inv_eff_n = (c_n + t_n) / (c_n * t_n), # Inverse of eff_n
sqrt_inv_eff = sqrt(inv_eff_n), # Square root of the inverse of eff_n
year_centre = pub_year - mean(pub_year), # Mean-centring year of publication)
ln_delta_dose = log(delta_dose_J_day),
ln_dur_day = log(t_duration_day),
species_OTL = as.factor(species_OTL),
life_stage = factor(life_stage, levels = c("Embryo", "Larva", "Juvenile", "Adult")),
region = factor(region, levels = c("Tropical", "Subtropical", "Temperate")),
classification = as.factor(classification),
source_cat = as.factor(source_cat),
medium = as.factor(medium),
trait = as.factor(trait),
metric = as.factor(metric),
uv_type = as.factor(uv_type)) %>%
dplyr::select(-c(reference, notes))
# Account for shared controls
M <- metaAidR::make_VCV_matrix(data = raw_dat, V = "vi", cluster = "shared_control2", m = "c_mean",
sd = "c_SD", n = "c_n", type = "vcv", vcal = "ROM", obs = "es_ID")
The raw_dat
used for the meta-analysis comprises of 895 individual effect sizes from 73 studies across 47 species (detailed in Supplementary Table S1).
Table S1 - Responses. Trait categories and the specific metrics extracted for the study. Number of effect sizes, studies and species are shown. Responses with asterisks were corrected for direction. CAT = catalase, GST = glutathione S-transferase, LDH = lactate dehydrogenase, LPO = lactoperoxidase, ROS = reactive oxygen species, SOD = superoxide dismutase, Ucrit = critical swimming speed.
Categorised trait | Specific metric | Effect size (k) | Studies (n) | Species (n) |
---|---|---|---|---|
Behaviour | Sheltering Behaviour | 14 | 4 | 7 |
Behaviour | Time Active | 7 | 2 | 2 |
Cardiorespiratory Function | Heart Rate | 25 | 4 | 3 |
Cardiorespiratory Function | Hematocrit | 20 | 7 | 5 |
DNA Damage | DNA Damage* | 42 | 6 | 8 |
DNA Damage | Photolyase Gene Expression | 15 | 1 | 1 |
DNA Damage | Pyrimidine Dimers* | 4 | 1 | 1 |
Energy Metabolism | Aerobic Scope | 3 | 2 | 1 |
Energy Metabolism | LDH Activity | 21 | 1 | 1 |
Energy Metabolism | Maximum Metabolic Rate | 11 | 3 | 3 |
Energy Metabolism | P:O Ratio | 1 | 1 | 1 |
Energy Metabolism | Respiratory Control Ratio | 1 | 1 | 1 |
Energy Metabolism | Resting Metabolic Rate | 3 | 2 | 1 |
Energy Metabolism | Routine Metabolic Rate | 24 | 11 | 7 |
Energy Metabolism | State 3 Respiration | 1 | 1 | 1 |
Energy Metabolism | State 4 Respiration | 1 | 1 | 1 |
Energy Metabolism | Tissue Level Respiration | 1 | 1 | 1 |
Growth | Final Length | 112 | 17 | 16 |
Growth | Final Mass | 45 | 18 | 17 |
Growth | Growth Rate | 2 | 1 | 1 |
Growth | Length (change) | 4 | 1 | 1 |
Growth | Specific Growth Rate | 9 | 2 | 2 |
Hormonal Stress Response | Corticosterone | 7 | 3 | 2 |
Hormonal Stress Response | Cortisol | 31 | 7 | 5 |
Locomotion | Burst Swimming | 40 | 6 | 5 |
Locomotion | Routine Swimming Speed | 24 | 1 | 1 |
Locomotion | Ucrit | 5 | 4 | 2 |
Neuromusclular | Acytlcholinesterase | 6 | 1 | 1 |
Oxidant | H2O2 Levels* | 8 | 1 | 1 |
Oxidant | ROS Production* | 27 | 3 | 2 |
Oxidative Damage | Alanine Aminotransferase* | 8 | 1 | 1 |
Oxidative Damage | Asparate Aminotransferase* | 8 | 1 | 1 |
Oxidative Damage | LPO Activity* | 76 | 7 | 7 |
Oxidative Damage | Malondialdehyde* | 2 | 2 | 2 |
Oxidative Damage | Protein Carbonyl* | 5 | 4 | 2 |
Oxidative Damage | Protein Peroxide Levels* | 1 | 1 | 1 |
Oxidative Damage | Thiobarbituric Acid Reactive Substances* | 6 | 1 | 1 |
Oxidative Stress Response/Defense | CAT Activity | 65 | 8 | 8 |
Oxidative Stress Response/Defense | CAT Gene Expression | 23 | 2 | 2 |
Oxidative Stress Response/Defense | DT-diaphorase | 1 | 1 | 1 |
Oxidative Stress Response/Defense | Glutathione | 10 | 3 | 2 |
Oxidative Stress Response/Defense | Glutathione disulfide reductase | 7 | 2 | 2 |
Oxidative Stress Response/Defense | Glutathione Peroxidase | 7 | 2 | 2 |
Oxidative Stress Response/Defense | Glutathione Transferase | 1 | 1 | 1 |
Oxidative Stress Response/Defense | GST Activity | 42 | 2 | 3 |
Oxidative Stress Response/Defense | SOD Activity | 65 | 9 | 9 |
Oxidative Stress Response/Defense | SOD Gene Expression | 8 | 1 | 1 |
Oxidative Stress Response/Defense | SOD1 Gene Expression | 15 | 1 | 1 |
Oxidative Stress Response/Defense | SOD3 Gene Expression | 15 | 1 | 1 |
Oxidative Stress Response/Defense | Total Antioxidant Capacity | 4 | 1 | 1 |
Oxidative Stress Response/Defense | Total Peroxidase | 12 | 2 | 2 |
Table S1 - Life stage. Continuation of data summary with additional information on the number of effect size, studies, and species in the database by life stage. Presentation in order by the number of effect size in the data.
Life stage | Effect size (k) | Studies (n) | Species (n) |
---|---|---|---|
Juvenile | 285 | 22 | 16 |
Larva | 262 | 32 | 22 |
Embryo | 180 | 7 | 5 |
Adult | 168 | 16 | 12 |
Table S1 - Species. Continuation of data summary with additional information on the number of effect size, and studies in the database by species. Presentation in order by the number of effect size in the data.
Class | Species | Effect size (k) | Studies (n) |
---|---|---|---|
Fish | Danio rerio | 97 | 4 |
Fish | Dicentrarchus labrax | 95 | 2 |
Fish | Sparus aurata | 75 | 2 |
Fish | Amphiprion clarkii | 64 | 1 |
Fish | Coryphaena hippurus | 61 | 2 |
Fish | Solea senegalensis | 60 | 1 |
Fish | Clarias gariepinus | 58 | 2 |
Amphibian | Litoria caerulea | 57 | 1 |
Fish | Gambusia holbrooki | 34 | 4 |
Fish | Coregonus lavaretus | 29 | 3 |
Fish | Girella laevifrons | 28 | 5 |
Amphibian | Limnodynastes peronii | 23 | 4 |
Fish | Rutilus rutilus | 19 | 2 |
Amphibian | Boana pulchella | 15 | 2 |
Fish | Coregonus albula | 15 | 2 |
Amphibian | Rana temporaria | 14 | 6 |
Fish | Salmo salar | 14 | 2 |
Fish | Pleuronectes platessa | 12 | 1 |
Fish | Oncorhynchus mykiss | 11 | 3 |
Amphibian | Bufo bufo | 10 | 2 |
Fish | Amatitlania nigrofasciata | 10 | 2 |
Fish | Cyprinus carpio | 9 | 2 |
Amphibian | Ambystoma maculatum | 8 | 1 |
Reptile | Psammodromus algirus | 7 | 1 |
Amphibian | Ambystoma gracile | 6 | 1 |
Bird | Gallus gallus | 6 | 3 |
Fish | Engraulis mordax | 6 | 1 |
Reptile | Sceloporus occidentalis | 6 | 1 |
Amphibian | Rana arvalis | 5 | 2 |
Fish | Scomber japonicus | 5 | 1 |
Fish | Colossoma macropomum | 4 | 1 |
Fish | Oryzias latipes | 4 | 1 |
Reptile | Sauromalus ater | 4 | 1 |
Amphibian | Limnodynastes ornatus | 3 | 1 |
Amphibian | Rana cascadae | 3 | 2 |
Amphibian | Ambystoma macrodactylum | 2 | 1 |
Fish | Graus nigra | 2 | 1 |
Fish | Pomacentrus amboinensis | 2 | 1 |
Fish | Thalassoma lunare | 2 | 1 |
Reptile | Eublepharis macularius | 2 | 1 |
Reptile | Furcifer pardalis | 2 | 1 |
Amphibian | Rana aurora | 1 | 1 |
Amphibian | Rana blairi | 1 | 1 |
Fish | Arapaima gigas | 1 | 1 |
Fish | Esox lucius | 1 | 1 |
Fish | Pimephales promelas | 1 | 1 |
Fish | Seriola lalandi | 1 | 1 |
Table S1 - Traits. Continuation of data summary with additional information on the number of effect size, studies, and species in the database by by traits. Presentation in order by the number of effect size in the data.
Trait | Effect size (k) | Studies (k) | Species (n) |
---|---|---|---|
Oxidative Stress Response/Defense | 275 | 15 | 12 |
Growth | 172 | 32 | 27 |
Oxidative Damage | 106 | 11 | 8 |
Locomotion | 69 | 11 | 8 |
Energy Metabolism | 67 | 16 | 10 |
DNA Damage | 61 | 8 | 10 |
Cardiorespiratory Function | 45 | 11 | 8 |
Hormonal Stress Response | 38 | 10 | 7 |
Oxidant | 35 | 4 | 3 |
Behaviour | 21 | 6 | 9 |
Neuromusclular | 6 | 1 | 1 |
Table S1 - UV type. Continuation of data summary with additional information on the number of effect size, studies, and species in the database by UV radiation type and taxonomic class. Presentation in order by the number of effect size in the data.
UV type | Class | Effect size (k) | Studies (k) | Species (n) |
---|---|---|---|---|
UVA | Amphibian | 25 | 7 | 4 |
UVA | Bird | 5 | 2 | 1 |
UVA | Fish | 245 | 12 | 9 |
UVA | Reptile | 2 | 1 | 1 |
UVB | Amphibian | 123 | 23 | 13 |
UVB | Bird | 1 | 1 | 1 |
UVB | Fish | 475 | 33 | 23 |
UVB | Reptile | 19 | 5 | 5 |
Table S1 - Source. Continuation of data summary with additional information on the number of effect size, studies, and species in the database by collection source. Presentation in order by the number of effect size in the data.
Source | Effect size (k) | Studies (k) | Species (n) |
---|---|---|---|
Captive | 512 | 30 | 24 |
Wild | 377 | 42 | 26 |
Not Specified | 6 | 1 | 2 |
The following data were not included due of poor reporting by the studies extracted: age (hours post-fertilisation and days post-hatching), body length, body mass, latitude, and longitude. Threshold was set at Good = 0-5%, Okay = 5-40%, Poor = 40-80%, Scarce = 80-100%.
Fig. S2. Frequency of missing data for each variable extracted.
This section provides the workflow to extract the phylogenetic tree from the Open Tree of Life (OTL; see phylogenetic reconstruction in main text), match the OTL names with the data set, and create a correlation matrix for subsequent analysis.
sp_all <- sort(unique(as.character(raw_dat$species_OTL))) # generate list of species (as character format)
taxa <- rotl::tnrs_match_names(names = sp_all) # match taxonomic names to the OTL
# check if species list match OT identifier taxa[taxa$approximate_match ==
# TRUE,] # none so far
# retrieving phylogenetic relationships among taxa in the form of a trimmed
# sub-tree
tree <- rotl::tol_induced_subtree(ott_ids = rotl::ott_id(taxa), label_format = "name")
# Change OTL species name to match raw_dat
tree$tip.label[tree$tip.label == "Oncorhynchus_mykiss_(species_in_domain_Eukaryota)"] <- "Oncorhynchus_mykiss"
# Compute branch lengths
tree <- ape::compute.brlen(tree, method = "Grafen", power = 1)
tree <- ape::multi2di(tree, random = TRUE) # use a randomization approach to deal with polytomies
phylo_cor <- ape::vcv(tree, cor = T)
Prior to the meta-analysis, we performed model selection on all moderators via the dredge
function. Due to the long processing time, we used the saved RDS file when creating the html file.
eval(metafor:::.MuMIn)
options(na.action = "na.fail") # required for dredge to run
mumin_dat <- raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_"))
mumin_dat <- mumin_dat[!apply(raw_dat[, c("life_stage", "source_cat", "region", "medium",
"classification", "trait", "uv_type", "exposure_temp", "ln_dur_day", "ln_delta_dose")],
1, anyNA), ] # remove rows with any NA value on one of these columns
# Run multi-level model
mumin_model <- metafor::rma.mv(yi = lnRR, V = vi, mods = ~life_stage + source_cat +
region + medium + classification + trait + uv_type + exposure_temp + ln_dur_day +
ln_delta_dose, random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL),
R = list(species_OTL = phylo_cor), method = "ML", test = "t", dfs = "contain",
data = mumin_dat)
# candidate_models <- MuMIn::dredge(mumin_model) # generate all possible
# combinations of moderators saveRDS(candidate_models, file =
# 'candidate_models.rds')
candidate_models <- readRDS("/Users/nicholaswu/Library/CloudStorage/OneDrive-WesternSydneyUniversity/UV meta-analysis/candidate_models.rds")
options(na.action = "na.omit") # set back to default
subset(candidate_models, delta <= 2) # display all models within 2 values of AICc
## Global model call: metafor::rma.mv(yi = lnRR, V = vi, mods = ~life_stage + source_cat +
## region + medium + classification + trait + uv_type + exposure_temp +
## ln_dur_day + ln_delta_dose, random = list(~1 | es_ID, ~1 |
## study_ID, ~1 | species, ~1 | species_OTL), data = mumin_dat,
## method = "ML", test = "t", dfs = "contain", R = list(species_OTL = phylo_cor))
## ---
## Model selection table
## (Int) cls exp_tmp lif_stg ln_dlt_dos ln_dur_day trt uv_typ df logLik AICc
## 781 + + -0.02 + + 20 -440 922
## 773 + + + + 19 -441 922
## 789 + + 0.021 + + 20 -441 922
## 797 + + -0.02 0.020 + + 21 -440 922
## 775 + 0.0072 + + + 20 -441 923
## 783 + 0.0068 + -0.02 + + 21 -440 923
## 774 + + + + + 20 -441 924
## 782 + + + -0.02 + + 21 -440 924
## delta weight
## 781 0.00 0.197
## 773 0.03 0.193
## 789 0.74 0.136
## 797 0.82 0.131
## 775 1.39 0.098
## 783 1.43 0.096
## 774 1.94 0.074
## 782 1.96 0.074
## Models ranked by AICc(x)
MuMIn::sw(MuMIn::model.avg(candidate_models, subset = delta <= 2)) # display weight of each moderators
## life_stage trait uv_type ln_delta_dose ln_dur_day
## Sum of weights: 1.00 1.00 1.00 0.50 0.27
## N containing models: 8 8 8 4 2
## exposure_temp classification
## Sum of weights: 0.19 0.15
## N containing models: 2 2
Conduct phylogenically controlled, multi-level meta-analysis. The global_model
tested the overall effect of UV exposure on effect size, and tested for publication bias. The overall_model
(detailed in the ‘Meta-regression’ section) tested the overall effect with all relevant moderators based on the model section process described above. All models contained the following random effects: Effect size ID, study ID, species ID, study ID, and phylogeny.
The global multi-level, meta-analytic model was fitted as follows:
\[ \begin{equation} Y_i = \beta_0 + \beta_1\sqrt{\frac{1}{\tilde{n_{i}}}} + \beta_2c(\text{year}_j) + \alpha_{k[i]} + sp_{k[i]} + s_{j[i]} + e_i + m_i, \\ \alpha_{k[i]} \sim \text{Normal}(0, \sigma^2_{\text{phylogeny}}\textbf{A}), \\ sp_{k[i]} \sim \text{Normal}(0, \sigma^2_{\text{species}}), \\ s_{k[i]} \sim \text{Normal}(0, \sigma^2_{\text{study}}), \\ e_i \sim \text{Normal}(0, \sigma^2_{\text{residual}}), \\ m_i \sim \text{Normal}(0, v_i), \tag{7} \end{equation} \]
where \(Y_i\) is the \(i\)th effect size, \(\beta_0\) is the weighted overall meta-analytic mean, \(\beta_1\sqrt{\frac{1}{\tilde{n_{i}}}}\) is the inverse of effective sample size, \(\beta_2c(\text{year}_j)\) is the mean centring of publication year, and \(\alpha_{k[i]}\) is the phylogenetic effect (a random effect) for species \(k\) applied to effect size \(i\) (Cinar et al., 2022). Phylogenetic effects are assumed to be normally distributed with a mean of zero and variance \(\sigma^2_{\text{phylogeny}}\) [i.e. \((0, \sigma^2_{\text{phylogeny}}\textbf{A})\)], where \(\textbf{A}\) is a phylogenetic correlation matrix derived from a phylogenetic tree. \(sp_{k[i]}\) is the species-specific effect for the \(k\)th species applied to effect size \(i\), \(s_{k[i]}\) is the study-specifc effect for the \(j\)th study applied to effect size \(i\), \(e_i\) is the effect size-spefic effect (within-study effect, or residuals) for the \(i\)th effect size, and \(m_i\) is the sampling effect for the \(i\)th effect size, resulting from varying precision for each effect size, \(v_i\) (which is known as the sampling variance for the effect).
Conduct phylogenically controlled, multi-level meta-regression. The overall_model
follows the same formula (7) but applies multiple moderator variables (\(\beta\)):
\[ \begin{equation} Y_i = \beta_0 + \displaystyle\sum_{l = 1}^{p} \beta_l x_{l[i]} + \alpha_{k[i]} + sp_{k[i]} + s_{j[i]} + e_i + m_i, \tag{8} \end{equation} \]
where \(\displaystyle\sum_{l = 1}^{p} \beta_l x_{l[i]}\) is the sum of all effects for all moderators \(x_i\) (fixed effects; \(p\) = number of slopes). All other notations are the same as described above (7).
global_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~1 + sqrt_inv_eff + year_centre,
random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), R = list(species_OTL = phylo_cor),
method = "REML", test = "t", dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
# Moderators based on best model
overall_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~1 + life_stage + trait +
uv_type + ln_delta_dose, random = list(~1 | es_ID, ~1 | study_ID, ~1 | species,
~1 | species_OTL), R = list(species_OTL = phylo_cor), method = "REML", test = "t",
dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
global_r2 <- orchaRd::r2_ml(global_model) * 100
overall_r2 <- orchaRd::r2_ml(overall_model) * 100
Heterogeneity is a persistent problem in ecological and evolutionary meta-analysis (Borenstein, 2019; Noble et al., 2022; Senior et al., 2016). Here, heterogeneity is reported as \(I^2_\text{total}\) and is calculated as:
\[ \begin{equation} I^2_\text{total} = \frac{\sigma^2_\text{phylogeny} + \sigma^2_\text{species} + \sigma^2_\text{study} + \sigma^2_\text{residual}}{\sigma^2_\text{total}}, \tag{9} \end{equation} \]
where \(\sigma^2_\text{total} = \sigma^2_\text{phylogeny} + \sigma^2_\text{species} + \sigma^2_\text{study} + \sigma^2_\text{residual} + \sigma^2_\text{sampling}\) is the total effect size variance and \(\sigma^2_\text{sampling}\) is the sampling error variance calculated as:
\[ \begin{equation} \sigma_{\text{sampling}}^2 = \sum w_{i}\left( k-1\right) / \left[ \left( \sum w_{i}\right)^2 + \sum w_{i}^2\right] \ \tag{10} \end{equation} \]
where \(k\) is the number of studies and the weights, \(w_i = 1 / v_i\), can be calculated using the inverse of the sampling variance (\(v_i\)) for each effect size \(i\). Lastly, we also calculated how much variance is explained by the model as \(R^2\) which can be separated by \(R^2_{\text{marginal}}\) (fixed effects only) and \(R^2_{\text{conditional}}\) (fixed and random effects):
\[ \begin{equation} R^2_{\text{marginal}} = \frac{\sigma^2_\text{fixed}}{\sigma^2_\text{fixed} + \sigma^2_\text{phylogeny} + \sigma^2_\text{species} + \sigma^2_\text{study} + \sigma^2_\text{residual}}, \\ R^2_{\text{conditional}} = \frac{\sigma^2_\text{fixed} + \displaystyle\sum_{r = 1}^{u} \sigma^2_r}{\sigma^2_\text{fixed} + \sigma^2_\text{phylogeny} + \sigma^2_\text{species} + \sigma^2_\text{study} + \sigma^2_\text{residual}}, \tag{11} \end{equation} \]
where \(\sigma^2_\text{fixed}\) is the variance fo the fixed effects expressed as \(var(\displaystyle\sum_{l = 1}^{p} \beta_l x_{l[i]})\) (Nakagawa and Schielzeth, 2007). The difference between \(R^2_{\text{marginal}}\) and \(R^2_{\text{conditional}}\) is whether the random effect variance is included in the numerator. This is expressed as \(\displaystyle\sum_{r = 1}^{u} \sigma^2_r\), where \(u\) is the number of random factors, and \(\sigma^2_r\) is the variance component of the \(r\)th random factor.
Table S2. Summary output of the model averaging of seven candidate models with AIC delta <= 2.The model average was presented as either the full average
, which assumes that a moderator is included in every model, or the conditional average
, which averages over the models where the moderators appears.
##
## Call:
## model.avg(object = candidate_models, subset = delta <= 2)
##
## Component model call:
## metafor::rma.mv(yi = lnRR, V = vi, mods = ~<8 unique rhs>, random =
## list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), data =
## mumin_dat, method = ML, test = t, dfs = contain, R = list(species_OTL =
## phylo_cor))
##
## Component models:
## df logLik AICc delta weight
## 3467 20 -440 922 0.00 0.20
## 367 19 -441 922 0.03 0.19
## 3567 20 -441 922 0.74 0.14
## 34567 21 -440 923 0.82 0.13
## 2367 20 -441 923 1.39 0.10
## 23467 21 -440 923 1.43 0.10
## 1367 20 -441 924 1.94 0.07
## 13467 21 -440 924 1.96 0.07
##
## Term codes:
## classification exposure_temp life_stage ln_delta_dose ln_dur_day
## 1 2 3 4 5
## trait uv_type
## 6 7
##
## Model-averaged coefficients:
## (full average)
## Estimate Std. Error z value Pr(>|z|)
## intrcpt -0.02704 0.38522 0.07 0.94
## life_stageLarva -0.27644 0.17975 1.54 0.12
## life_stageJuvenile -0.00542 0.19022 0.03 0.98
## life_stageAdult -0.30038 0.20757 1.45 0.15
## ln_delta_dose -0.01005 0.01406 0.71 0.47
## traitCardiorespiratory Function 0.07111 0.26142 0.27 0.79
## traitDNA Damage 0.02602 0.25684 0.10 0.92
## traitEnergy Metabolism 0.35124 0.25430 1.38 0.17
## traitGrowth 0.24152 0.19466 1.24 0.21
## traitHormonal Stress Response 0.03221 0.26825 0.12 0.90
## traitLocomotion 0.21291 0.19571 1.09 0.28
## traitNeuromusclular 0.46248 0.28568 1.62 0.11
## traitOxidant -0.26971 0.25435 1.06 0.29
## traitOxidative Damage 0.09531 0.24665 0.39 0.70
## traitOxidative Stress Response/Defense 0.40133 0.24487 1.64 0.10 .
## uv_typeUVB -0.17372 0.08209 2.12 0.03 *
## ln_dur_day 0.00559 0.01312 0.43 0.67
## exposure_temp 0.00137 0.00456 0.30 0.76
## classificationTissue/Organ System -0.01868 0.12452 0.15 0.88
## classificationWhole Animal Performance -0.07202 0.18771 0.38 0.70
##
## (conditional average)
## Estimate Std. Error z value Pr(>|z|)
## intrcpt -0.02704 0.38522 0.07 0.94
## life_stageLarva -0.27644 0.17975 1.54 0.12
## life_stageJuvenile -0.00542 0.19022 0.03 0.98
## life_stageAdult -0.30038 0.20757 1.45 0.15
## ln_delta_dose -0.02019 0.01388 1.45 0.15
## traitCardiorespiratory Function 0.07111 0.26142 0.27 0.79
## traitDNA Damage 0.02602 0.25684 0.10 0.92
## traitEnergy Metabolism 0.35124 0.25430 1.38 0.17
## traitGrowth 0.24152 0.19466 1.24 0.21
## traitHormonal Stress Response 0.03221 0.26825 0.12 0.90
## traitLocomotion 0.21291 0.19571 1.09 0.28
## traitNeuromusclular 0.46248 0.28568 1.62 0.11
## traitOxidant -0.26971 0.25435 1.06 0.29
## traitOxidative Damage 0.09531 0.24665 0.39 0.70
## traitOxidative Stress Response/Defense 0.47128 0.19351 2.44 0.01 **
## uv_typeUVB -0.17372 0.08209 2.12 0.03 *
## ln_dur_day 0.02093 0.01800 1.16 0.25
## exposure_temp 0.00703 0.00819 0.86 0.39
## classificationTissue/Organ System -0.12589 0.30160 0.42 0.68
## classificationWhole Animal Performance -0.48520 0.19211 2.53 0.01 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Table S3. Summary output of the global_model
. intrcpt = overall effect, sqrt_inv_eff = square root of the inverse of effective sample size (small sample effect), year_centre = mean centring of the publication year (decline effect). Heterogeneity is also presented, where I2_Total = total I2, I2_es_ID, within study effect I2, I2_study_ID = between study effects I2, I2_species = species I2, and 2_species_OTL = phylogeny I2. Publication bias as fixed effects (\(R^2_{\text{marginal}}\)) explained 0.61% of the variation, while the random effects (\(R^2_{\text{conditional}}\)) explained 100% of the variation.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1407 0.3751 895 no es_ID no
## sigma^2.2 0.1586 0.3983 73 no study_ID no
## sigma^2.3 0.0000 0.0000 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 2:3):
## F(df1 = 2, df2 = 70) = 0.7325, p-val = 0.4844
##
## Model Results:
##
## estimate se tval df pval ci.lb ci.ub
## intrcpt -0.3051 0.1058 -2.8823 44 0.0061 -0.5184 -0.0918 **
## sqrt_inv_eff 0.1695 0.1529 1.1084 892 0.2680 -0.1306 0.4696
## year_centre -0.0030 0.0061 -0.4986 70 0.6196 -0.0151 0.0091
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## I2_Total I2_es_ID I2_study_ID I2_species I2_species_OTL
## 100 47 53 0 0
Table S4. Summary output of the overall_model
. intrcpt = overall effect. Moderator variables include life stage (embryo, larva, juvenile, adult), trai (see Table S1), UV type (UVA, UVB), exposure temperature, and the natural logarithm of daily dosage (J day). Heterogeneity is also presented, where I2_Total = total I2, I2_es_ID, within study effect I2, I2_study_ID = between study effects I2, I2_species = species I2, and 2_species_OTL = phylogeny I2. Fixed effects (\(R^2_{\text{marginal}}\)) explained 15.84% of the variation, while the random effects (\(R^2_{\text{conditional}}\)) explained 100% of the variation.
##
## Multivariate Meta-Analysis Model (k = 808; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1156 0.3400 808 no es_ID no
## sigma^2.2 0.1719 0.4147 62 no study_ID no
## sigma^2.3 0.0000 0.0000 42 no species no
## sigma^2.4 0.0000 0.0000 41 no species_OTL yes
##
## Test of Moderators (coefficients 2:16):
## F(df1 = 15, df2 = 46) = 6.8930, p-val < .0001
##
## Model Results:
##
## estimate se tval df pval
## intrcpt 0.1316 0.2860 0.4602 25 0.6494
## life_stageLarva -0.2954 0.1603 -1.8424 792 0.0658
## life_stageJuvenile -0.0243 0.1760 -0.1382 792 0.8901
## life_stageAdult -0.3231 0.1975 -1.6359 46 0.1087
## traitCardiorespiratory Function 0.0646 0.1683 0.3837 792 0.7013
## traitDNA Damage 0.1108 0.1676 0.6614 792 0.5085
## traitEnergy Metabolism 0.3478 0.1672 2.0800 792 0.0378
## traitGrowth 0.1973 0.1409 1.4009 792 0.1616
## traitHormonal Stress Response 0.0542 0.1804 0.3005 792 0.7639
## traitLocomotion 0.1624 0.1497 1.0848 792 0.2783
## traitNeuromusclular 0.4813 0.2050 2.3479 792 0.0191
## traitOxidant -0.2454 0.1642 -1.4951 792 0.1353
## traitOxidative Damage 0.1112 0.1524 0.7298 792 0.4657
## traitOxidative Stress Response/Defense 0.4075 0.1492 2.7307 792 0.0065
## uv_typeUVB -0.2033 0.0796 -2.5556 792 0.0108
## ln_delta_dose -0.0204 0.0137 -1.4926 792 0.1359
## ci.lb ci.ub
## intrcpt -0.4575 0.7207
## life_stageLarva -0.6102 0.0193 .
## life_stageJuvenile -0.3698 0.3211
## life_stageAdult -0.7206 0.0745
## traitCardiorespiratory Function -0.2657 0.3948
## traitDNA Damage -0.2181 0.4398
## traitEnergy Metabolism 0.0196 0.6759 *
## traitGrowth -0.0792 0.4739
## traitHormonal Stress Response -0.2999 0.4083
## traitLocomotion -0.1314 0.4562
## traitNeuromusclular 0.0789 0.8836 *
## traitOxidant -0.5677 0.0768
## traitOxidative Damage -0.1880 0.4105
## traitOxidative Stress Response/Defense 0.1146 0.7004 **
## uv_typeUVB -0.3595 -0.0471 *
## ln_delta_dose -0.0472 0.0064
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## I2_Total I2_es_ID I2_study_ID I2_species I2_species_OTL
## 100 40 60 0 0
Figure was generated with the coordinates of the wild sourced studies and the mean ultraviolet-B irradiation (UVB) of the highest month was obtained from Beckmann et al. (2014).
## OGR data source with driver: ESRI Shapefile
## Source: "/Users/nicholaswu/Library/CloudStorage/OneDrive-WesternSydneyUniversity/UV meta-analysis/ne_50m_land/ne_50m_land.shp", layer: "ne_50m_land"
## with 1420 features
## It has 3 fields
## Integer64 fields read as strings: scalerank
uv_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~uv_type - 1, random = list(~1 |
es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), R = list(species_OTL = phylo_cor),
method = "REML", test = "t", dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
Table S5. Summary output of the uv_model
.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1400 0.3742 895 no es_ID no
## sigma^2.2 0.1574 0.3967 73 no study_ID no
## sigma^2.3 0.0000 0.0000 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 893) = 8.6509, p-val = 0.0002
##
## Model Results:
##
## estimate se tval df pval ci.lb ci.ub
## uv_typeUVA -0.1033 0.0709 -1.4575 893 0.1453 -0.2425 0.0358
## uv_typeUVB -0.2239 0.0552 -4.0559 893 <.0001 -0.3323 -0.1156 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
region_model <- metafor::rma.mv(yi = lnRR, V = M,
mods = ~ region-1,
random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL),
R = list(species_OTL = phylo_cor),
method ="REML",
test = "t",
dfs = "contain",
control = list(rel.tol = 1e-8), # model converge
data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
Table S6. Summary output of the region_model
.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1404 0.3748 895 no es_ID no
## sigma^2.2 0.1644 0.4054 73 no study_ID no
## sigma^2.3 0.0000 0.0002 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 44) = 4.4606, p-val = 0.0081
##
## Model Results:
##
## estimate se tval df pval ci.lb ci.ub
## regionTropical -0.2286 0.0997 -2.2922 44 0.0267 -0.4297 -0.0276 *
## regionSubtropical -0.1578 0.0839 -1.8808 892 0.0603 -0.3224 0.0069 .
## regionTemperate -0.2062 0.0840 -2.4539 892 0.0143 -0.3710 -0.0413 *
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
taxa_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~class - 1, random = list(~1 |
es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), R = list(species_OTL = phylo_cor),
method = "REML", test = "t", dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
print(taxa_model)
Table S7. Summary output of the taxa_model
.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1405 0.3748 895 no es_ID no
## sigma^2.2 0.1620 0.4025 73 no study_ID no
## sigma^2.3 0.0000 0.0000 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 43) = 3.8077, p-val = 0.0098
##
## Model Results:
##
## estimate se tval df pval ci.lb ci.ub
## classAmphibian -0.2608 0.0984 -2.6508 43 0.0112 -0.4593 -0.0624 *
## classBird -0.4754 0.2959 -1.6064 43 0.1155 -1.0722 0.1214
## classFish -0.1646 0.0697 -2.3604 43 0.0229 -0.3051 -0.0240 *
## classReptile -0.0465 0.2038 -0.2282 43 0.8206 -0.4576 0.3645
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
stage_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~life_stage - 1, random = list(~1 |
es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), R = list(species_OTL = phylo_cor),
method = "REML", test = "t", dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
print(stage_model)
Table S8. Summary output of the stage_model
.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1397 0.3737 895 no es_ID no
## sigma^2.2 0.1621 0.4026 73 no study_ID no
## sigma^2.3 0.0000 0.0000 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 69) = 4.8917, p-val = 0.0016
##
## Model Results:
##
## estimate se tval df pval ci.lb ci.ub
## life_stageEmbryo -0.0332 0.1226 -0.2708 891 0.7866 -0.2737 0.2073
## life_stageLarva -0.2657 0.0712 -3.7306 891 0.0002 -0.4055 -0.1259
## life_stageJuvenile -0.1098 0.0825 -1.3303 891 0.1838 -0.2718 0.0522
## life_stageAdult -0.2517 0.1159 -2.1723 69 0.0333 -0.4829 -0.0205
##
## life_stageEmbryo
## life_stageLarva ***
## life_stageJuvenile
## life_stageAdult *
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
trait_model <- metafor::rma.mv(yi = lnRR, V = M, mods = ~trait - 1, random = list(~1 |
es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL), R = list(species_OTL = phylo_cor),
method = "REML", test = "t", dfs = "contain", data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
Table S9. Summary output of the trait_model
.
##
## Multivariate Meta-Analysis Model (k = 895; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor R
## sigma^2.1 0.1250 0.3535 895 no es_ID no
## sigma^2.2 0.1241 0.3523 73 no study_ID no
## sigma^2.3 0.0000 0.0000 48 no species no
## sigma^2.4 0.0000 0.0000 47 no species_OTL yes
##
## Test of Moderators (coefficients 1:11):
## F(df1 = 11, df2 = 884) = 12.9307, p-val < .0001
##
## Model Results:
##
## estimate se tval df pval
## traitBehaviour -0.5313 0.1208 -4.3974 884 <.0001
## traitCardiorespiratory Function -0.2537 0.0884 -2.8718 884 0.0042
## traitDNA Damage -0.5110 0.0822 -6.2196 884 <.0001
## traitEnergy Metabolism 0.0615 0.0806 0.7624 884 0.4460
## traitGrowth -0.1741 0.0617 -2.8205 884 0.0049
## traitHormonal Stress Response -0.3452 0.1076 -3.2081 884 0.0014
## traitLocomotion -0.2706 0.0770 -3.5153 884 0.0005
## traitNeuromusclular 0.0131 0.1639 0.0801 884 0.9362
## traitOxidant -0.5796 0.0958 -6.0528 884 <.0001
## traitOxidative Damage -0.2440 0.0705 -3.4616 884 0.0006
## traitOxidative Stress Response/Defense -0.0041 0.0654 -0.0634 884 0.9495
## ci.lb ci.ub
## traitBehaviour -0.7684 -0.2942 ***
## traitCardiorespiratory Function -0.4272 -0.0803 **
## traitDNA Damage -0.6723 -0.3498 ***
## traitEnergy Metabolism -0.0968 0.2197
## traitGrowth -0.2952 -0.0530 **
## traitHormonal Stress Response -0.5564 -0.1340 **
## traitLocomotion -0.4216 -0.1195 ***
## traitNeuromusclular -0.3086 0.3349
## traitOxidant -0.7676 -0.3917 ***
## traitOxidative Damage -0.3824 -0.1057 ***
## traitOxidative Stress Response/Defense -0.1325 0.1242
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Taxonomic group and UV interaction
taxa_uv_model <- metafor::rma.mv(yi = lnRR, V = M,
mods = ~ class + uv_type-1,
random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL),
R = list(species_OTL = phylo_cor),
method ="REML",
test = "t",
dfs = "contain",
data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
taxa_uv_model2 <- orchaRd::mod_results(taxa_uv_model, group = "study_ID", mod = "class", by = "uv_type", weights = "prop", data = raw_dat)
taxa_uv_plot <- orchaRd::orchard_plot(taxa_uv_model2, xlab = "", g = FALSE,
branch.size = 1.5, trunk.size = 4, condition.lab = "UV type") +
geom_point() + # mean estimate
scale_shape_manual(values = c(21, 24)) +
scale_colour_manual(values = c("#e6e58e", "#EDA200", "#D24E71", "#a733a4")) +
scale_fill_manual(values = c("#e6e58e", "#EDA200", "#D24E71", "#a733a4")) +
ylab("Effect size (lnRR)") +
ggtitle("Taxonomic group") +
mytheme() + theme(legend.position = "bottom")
# Life stage and UV interaction
stage_uv_model <- metafor::rma.mv(yi = lnRR, V = M,
mods = ~ life_stage + uv_type-1,
random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL),
R = list(species_OTL = phylo_cor),
method ="REML",
test = "t",
dfs = "contain",
data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
stage_uv_model2 <- orchaRd::mod_results(stage_uv_model, group = "study_ID", mod = "life_stage", by = "uv_type", weights = "prop", data = raw_dat)
stage_uv_plot <- orchaRd::orchard_plot(stage_uv_model2, xlab = "lnRR", angle = 45, g = FALSE,
branch.size = 1.5, trunk.size = 4, condition.lab = "UV type") +
geom_point() + # mean estimate
scale_shape_manual(values = c(21, 24)) +
scale_colour_manual(values = c("#EDEF5C", "#82CC6C", "#3CB08F", "#007E7D")) +
scale_fill_manual(values = c("#EDEF5C", "#82CC6C", "#3CB08F", "#007E7D")) +
ylab("Effect size (lnRR)") +
ggtitle("Life stage") +
mytheme() + theme(legend.position = "bottom")
prow <- cowplot::plot_grid(taxa_uv_plot + theme(legend.position = "none"),
stage_uv_plot + theme(legend.position = "none"),
labels = c("a", "b"), align = "hv")
legend <- cowplot::get_legend(taxa_uv_plot + theme(legend.position = "bottom"))
cowplot::plot_grid(prow, legend, ncol = 1, rel_heights = c(1, .1))
Fig. S4. Difference in UVA and UVB radiation effects by (a) taxonomic groups and (b) life stage.
trait_uv_model <- metafor::rma.mv(yi = lnRR, V = M,
mods = ~ trait + uv_type-1,
random = list(~1 | es_ID, ~1 | study_ID, ~1 | species, ~1 | species_OTL),
R = list(species_OTL = phylo_cor),
method ="REML",
test = "t",
dfs = "contain",
data = raw_dat %>%
dplyr::mutate(species_OTL = stringr::str_replace_all(species_OTL, " ", "_")))
trait_uv_model2 <- orchaRd::mod_results(trait_uv_model, group = "study_ID", mod = "trait", by = "uv_type", weights = "prop", data = raw_dat)
orchaRd::orchard_plot(trait_uv_model2, xlab = "lnRR", angle = 45, g = FALSE,
branch.size = 1.5, trunk.size = 4, condition.lab = "UV type") +
geom_point() + # mean estimate
scale_shape_manual(values = c(21, 24)) +
scale_colour_manual(values = c("#8f6798", "#7f669f", "#7a7cab", "#7290af", "#6aa1b0", "#64b1af", "#4eb99d", "#56c57f", "#87d662", "#BBDF27", "#FDE725")) +
scale_fill_manual(values = c("#8f6798", "#7f669f", "#7a7cab", "#7290af", "#6aa1b0", "#64b1af", "#4eb99d", "#56c57f", "#87d662", "#BBDF27", "#FDE725")) +
ylab("Effect size (lnRR)") +
ggtitle("Traits") +
mytheme() + theme(legend.position = "bottom")
Fig. S5. Effect of UVA and UVB radiation on 11 biological traits.
ggplot(raw_dat) + geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.5) +
geom_point(aes(x = metric, y = lnRR, colour = trait), show.legend = FALSE) +
viridis::scale_colour_viridis(discrete = TRUE) + xlab(NULL) + ylab("Effect size (lnRR") +
coord_flip() + facet_wrap(~trait, ncol = 3, scales = "free_y") + mytheme() +
theme(axis.text = element_text(size = 5), strip.text.x = element_text(size = 6),
legend.position = "bottom")
Fig. S6. Effect of ultraviolet radiation on specific responses across different biological and functional traits. Data presented as individual effect sizes (lnRR).
R version 4.2.2 (2022-10-31)
Platform: aarch64-apple-darwin20 (64-bit)
attached base packages: stats, graphics, grDevices, utils, datasets, methods and base
other attached packages: ape(v.5.7-1), rotl(v.3.0.14), rgdal(v.1.6-7), raster(v.3.6-20), sp(v.1.6-1), MuMIn(v.1.47.5), data.table(v.1.14.8), DataExplorer(v.0.8.2), cowplot(v.1.1.1), pander(v.0.6.5), orchaRd(v.2.0), lubridate(v.1.9.2), forcats(v.1.0.0), stringr(v.1.5.0), dplyr(v.1.1.2), purrr(v.1.0.1), readr(v.2.1.4), tidyr(v.1.3.0), tibble(v.3.2.1), ggplot2(v.3.4.2), tidyverse(v.2.0.0), flextable(v.0.9.1), metafor(v.4.2-0), numDeriv(v.2016.8-1.1), metadat(v.1.2-0), Matrix(v.1.5-4.1), metaAidR(v.0.0.0.9000) and knitr(v.1.43)
loaded via a namespace (and not attached): ggbeeswarm(v.0.7.2), colorspace(v.2.1-0), ellipsis(v.0.3.2), estimability(v.1.4.1), httpcode(v.0.3.0), rstudioapi(v.0.14), farver(v.2.1.1), mvtnorm(v.1.2-2), fansi(v.1.0.4), mathjaxr(v.1.6-0), xml2(v.1.3.4), codetools(v.0.2-19), cachem(v.1.0.8), jsonlite(v.1.8.5), latex2exp(v.0.9.6), shiny(v.1.7.4), rentrez(v.1.2.3), compiler(v.4.2.2), httr(v.1.4.6), emmeans(v.1.8.6), fastmap(v.1.1.1), cli(v.3.6.1), formatR(v.1.14), later(v.1.3.1), prettyunits(v.1.1.1), htmltools(v.0.5.5), tools(v.4.2.2), igraph(v.1.4.3), coda(v.0.19-4), gtable(v.0.3.3), glue(v.1.6.2), Rcpp(v.1.0.10), jquerylib(v.0.1.4), fontquiver(v.0.2.1), vctrs(v.0.6.2), crul(v.1.4.0), nlme(v.3.1-162), xfun(v.0.39), networkD3(v.0.4), timechange(v.0.2.0), mime(v.0.12), lifecycle(v.1.0.3), pacman(v.0.5.1), XML(v.3.99-0.14), terra(v.1.7-29), scales(v.1.2.1), ragg(v.1.2.5), hms(v.1.1.3), promises(v.1.2.0.1), parallel(v.4.2.2), fontLiberation(v.0.1.0), yaml(v.2.3.7), curl(v.5.0.1), gridExtra(v.2.3), gdtools(v.0.3.3), sass(v.0.4.6), stringi(v.1.7.12), fontBitstreamVera(v.0.1.1), highr(v.0.10), zip(v.2.3.0), rlang(v.1.1.1), pkgconfig(v.2.0.3), systemfonts(v.1.0.4), rncl(v.0.8.7), evaluate(v.0.21), lattice(v.0.21-8), labeling(v.0.4.2), htmlwidgets(v.1.6.2), tidyselect(v.1.2.0), magrittr(v.2.0.3), bookdown(v.0.34), R6(v.2.5.1), generics(v.0.1.3), pillar(v.1.9.0), withr(v.2.5.0), crayon(v.1.5.2), gfonts(v.0.2.0), uuid(v.1.1-0), utf8(v.1.2.3), tzdb(v.0.4.0), rmarkdown(v.2.22), officer(v.0.6.2), viridis(v.0.6.3), progress(v.1.2.2), grid(v.4.2.2), digest(v.0.6.31), xtable(v.1.8-4), httpuv(v.1.6.11), textshaping(v.0.3.6), openssl(v.2.0.6), stats4(v.4.2.2), munsell(v.0.5.0), viridisLite(v.0.4.2), beeswarm(v.0.4.0), vipor(v.0.4.5), bslib(v.0.4.2) and askpass(v.1.1)
Hawkesbury Institute for the Environment, Western Sydney University, NSW 2753, Australia, nicholas.wu.nz@gmail.com↩︎