In the previous tutorial we over-viewed a few of the common effect size statistics likely to be used in comparative physiology. However, studies can vary in ways that can make the interpretation of these statistics challenging.

**Nuisance heterogeneity** â€“ factors causing variation in effects that are blatantly obvious, like temperature and dosage differences applied across studies â€“ are common in studies used in comparative physiology meta-analyses (Borenstein, 2019; Noble et al., 2022). **Nuisance heterogeneity can be a big driver of effect size magnitude**. For example, a contrast-based effect size, such as log response ratio, calculated from a study that has manipulated treatments to have a 10\(^{\circ}\)C temperature difference between treatments is likely going to give you a much larger effect size than a study that manipulated a treatment temperature difference of 2\(^{\circ}\)C. Amalgamating such effects within a meta-analysis will make the interpretation of effect magnitude complicated because itâ€™s difficult to know what magnitude of, say temperature, our effect size should be interpreted over.

There are a few different ways to deal with nuisance heterogeneity. The most common approach is to simply **include a moderator in a meta-regression model that controls for the temperature difference between treatments** (Noble et al., 2022). You can re-scale this continuous moderator (center the variable on the mean so â€˜0â€™ equates to the average difference) so that intercepts can be interpreted more easily (Noble et al., 2022). Alternatively, we can â€˜correctâ€™ our effect sizes to account for the nuisance variable. In this tutorial, weâ€™ll overview the latter approach as it can simplify modelling.

One common and well known effect size that is used in comparative physiology is the temperature coefficient, \(Q_{10}\). As discussed, effect sizes need to be: 1) comparable across studies and 2) we need to know, or be able to approximate, the sampling variance in order to make use of meta-analytic models. While \(Q_{10}\) satisfies 1) we do now know what the sampling variance should be for this effect size. Noble et al. (2022) fixes that issue by deriving itâ€™s sampling variance.

To begin, recall that \(Q_{10}\), is defined as:

\[ \begin{equation} Q_{10} = \left( \frac{R_{2}}{R_{1}} \right)^{ \left(\ \frac{10^{\circ}C}{T_{2}-T_{1}} \right) } \tag{1} \end{equation} \]

Here, \(R_{1}\) and \(R_{2}\) are mean physiological rates and \(T_{1}\) and \(T_{2}\) are the temperatures that these rates are measured. Natural log transformation of equation (1) leads to the following log transformed \(Q_{10}\):

\[ \begin{equation} lnRR_{Q_{10}} = ln\left( \frac{R_{2}}{R_{1}} \right){ \left(\ \frac{10^{\circ}C}{T_{2}-T_{1}} \right) } \tag{2} \end{equation} \]

Noble et al. (2022) call this transformed effect size \(LnRR_{Q_{10}}\) because of its similarities with the log response ratio. Equation (2) is essentially a temperature-corrected equivalent of *lnRR* when the numerator and denominator are measured at different temperatures. \(lnRR_{Q_{10}}\) is more likely to satisfy the assumption of residual normality than \(Q_{10}\) and given itâ€™s similarities to *lnRR* we can now approximate itâ€™s sampling variance (see Hedges et al., 1999). The recognition of this equivalence means that we can calculate the sampling variance for equation (2) as follows:

\[ \begin{equation} s^2_{lnRR_{Q_{10}}} = \left( \frac{SD_{2}^2}{R^2_{2}N_{2}} + \frac{SD_{1}^2}{R^2_{1}N_{1}} \right){ \left(\ \frac{10^{\circ}C}{T_{2}-T_{1}} \right) }^2 \tag{3} \end{equation} \]

We will demonstrate how to apply \(lnRR_{Q_{10}}\) to a data set on diving vertebrates by Rodgers et al. (2021). Rodgers et al. (2021) already analysed \(Q_{10}\), but at the time they did not have \(lnRR_{Q_{10}}\), meaning it was not possible to analyse these data using meta-analytic models â€“ they resorted to meta-regression approaches instead with standard effect sizes, which work equally as well. Here, we will show you how to calculate \(lnRR_{Q_{10}}\) and interpret it.

Weâ€™ll download the data set used to analyse \(Q_{10}\) and load a bunch of packages that are necessary.

```
q10_dat <- read.csv("https://osf.io/download/fb3ht/")
# install.packages('pacman')
pacman::p_load(devtools, pander, tidyverse, metafor)
```

Weâ€™ll now need a function for calculating \(lnRR_{Q_{10}}\) because this effect size is not part of the `metafor`

package.

```
#' @title lnRR_Q10
#' @description Calculates the log Q10 response ratio. Note that temperature 2 is placed in the numerator and temperature 1 is in the denominator
#' @param t1 Lowest of the two treatment temperatures
#' @param t2 Highest of the two treatment temperatures
#' @param r1 Mean physiological rate for temperature 1
#' @param r2 Mean physiological rate for temperature 2
#' @param sd1 Standard deviation for physiological rates at temperature 1
#' @param sd2 Standard deviation for physiological rates at temperature 2
#' @param n1 Sample size at temperature 1
#' @param n2 Sample size at temperature 2
#' @param name Character string for column name
#' @example
#' lnRR_Q10(20, 30, 10, 5, 1, 1, 30, 30)
#' lnRR_Q10(20, 30, 10, 5, 1, 1, 30, 30, name = 'acclim')
#' @export
lnRR_Q10 <- function(t1, t2, r1, r2, sd1, sd2, n1, n2, name = "acute") {
lnRR_Q10 <- (10/(t2 - t1)) * log(r2/r1)
V_lnRR_Q10 <- (10/(t2 - t1))^2 * ((sd1^2/(n1 * r1^2)) + (sd2^2/(n2 * r2^2)))
dat <- data.frame(lnRR_Q10, V_lnRR_Q10)
colnames(dat) <- c(paste0("lnRR_Q10", name), paste0("V_lnRR_Q10", name))
return(dat)
}
```

We can now use the function above to calculate \(lnRR_{Q_{10}}\).

```
# Calculate lnRRQ10 and it's associated sampling variance
q10_dat <- cbind(q10_dat, with(q10_dat, lnRR_Q10(t1 = t1, t2 = t2, r1 = mean_t1,
r2 = mean_t2, sd1 = sd_t1, sd2 = sd_t2, n1 = n_t1, n2 = n_t2, name = "")))
head(q10_dat)
```

```
## study_ID study_name year species order life_stage
## 1 119 119_Udyawer_etal_2016 2016 Hydrophis curtus serpentes unspecified
## 2 119 119_Udyawer_etal_2016 2016 Hydrophis curtus serpentes unspecified
## 3 119 119_Udyawer_etal_2016 2016 Hydrophis curtus serpentes unspecified
## 4 119 119_Udyawer_etal_2016 2016 Hydrophis elegans serpentes unspecified
## 5 119 119_Udyawer_etal_2016 2016 Hydrophis elegans serpentes unspecified
## 6 119 119_Udyawer_etal_2016 2016 Hydrophis elegans serpentes unspecified
## animal_source body_mass respiration_mode replication_level dive.type
## 1 wild 160 bimodal individual voluntary
## 2 wild 160 bimodal individual voluntary
## 3 wild 160 bimodal individual voluntary
## 4 wild 1035 bimodal individual voluntary
## 5 wild 1035 bimodal individual voluntary
## 6 wild 1035 bimodal individual voluntary
## summary_stat acclimation_temp t1 t2 mean_t delta_t t_magnitude mean_t1 sd_t1
## 1 mean 27 21 24 22 3 plus3 40 16.1
## 2 mean 27 24 27 26 3 plus3 28 15.4
## 3 mean 27 27 30 28 3 plus3 16 4.9
## 4 mean 27 21 24 22 3 plus3 27 13.3
## 5 mean 27 24 27 26 3 plus3 22 10.0
## 6 mean 27 27 30 28 3 plus3 14 4.7
## n_t1 se_t1 mean_t2 sd_t2 n_t2 se_t2 shared_control Q10 source lnRR_Q10
## 1 11 4.8 28 15.4 11 4.63 1 0.33 Fig1B -1.12
## 2 11 4.6 16 4.9 11 1.47 2 0.14 Fig1B -1.96
## 3 11 1.5 11 3.5 11 1.05 3 0.31 Fig1B -1.16
## 4 10 4.2 22 10.0 10 3.16 1 0.46 Fig1B -0.78
## 5 10 3.2 14 4.7 10 1.47 2 0.24 Fig1B -1.43
## 6 10 1.5 11 2.0 10 0.63 3 0.43 Fig1B -0.84
## V_lnRR_Q10
## 1 0.46
## 2 0.39
## 3 0.20
## 4 0.50
## 5 0.36
## 6 0.16
```

```
# Now we can back-calculate to put on the original Q10 scale. We can than check
# that this matches the Q10 already in the data
head(q10_dat %>%
mutate(exp_lnRR_Q10 = exp(lnRR_Q10)) %>%
select(exp_lnRR_Q10, Q10))
```

```
## exp_lnRR_Q10 Q10
## 1 0.33 0.33
## 2 0.14 0.14
## 3 0.31 0.31
## 4 0.46 0.46
## 5 0.24 0.24
## 6 0.43 0.43
```

How do we interpret \(lnRR_{Q_{10}}\)?

Given these are simply \(Q_{10}\)â€™s we can interpret these normally.

For the first row of our data we can see that dive duration when temperatures increase by 10\(^{\circ}\)C is expected to decrease by ~67% (1-0.33). In other words, the dive duration 10\(^{\circ}\)C above the first temperature is 33% of the rate 10\(^{\circ}\)C lower.