knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width=6, fig.height=4 )
The soiltestcorr
-package also allows users to implement the quadrants analysis approach, also known as the Cate-Nelson analysis. This tutorial is intended to show how to deploy the cate_nelson_1965()
function for estimating critical soil test values based on Cate and Nelson (1965). This approach is also known as the "graphical" version of the Cate-Nelson analysis. This method applies an arbitrary fixed value of ry as a target (y-axis) that divides the data into two categories (below & equal or above ry target). In a second stage, it estimates the CSTV (x-axis) as the minimum stv that divides the data into four quadrants (target ry level combined with STV lower or greater than the CSTV) maximizing the number of points under well-classified quadrants (II, stv >= CSTV & ry >= ry target; and IV, stv < CSTV & ry < RY target).
i. Load your dataframe with soil test value (stv) and relative yield (ry) data.
ii. Specify the following arguments into the function -cate_nelson_1965()-:
(a). data
(optional),
(b). stv
(soil test value) and ry
(relative yield) columns or vectors,
(c). plot
TRUE (produces a ggplot as main output) or FALSE (DEFAULT, only produces a list or data.frame),
(d). tidy
TRUE (produces a data.frame with results) or FALSE (store results as list),
iii. Run and check results.
iv. Adjust plot as desired.
library(soiltestcorr)
Suggested packages
# Install if needed library(ggplot2) # Plots library(dplyr) # Data wrangling library(tidyr) # Data wrangling library(utils) # Data wrangling library(purrr) # Mapping
This is a basic example using three different datasets:
# Example 1 dataset # 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
RY target = 90%, replace with your desired value
tidy
= FALSE It returns a LIST (more efficient for multiple fits at once)
# Using dataframe argument, tidy = FALSE -> return a LIST fit_1_tidy_false <- soiltestcorr::cate_nelson_1965(data = data_1, ry = RY, stv = STV, target = 90, tidy = FALSE, plot = FALSE) utils::head(fit_1_tidy_false)
tidy
= TRUE It returns a data.frame (more organized results)
# Using dataframe argument, tidy = FALSE -> return a LIST fit_1_tidy_false <- soiltestcorr::cate_nelson_1965(data = data_1, ry = RY, stv = STV, target = 90, tidy = TRUE) utils::head(fit_1_tidy_false)
You can call stv
and ry
vectors using the $
.
The tidy
argument still applies for controlling the output type
fit_1_vectors_list <- soiltestcorr::cate_nelson_1965(ry = data_1$RY, stv = data_1$STV, target=90, tidy = FALSE) fit_1_vectors_tidy <- soiltestcorr::cate_nelson_1965(ry = data_1$RY, stv = data_1$STV, target=90, tidy = TRUE)
fit_2 <- soiltestcorr::cate_nelson_1965(data = data_2, ry = RY, stv = STV, target = 90, tidy = TRUE) utils::head(fit_2)
fit_3 <- soiltestcorr::cate_nelson_1965(data = data_3, ry = RY, stv = STK, target = 90, tidy = TRUE) utils::head(fit_3)
Note: the stv
column needs to have the same name for all datasets
# data.all <- dplyr::bind_rows(data_1, data_2, data_3 %>% dplyr::rename(STV = STK), .id = "id") %>% tidyr::nest(data = c("STV", "RY"))
# Run multiple examples at once with map() fit_multiple_map = data.all %>% dplyr::mutate(mod_alcc = purrr::map(data, ~ soiltestcorr::cate_nelson_1965(ry = .$RY, stv = .$STV, target=90, tidy = TRUE))) utils::head(fit_multiple_map)
Alternatively, with group_map, we do not require nested data.
However, it requires to dplyr::bind_rows and add an id
column specifying the name of each dataset.
This option return models as lists objects.
fit_multiple_group_map <- data.all %>% tidyr::unnest(data) %>% #dplyr::bind_rows(data_1, data_2, .id = "id") %>% dplyr::group_by(id) %>% dplyr::group_map(~ soiltestcorr::cate_nelson_1965(data = ., ry = RY, stv = STV, target = 90, tidy = TRUE)) utils::head(fit_multiple_group_map)
A suitable alternative for obtaining confidence intervals for parameters or derived quantities is bootstrapping.
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_cn65 <- boot_cn_1965(data = data_3, ry = RY, stv = STK, target = 90, n = 99) boot_cn65 %>% dplyr::slice_head(., n=5) # CSTV Confidence Interval quantile(boot_cn65$CSTV, probs = c(0.025, 0.5, 0.975)) # Plot boot_cn65 %>% ggplot2::ggplot(aes(x = CSTV))+ geom_histogram(color = "grey25", fill = "#9de0bf", bins = 10)
We can generate a ggplot with the same mod_alcc() function.
We just need to specify the argument plot = TRUE
.
soiltestcorr::cate_nelson_1965(data = data_1, ry = RY, stv = STV, target=90, plot = TRUE) soiltestcorr::cate_nelson_1965(data = data_2, ry = RY, stv = STV, target=90, plot = TRUE) soiltestcorr::cate_nelson_1965(data = data_3, ry = RY, stv = STK, target=90, plot = TRUE)
References
*Cate, R.B. Jr., and Nelson, L.A., 1965. A rapid method for correlation of soil test analysis with plant response data. North Carolina Agric. Exp. Stn., International soil Testing Series Bull. No. 1. *
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.