knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width=6, fig.height=4 )
This tutorial demonstrates the quadratic_plateau()
function for fitting a continuous response model and estimating a critical soil test value (CSTV). This function fits a segmented regression model that follows two phases: a positive curvilinear response followed by a flat plateau phase. The join point is often interpreted as the CSTV. See Bullock and Bullock (1994) for example.$$
\begin{cases}
x < j,\ y = a + bx + cx^2 \
x > j,\ y = a + bj + cj^2
\end{cases}
$$
where\
y
represents the fitted crop relative yield\
x
the soil test value\
a
the intercept (ry
when stv
= 0)\
b
the linear slope (as the change in ry per unit of soil nutrient supply or nutrient added)\
c
the quadratic coefficient (giving the curve shape)\
j
the join point when the plateau phase starts (i.e., the CSTV).
This model is slightly more complex than the linear-plateau, but the curvature of the response is argued to be more biologically reasonably and economical useful. The quadratic_plateau()
function works automatically with self-starting initial values to facilitate the model convergence.
Disadvantages are that:
boot_quadratic_plateau()
function for a reliable confidence interval estimation of parameters via bootstrapping (resampling with replacement).Load your dataframe with soil test value and relative yield data.
Specify the following arguments into the function quadratic_plateau()
:
data
(optional)
stv
(soil test value)
ry
(relative yield) columns or vectors
target
(optional) for calculating the soil test value at some RY level along the slope segment.
tidy
TRUE
(produces a data.frame with results) or FALSE
(store results as list),
plot
TRUE
(produces a ggplot as main output) or FALSE
(no plot, only results as data.frame),
resid
TRUE
(produces plots with residuals analysis) or FALSE
(no plot)
Run and check results.
Check residuals plot, and warnings related to potential limitations of this model.
Adjust curve plots as desired with additional ggplot2
functions.
library(soiltestcorr)
Suggested packages
# Install if needed library(ggplot2) # Plots library(dplyr) # Data wrangling library(tidyr) # Data wrangling # library(utils) # Data wrangling # library(data.table) # Mapping library(purrr) # Mapping
This is a basic example using three different datasets:
# Native fake dataset from soiltestcorr package corr_df <- soiltestcorr::data_test
tidy
= TRUE (default)It returns a tidy data frame (more organized results)
quadratic_plateau(corr_df, STV, RY, tidy = TRUE)
tidy
= FALSEIt returns a LIST (may be more efficient for multiple fits at once)
quadratic_plateau(corr_df, STV, RY, tidy = FALSE)
You can use the stv
and ry
vectors from the data frame using the $
.
fit_vectors_tidy <- quadratic_plateau(stv = corr_df$STV, ry = corr_df$RY) fit_vectors_list <- quadratic_plateau(stv = corr_df$STV, ry = corr_df$RY, tidy = FALSE)
# Example 1. Fake dataset manually created data_1 <- data.frame("RY" = c(65,80,85,88,90,94,93,96,97,95,98,100,99,99,100), "STV" = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)) # Example 2. Native fake dataset from soiltestcorr package data_2 <- soiltestcorr::data_test # Example 3. Native dataset from soiltestcorr package, Freitas et al. (1966), used by Cate & Nelson (1971) data_3 <- soiltestcorr::freitas1966 %>% rename(STV = STK) data.all <- bind_rows(data_1, data_2, data_3, .id = "id")
Note: the stv
column needs to have the same name for all datasets if binding rows.
map()
# Run multiple examples at once with purrr::map() data.all %>% nest(data = c("STV", "RY")) %>% mutate(model = map(data, ~ quadratic_plateau(stv = .$STV, ry = .$RY))) %>% unnest(model)
group_modify()
Alternatively, with group_modify
, nested data is not required. However, it still requires a grouping variable (in this case, id
) to identify each dataset. group_map()
may also be used, though list_rbind()
is required to return a tidy data frame of the model results instead of a list.
data.all %>% group_by(id) %>% group_modify(~ quadratic_plateau(data = ., STV, RY))
Bootstrapping is a suitable method for obtaining confidence intervals for parameters or derived quantities. Bootstrapping is a resampling technique (with replacement) that draws samples from the original data with the same size. If you have groups within your data, you can specify grouping variables as arguments in order to maintain, within each resample, the same proportion of observations than in the original dataset.
This function returns a table with as many rows as the resampling size (n) containing the results for each resample.
boot_qp <- boot_quadratic_plateau(corr_df, STV, RY, n = 500) # only 500 for sake of speed boot_qp %>% head(n = 5) # CSTV Confidence Interval quantile(boot_qp$CSTV, probs = c(0.025, 0.5, 0.975)) # Plot boot_qp %>% ggplot2::ggplot(aes(x = CSTV))+ geom_histogram(color = "grey25", fill = "#9de0bf", bins = 10)
We can generate a ggplot with the same quadratic_plateau()
function.
We just need to specify the argument plot = TRUE
.
data_3 <- soiltestcorr::freitas1966 plot_qp <- quadratic_plateau(data = data_3, STK, RY, plot = TRUE) plot_qp
As ggplot object, plots can be adjusted in several ways, such as modifying titles and axis scales.
plot_qp + # Main title ggtitle("My own plot title")+ # Axis titles labs(x = "Soil Test K (ppm)", y = "Cotton RY(%)") + # Axis scales scale_x_continuous(limits = c(20,220), breaks = seq(0,220, by = 10))+ # Axis limits scale_y_continuous(limits = c(30, 110), breaks = seq(30, 110, by = 10))
Set the argument resid = TRUE
.
# Residuals plot quadratic_plateau(data = data_3, STK, RY, resid = TRUE)
Bullock, D.G. and Bullock, D.S. (1994), Quadratic and Quadratic-Plus-Plateau Models for Predicting Optimal Nitrogen Rate of Corn: A Comparison. Agron. J., 86: 191-195. 10.2134/agronj1994.00021962008600010033x
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.