# Fitting threshold models to seed germination data

Andrea Onofri ·  Added on March 13, 2023 ·  19 min read

In previous posts we have shown that we can use time-to-event curves to describe the germination pattern of a seed population (see here). We have also shown that these curves can be modified to include the effects of external/internal factors/covariates, such as the genotype, the species, the humidity content and temperature in the substrate (see here and here). These modified time-to-event curves can be fitted in ‘one-step’, i.e., we start from the germination data with the appropriate shape (see here), fit the model and retrieve the estimates of model parameters ( go to here for an example ).

In some cases, we may be interested in following a different approach, that is accomplished in two-steps. Let’s consider an example where we have performed germination assays at 10 different temperatures: instead of building a time-to-event model that contains the temperature as an external covariate, we could:

1. independently fit a different time-to-event curve to the germination data at each temperature, so that we have ten independent time-to-event curves;
2. derive from each curve a summary statistic of interest, such as the germination rate for the 50-th percentile (GR50: see here)
3. Fit, e.g., a thermal-time model to those derived statistics (second step of data analyses).

Fitting models in two-steps has always been a common practice in agriculture/biology (see, e.g., multienvironment genotype experiments): it is usually simpler, quicker and requires lower computing power than one-step fitting. The drawback is that some infomation may be lost between the two steps, and, for this reason, one-step and two-steps model fitting do not necessarily lead to the same results. But, we’ll make this point in a future post.

# Definition of threshold models

Threshold models are used to describe a relationship where the response variable changes abruptly, following a small change in the predictor. A typical threshold model looks like that in the Figure below, where we see three threshold levels:

1. $$X1 = 5.5$$: at this threshold, the response changes abruptly from ‘flat’ to linearly increasing;
2. $$X2 = 23.1$$: at this threshold, the response changes abruptly from linearly increasing to linearly decreasing;
3. $$X3 = 37.2$$: at this threshold, the response changes abruptly from linearly decreasing to ‘flat’.

You may recognise a ‘broken-stick’ pattern, although threshold models can also be curvilinear, as we will see later. I have already considered threshold models in a previous post (see here) and I have already mentioned that thermal-time, hydro-time and hydro-thermal-time models for seed germination can also be cast as threshold models; if we consider, e.g., the Germination Rate (GR) as the response variable and the environmental temperature as the predictor, the relationship could be very close to that represented in Figure 1 and the three thresholds would, respectively, be the base temperature (T_b_), the optimal temperature (T_o_) and the ceiling temperature (T_c_). On the other hand, if we consider the effect of soil humidity on GR, we should expect a response pattern with only one threshold, i.e. the base water potential level (e.g. the first half of the figure above, up to the maximum response level).

# A (possibly incomplete) list of threshold models

I have made a review of literature, searching for all threshold models that have been used so far in seed germination studies. For all those models, I have built the related R functions, together with self-starting routines, which can be used for nonlinear regression fitting with the drm() function in the drc package (Ritz et al., 2019). The availability of self-starting routines will free you from the hassle of having to provide initial guesses for model parameters. All these R functions are available within the drcSeedGerm package (Onofri et al., 2018) and their names, with links to the relevant parts of the appendix to this post are:

It may be helpful to look at the shapes of the above models in the Figure below, while the equations are motivated in the appendix, at the end of this post. Now, let’s look at a few examples of two-steps fitting. But, before working through this, you will need to install and load the drcSeedGerm package, by using the code below.

# installing drcSeedGerm package, if not yet available
# library(devtools)
# install_github("onofriandreapg/drcSeedGerm")

library(drcSeedGerm)
library(tidyverse)
library(lmtest)
library(sandwich)

# Example 1

This dataset describes the germination of rapeseed (cv. Excalibur) at different water potential levels in the substrate. It has been already used for fitting a hydro-time model in one step (see here); in this present post, we try a different line of attack.

First of all, we remove all dishes with water potential levels higher than -0.7 MPa, because the germinations were too quick to obtain a reliable estimate of the whole time-to-event curve. Next, we independently (‘separate = T’) fit a time to event model to the data observed in each dish. Lately, for each time to event curve, we retrieve the maximum proportion of germinated seeds (Pmax, i.e. the ‘d’ parameter of the time-to-event curve) and the germination rates for the 10th, 30th and 50th percentile.

# First-step of data analyses
data(rape2G)
rape2G <- rape2G %>%
dplyr::filter(Psi <=-0.7 & CV == "Excalibur") %>%
mutate(Dish2 = paste(Dish, Psi, sep = ":"))

# model fit
mod.first <- drmte(nSeeds ~ timeBef + timeAf,
data = rape2G,
fct = LL.3(), curveid = Dish2,
separate = T)

# Retrieve maximum proportion of germinated seeds
Pmax <- coef(mod.first)[substr(names(coef(mod.first)), 1, 1) == "d"]
PmaxList <- tibble(Pmax =  Pmax) %>%
mutate(temp = names(Pmax), .before = Pmax) %>%
separate(col = "temp", into = c("n", "Dish", "Psi"),
sep = ":") %>%
mutate(Psi = as.numeric(Psi)) %>%
select(-1)
## # A tibble: 6 × 3
##   Dish    Psi  Pmax
##   <chr> <dbl> <dbl>
## 1 64     -0.7 0.901
## 2 65     -0.7 0.986
## 3 66     -0.7 0.922
## 4 67     -0.8 0.914
## 5 68     -0.8 0.887
## 6 69     -0.8 0.835
# Retrieve the GR values
GR <- quantile(mod.first, rate = T, probs = c(0.1, 0.3, 0.5))
GRlist <- tibble(temp = row.names(GR), GR, row.names = NULL) %>%
separate(col = "temp", into = c("Dish", "Psi", "g"),
sep = ":") %>%
mutate(Psi = as.numeric(Psi)) %>%
remove_rownames()
## # A tibble: 6 × 5
##   Dish    Psi g     Estimate     SE
##   <chr> <dbl> <chr>    <dbl>  <dbl>
## 1 64     -0.7 10%      0.581 0.0895
## 2 64     -0.7 30%      0.416 0.0397
## 3 64     -0.7 50%      0.333 0.0239
## 4 65     -0.7 10%      0.718 0.149
## 5 65     -0.7 30%      0.468 0.0595
## 6 65     -0.7 50%      0.357 0.0330

Now, we are ready to move on to the second step of data analysis. Relating to the Pmax value, we can see that this values stays constant and equal to 0 up to -1 MPa and increases steadily afterwords. We can model this behaviour by using the PmaxPsi1() function, as shown in the box below.

modPmax <- drm(Pmax ~ Psi, data = PmaxList,
fct = PmaxPsi1())
plot(modPmax, log = "") coeftest(modPmax, vcov. = sandwich)
##
## t test of coefficients:
##
##                     Estimate Std. Error   t value  Pr(>|t|)
## G:(Intercept)      1.0737381  0.0746708   14.3796 2.608e-11 ***
## Psib:(Intercept)  -1.0053956  0.0016495 -609.5109 < 2.2e-16 ***
## sigma:(Intercept)  0.1367469  0.0272873    5.0114 9.058e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Regarding the germination percentiles, a look at the data shows that, for all percentiles, germination rates stay constant up to -1 MPa and, afterwords, they increase linearly. We can model this behaviour by using the GRPsiLin() equation and, following Bradford (2002), we code a common base water potential level for the different germination percentiles. The code is given in the box below.

modGR <- drm(Estimate ~ Psi, data = GRlist,
fct = GRPsi.Lin(), curveid = g,
pmodels = list(~1, ~g - 1))
plot(modGR, log = "",
legendPos = c(-1.3, 0.7)) coeftest(modGR, vcov. = sandwich)
##
## t test of coefficients:
##
##                   Estimate Std. Error  t value  Pr(>|t|)
## Psib:(Intercept) -0.989504   0.031937 -30.9832 < 2.2e-16 ***
## thetaH:g10%       0.446550   0.081366   5.4881 8.977e-07 ***
## thetaH:g30%       0.649827   0.099213   6.5498 1.557e-08 ***
## thetaH:g50%       0.852974   0.134058   6.3627 3.209e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Usually, we are interested in the base osmotic potential level ($$\Psi_b$$) that is given in the output of the coeftest() method. We used coeftest() in the lmtest package for reasons that will be clearer later on.

# Example 2

This second dataset was obtained from a germination assays with barley, where three replicates of 50 seeds were placed in Petri dishes and assayed at 9 constant temperature levels (1, 3, 7, 10, 15, 20, 25, 30, 35, 40 °C). Germinated seeds were counted and removed daily for 10 days. We have already presented this analysis in a previous paper (Onofri et al., 2018), although in this post we use a different (and updated) coding.

Also in this second example, the first step of data analysis is based on loading the data and fitting a separate time-to-event curve to the data at each temperature level.

data(barley)
barley <- barley %>%
mutate(TempF = factor(Temp))

mod1 <- drmte(nSeeds ~ timeBef + timeAf, fct=W2.3(),
curveid = TempF,
data = barley,
separate = T)

Now, we retrieve the germination rates for the 10^th, 30th and 50th percentile; for analogy with the published paper, we restrict the percentiles to the germinated fraction, althoug it might be better to avoid such a restriction.

GR <- quantile(mod1, rate = T, restricted = T,
probs = c(0.1, 0.3, 0.5),
display = F)
GRlist <- tibble(temp = row.names(GR), GR, row.names = NULL) %>%
separate(col = "temp", into = c("Temp", "g"),
sep = ":") %>%
mutate(Temp = as.numeric(Temp)) %>%
remove_rownames()
## # A tibble: 6 × 4
##    Temp g     Estimate      SE
##   <dbl> <chr>    <dbl>   <dbl>
## 1     1 10%     0.0982 0.00328
## 2     1 30%     0.0777 0.00177
## 3     1 50%     0.0682 0.00125
## 4     3 10%     0.124  0.00307
## 5     3 30%     0.105  0.00173
## 6     3 50%     0.0962 0.00126

The behaviour of germination rates against temperature can be described, e.g., by using the threshold model proposed by Masin et al. (2017), that is implemented in the R function GRT.Ex(), as shown in the box below. Preliminary trials show that the three percentiles share the same ‘k’ parameter and base temperature level, which we can request by using the ‘pmodels’ argument.

modGR <- drm(Estimate ~ Temp, data = GRlist,
fct = GRT.Ex(),
curveid = g, pmodels = list(~1, ~1, ~g - 1, ~g -1))
coeftest(modGR, vcov. = sandwich)
##
## t test of coefficients:
##
##                 Estimate Std. Error   t value  Pr(>|t|)
## k:(Intercept)   0.876849   0.138731    6.3205 4.577e-06 ***
## Tb:(Intercept) -0.553318   0.774412   -0.7145    0.4836
## Tc:g10%        35.200942   0.021761 1617.5850 < 2.2e-16 ***
## Tc:g30%        33.235421   0.321386  103.4129 < 2.2e-16 ***
## Tc:g50%        32.198489   0.225161  143.0021 < 2.2e-16 ***
## ThetaT:g10%    25.454497   1.788195   14.2347 1.378e-11 ***
## ThetaT:g30%    40.458899   2.001762   20.2116 2.630e-14 ***
## ThetaT:g50%    51.413920   2.415663   21.2836 1.025e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(modGR, log = "", type = "all", xlim = c(0, 40),
ylim = c(0, 1.3),
ylab = "GR", xlab = "Temperature (°C)",
legendPos = c(12, 0.9)) # Warning message!

When we collect data about the response of germination rates to temperature and use them to parameterise nonlinear regression models by using nonlinear least squares, the basic assumption of homoscedasticity is rarely tenable. We should not forget this!. In the above examples I used a robust variance-covariance sandwich estimator (Zeileis, 2006; see the use of the coeftest() method, instead of the summary() method), although other techniques can be successfully used to deal with this problem.

Thanks for reading and happy coding!

Andrea Onofri
Department of Agricultural, Food and Environmental Sciences
University of Perugia (Italy)
andrea.onofri@unipg.it

# Appendix: description of models

## GRPsiLin() - GRT.GH()

The equation behind GRPsiLin() has been used to describe the effect of environmental humidity ($$\Psi$$, in MPa) on germination rate (Bradford, 2002):

$GR = \frac{\max\left[\Psi, \Psi_b\right] - \Psi_b}{\theta_H}$

The parameter $$\Psi_b$$ is the base water potential (in MPa), representing the minimum level of humidity in the substrate to trigger the germination process. The other parameter $$\theta_H$$ (in MPa day or MPa hour) is the hydro-time constant.

A totally similar equation (with different parameter names) has been used by Garcia-Huidobro et al (1982), to describe the effect of sub-optimal temperatures (T in °C) on the germination rate:

$GR = \frac{\max \left[T, T_b\right] - T_b}{\theta_T}$

where $$T_b$$ is the base temperature and $$\theta_T$$ is the thermal time (in °C d). This second model is available GRT.GH().

# sample code (not executed)
# Tlev <- c(2, 5, 10, 15, 20, 25)
# GR <- c(0, 0, 0.21, 0.49, 0.68, 0.86)
# modGH <- drm(GR ~ Tlev, fct = GRT.GH())
# library(sandwich); library(lmtest)
# coeftest(modGH, vcov = sandwich)
# plot(modGH, log="", xlim = c(0, 25), legendPos = c(5, 1.2),
#      xlab = "Temperature (°C)")

Go up

## GRPsiPol() - GRPsiPol2()

In my experience, I have found that the relationship between GR and water potential in the substrate may, sometimes, be curvilinear. For these situations, I have successfully used the following equations:

$GR = \frac{\max\left[\Psi,\Psi_b\right]^2 - \Psi^2_b}{\theta_H}$

and:

$GR = \frac{\left(\max\left[\Psi, \Psi_b\right] - \Psi_b \right)^2}{ \theta_H }$

Both models can be fitted in R, by using the two functions GRPsi.Pol() and GRPsi.Pol2()

# sample code (not executed)
# Psi <- c(-2, -1.5, -1.2, -1, -0.8, -0.6, -0.4, -0.25,
#          -0.12, -0.06, -0.03, 0)
# GR <- c(0, 0, 0, 0, 0.0585, 0.094, 0.1231, 0.1351,
#         0.1418, 0.1453, 0.1458, 0.1459)
# Psi2 <- c(-0.5, -0.6, -0.7, -0.8, -0.9, -1, -1.1, -1.2,
#           -1.5)
# GR2 <- c(1.4018, 1.0071, 0.5614, 0.3546, 0.2293, 0, 0,
#          0, 0)
#
#
# modHT <- drm(GR ~ Psi, fct = GRPsiPol())
# modHT2 <- drm(GR2 ~ Psi2, fct = GRPsiPol2())
# par(mfrow = c(1,2))
# plot(modHT, log="", legendPos = c(-1.5, 0.15),
#      ylim = c(0, 0.20), xlab = "Water potential (MPa)")
# plot(modHT2, log="", legendPos=c(-1.3, 1),
#      xlab = "Water potential (MPa)")

Go up

## PmaxPsi1() and PmaxT1()

All the previous models tend to go up to infinity when the predictor value (temperature or water potential) goes to infinity. In some instances, we may need an asymptotic model, to describe the response of the maximum proportion of germinated seeds to soil humidity (Onofri et al., 2018).

In practice, we could use a shifted exponential model:

$\pi = G \, \left[ 1 - exp \left( \frac{ \max\left[\Psi, \Psi_b\right] - \Psi_b }{\sigma} \right) \right]$

where $$\pi$$ is the proportion of germinated seeds, $$G$$ is the fraction of non-germinable seeds (e.g., dormant seeds) and $$\sigma$$ describes how quickly the population of seeds responds to increased humidity in the substrate. This model can be fitted by using the R function the self-starters PmaxPsi1().

If we reverse the sign of $$\sigma$$ in the previous equation, we obtain a decreasing trend, which might be useful to describe the effect of super-optimal temperatures on the proportion of germinated seeds, going down to 0 at the ceiling temperature threshold. Also this model is available in R, under the name PmaxT1(). PmaxPsi1() PmaxT1() are two equivalent R functions, apart from the name of model parameters.

# sample code (not executed)
# par(mfrow = c(1,2))
# # Pmax vs Psi
# Psi <- seq(-2.2, 0, by = 0.2)
# Pmax <- c(0, 0, 0.076, 0.413, 0.514, 0.643, 0.712,
#           0.832, 0.865, 0.849, 0.89, 0.90)
# mod <- drm(Pmax ~ Psi, fct = PmaxPsi1())
# plot(mod, log = "", xlab = "Water potential (MPa)",
#      ylab = "Proportion of germinating seeds")
#
# # Pmax vs temperature
# Tval <- c(0, 2.5, 5, 7.5, 10, 12.5, 15, 17.5,
#           20, 22.5, 25, 27.5, 30, 32.5, 35)
# Pmax2 <- c(0.79, 0.81, 0.807, 0.776, 0.83,
#            0.73, 0.744, 0.73, 0.828, 0.818,
#            0.805, 0.706, 0.41, 0.002, 0)
# mod2 <- drm(Pmax2 ~ Tval, fct = PmaxT1())
# plot(mod2, log = "", xlab = "Temperature (°C)",
#      ylab = "Proportion of germinating seeds")

Go up

## GRT.BS()

A broken-stick trend, as the one depicted in the first Figure above was used by Alvarado and Bradford (2002) to model the effect of temperature on the germination rate. Their equation is:

$GR = \frac{\max \left[\min \left[T,T_o \right], Tb \right] - T_b}{\theta_{T}} \, \left\{ 1 - k \left( \max \left[ T,T_o \right] - T_o \right) \right\}$ The right factor is only meaningful when it is positive, that happens when $$T < T_c$$, i.e. when the environmental temperature is lower than the ceiling temperature. On this basis, the ceiling temperature is equal to:

$T_c = \frac{1}{k} + T_o$

The above equation can be easily fitted with the GRT.BS() function in the ‘drcSeedGerm’ package. We have also implemented the reparameterised equation, where the parameter ‘k’ is replaced with $$1/(T_c - T_b)$$:

$GR = \frac{\min \left[T,T_o \right] - T_b}{\theta_{T}} \, \left\{ 1 - \frac {\min \left[\max \left[ T,T_o \right], T_c \right] - T_o}{T_c - T_o} \right\}$

This reparameterised equation is available as GRT.BSb(); it is handy, because the ceiling temperature is included as a parameter, but its fitting properties are not as good as those of the previous equation.

# sample code
# Tval <- c(2, 5, 10, 15, 20, 25, 30, 35, 40)
# GR <- c(0, 0, 0.209, 0.435, 0.759, 0.821, 0.417, 0.145, 0)
#
# modBS <- drm(GR ~ Tval, fct = GRT.BS())
# plot(modBS, log="", xlim = c(0, 40), ylim=c(0,1.2),
#      legendPos = c(5, 1.0), xlab = "Temperature (°C)")
# coeftest(modBS, vcov = sandwich)
#
# # Reparameterised (self-starter is less accurate)
# modBS <- drm(GR ~ Tval, fct = GRT.BSb())
# plot(modBS, log="", xlim = c(0, 40), ylim=c(0,1.2),
#      legendPos = c(5, 1.0), xlab = "Temperature (°C)")
# coeftest(modBS, vcov = sandwich)

Go up

## GRT.RF()

Broken-stick trends may not be reasonable for biological processes, which might be better described by curvilinear equations. Rowse and Finch-Savage (2003) proposed another equation with two components: the first one depicts a linear increase of the GR value with temperature, which is off-set by the second component, starting from $$T = T_d$$, which is close to (but not coincident with) $$T_o$$. The equation is:

$GR = \frac{ \max \left( T, T_b \right) - T_b}{\theta_{T}} \left\{ 1 - k \left[ \max \left(T,T_d\right) - T_d \right] \right\}$ The optimal temperature can be derived as:

$T_o = \frac{1 + kT_b + kT_d}{2k}$ while the ceiling temperature is:

$T_c = \frac{1}{k} + T_d$

For this equation, you will find the GRT.RF() self-starter in the ‘drcSeedGerm’ package. We also provide the self-starter GRT.RFb(), where the parameters ‘k’ is replaced by $1/(T_c - T_d)$:

$GR = \frac{ \max \left[ T, T_b \right] - T_b}{\theta_{T}} \left\{ 1 - \frac{\left[ \max \left(T,T_d\right) - T_d \right]}{T_c - T_d} \right\}$

This reparameterised equation contains the ceiling temperature as a parameter, but its fitting properties are as good as those pf the previous equation.

Go up

## GRT.M()

According to Mesgaran et al (2017), the negative and positive effects of temperature coexist for all temperatures above $$T_b$$. Their proposed equation is:

$GR = \frac{ \max \left( T, T_b \right) - T_b}{\theta_{T}} \left\{ 1 - k \left[ \min \left(T,T_c\right) - T_b \right] \right\}$ This equation is only defined from base to ceiling temperature, while it is 0 elsewhere. The ceiling temperature is:

$T_c = \frac{1}{k} + T_b$

It is also easy to see that the GR value is a second-order polynomial function of $$T - T_b$$ and, therefore, the curve is symmetric around the optimal temperature value, which can be derived as:

$T_o = \frac{T_c - T_b}{2} + T_b$

For this model, the self-starting function in drcSeedGerm is GRT.M(). The model can also be reparameterised to include the ceiling temperature as an explicit parameter:

$GR = \frac{\max \left[ T, T_b \right] - T_b}{\theta_{T}} \left[ 1 - \frac{\min \left[ T, T_c \right] - T_b}{T_c - T_b} \right]$ This reparameterised model is available as GRT.Mb().

# Sample code (not executed)
# Tval <- c(2, 5, 10, 15, 20, 25, 30, 35, 40)
# GR <- c(0, 0, 0.209, 0.435, 0.759, 0.821, 0.417, 0.145, 0)
# modM <- drm(GR ~ Tval, fct = GRT.Mb())
# plot(modM, log="", xlim = c(0, 40), ylim=c(0,1.2),
#      legendPos = c(5, 1.0), xlab = "Temperature (°C)")
# coeftest(modM, vcov. = sandwich)

Go up

## GRT.Ex()

All the equations above use a product, wherein the first term represents the accumulation of thermal time and the second term may be seen as a switch-off term that is 1 either when $$T < T_o$$ (Alvarado-Bradford equation) or $$T < T_d$$ (Rowse-Fintch-Savage equation) or $$T = T_b$$ (Mesgaran equation) and decreases progressively as temperature increases. In all the above equations, the switch-off term is linear, although we can use other types of switch-off terms, to obtain more flexible models. One possibility is to use an exponential switch-off term, as in the equation below:

$GR = \frac{\max \left[T, T_b \right] - T_b}{\theta_T} \left\{ \frac{1 - \exp \left[ k (\min \left[T, T_c \right] - T_c) \right]}{1 - \exp \left[ k (T_b - T_c) \right]} \right\}$

where $$k$$ is the switch-off parameter: the lower the value, the higher the negative effect of temperature at super-optimal levels. The response of GR to temperature is highly asymmetric with a slow increase below $$T_o$$ and a steep drop afterwards.

I have successfully used this model in Catara et al (2016) and Masin et al (2017). The self-starting function in R is GRT.Ex().

# Sample code
# Tval <- c(2, 5, 10, 15, 20, 25, 30, 35, 40)
# GR <- c(0, 0, 0.209, 0.435, 0.759, 0.821, 0.917, 0.445, 0)
#
# modExb <- drm(GR ~ Tval, fct = GRT.Ex())
# summary(modExb)
# plot(modExb, log="", xlim = c(0, 40), ylim=c(0,1.2),
#     legendPos = c(5, 1.0), xlab = "Temperature (°C)")

Go up

## GRT.YL()

Another switch-off function can be derived from the simple yield loss function devised by Kropff and van Laar (1993). It is very flexible, as it may depict different types of relationships between temperature and base water potential, according to the value taken by the parameter $$q$$.

$GR(g, T) = \frac{\max \left[T, T_b\right] - T_b}{\theta_T} \left( 1 - \frac{q \frac{\min \left[T, T_c\right] -T_b}{T_c- T_b} }{1 + (q-1) \frac{T-T_b}{T_c- T_b}} \right)$

In R, this model can be fitted by using the self-starter GRT.YL().

# sample code
# Tval <- c(2, 5, 10, 15, 20, 25, 30, 35, 40)
# GR <- c(0, 0, 0.209, 0.435, 0.759, 0.821, 0.917, 0.445, 0)
# modYL <- drm(GR ~ Tval, fct = GRT.YL())
# plot(modYL, log="", xlim = c(0, 40), ylim=c(0,1.2),
#      legendPos = c(5, 1.0), xlab = "Temperature (°C)")

Go up

2023 (6)
2022 (8)
2021 (16)
2020 (13)
2019 (14)
2018 (2)
2014 (1)
{"ft_lang_label":"__label__en","ft_lang_prob":0.7653965,"math_prob":0.9961329,"size":24600,"snap":"2023-14-2023-23","text_gpt3_token_len":7968,"char_repetition_ratio":0.11489673,"word_repetition_ratio":0.11371571,"special_character_ratio":0.36211383,"punctuation_ratio":0.20909262,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9986549,"pos_list":[0,1,2,3,4,5,6,7,8,9,10],"im_url_duplicate_count":[null,1,null,1,null,1,null,1,null,1,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2023-05-30T16:41:17Z\",\"WARC-Record-ID\":\"<urn:uuid:01c218aa-c5d9-4a84-9736-7d4c5d8a37c0>\",\"Content-Length\":\"45567\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:f78cd530-dc1c-4836-a67d-73fb8e534b7e>\",\"WARC-Concurrent-To\":\"<urn:uuid:960cc95a-a4ec-4e06-aa5a-45c1d07cc8d8>\",\"WARC-IP-Address\":\"34.148.79.160\",\"WARC-Target-URI\":\"https://www.statforbiology.com/2023/stat_drcte_12-htt2step/\",\"WARC-Payload-Digest\":\"sha1:UVTZSPQD4C2O4JQOVSUHC4FHYBCJJAOI\",\"WARC-Block-Digest\":\"sha1:PHXLJ64SMVW4GDS74LV2LQRRRL7DZK6M\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2023/CC-MAIN-2023-23/CC-MAIN-2023-23_segments_1685224646076.50_warc_CC-MAIN-20230530163210-20230530193210-00782.warc.gz\"}"}