Analysing green manure decomposition, nutrient release and crop response

Overview

GreenManureR supports experiments in which a green manure or cover crop (Mucuna, sunhemp, dhaincha and others) is incorporated, its residues decompose in litterbags, nutrients are released, and one or more succeeding crops (for example kharif and rabi) respond. The package links these three stages:

  1. decomp_fit() and decomp_t50(): residue decomposition;
  2. nutrient_release(): N, P, K and other nutrient release;
  3. greenmanure_n_balance(): N inputs, crop uptake and apparent balance;
  4. carryover_effect(): residual effects on succeeding crops;
  5. gm_joint_analysis() and greenmanure_report(): integration and reporting.

The examples use simulated data (gm_litterbag, gm_agronomy) that mimic the structure of a real experiment.

head(gm_litterbag, 3)
#>   treatment rep time mass        N         P        K biomass_tha
#> 1    Mucuna   1    0  100 2.979516 0.2175153 1.813073         4.5
#> 2   Sunhemp   1    0  100 2.329112 0.1915362 1.496816         6.0
#> 3  Dhaincha   1    0  100 2.884645 0.2395456 2.080737         5.5
head(gm_agronomy, 3)
#>   treatment fert_N block season gm_biomass gm_N grain_yield straw_yield
#> 1   Control      0     1 Kharif   0.000000  0.0    3.483003    4.528098
#> 2    Mucuna      0     1 Kharif   4.462961  2.9    4.055969    5.221543
#> 3   Sunhemp      0     1 Kharif   6.605967  2.3    3.650730    4.449040
#>    grain_N   straw_N
#> 1 1.160408 0.4727329
#> 2 1.083382 0.4550292
#> 3 1.072889 0.4003541

Decomposition models

With \(M\) the percentage of initial mass remaining, three models are fitted per group and ranked by AICc:

fit <- decomp_fit(gm_litterbag, time = "time", mass = "mass", group = "treatment")
fit$table[fit$table$selected, c("treatment", "model", "k", "k_slow", "pool_A", "R2", "AICc")]
#>   treatment      model          k      k_slow    pool_A        R2     AICc
#> 2    Mucuna     double 0.05534686 0.003937137 0.5186680 0.9981959 105.0605
#> 6   Sunhemp asymptotic 0.03251040          NA        NA 0.9937364 133.4892
#> 8  Dhaincha     double 0.06455903 0.004476614 0.5539521 0.9971639 125.1666

The time to 50% mass loss uses the selected model, with a Monte-Carlo interval based on the covariance matrix of the nonlinear least squares fit:

decomp_t50(fit)
#>   treatment      model   p      t50      lwr      upr
#> 1    Mucuna     double 0.5 34.00462 33.25355 34.86049
#> 2   Sunhemp asymptotic 0.5 69.84544 66.70327 73.72187
#> 3  Dhaincha     double 0.5 26.05125 25.36616 26.81530
plot(fit)

Nutrient release

Nutrient remaining is mass x concentration / initial concentration, so values above 100% indicate net immobilization. Supplying the dry matter input (biomass, t/ha) also yields absolute release in kg/ha.

nr <- nutrient_release(gm_litterbag, nutrients = c("N", "P", "K"),
                       group = "treatment", biomass = "biomass_tha",
                       at = c(14, 30, 60))
nr$t50[, c("treatment", "nutrient", "model", "t50")]
#>     treatment nutrient  model      t50
#> N.1    Mucuna        N single 20.13608
#> N.2   Sunhemp        N single 25.27763
#> N.3  Dhaincha        N single 15.31434
#> P.1    Mucuna        P single 27.25638
#> P.2   Sunhemp        P single 34.46236
#> P.3  Dhaincha        P single 22.91757
#> K.1    Mucuna        K single  3.46431
#> K.2   Sunhemp        K single  3.81323
#> K.3  Dhaincha        K single  3.19321
subset(nr$release_at, nutrient == "N" & time == 30)
#>     treatment  model time nutrient remaining_pct released_pct released_kg_ha
#> N.2    Mucuna single   30        N      35.60463     64.39537       82.81938
#> N.5   Sunhemp single   30        N      43.92701     56.07299       76.57525
#> N.8  Dhaincha single   30        N      25.72158     74.27842      116.35267
plot(nr)

Nitrogen balance

nb <- greenmanure_n_balance(gm_agronomy, by = "season")
s <- nb$summary
s[s$fert_N == 0 & s$treatment != "Control",
  c("season", "treatment", "N_gm_input_mean", "N_uptake_mean", "ANR_mean", "NFRV_mean")]
#>    season treatment N_gm_input_mean N_uptake_mean  ANR_mean NFRV_mean
#> 2  Kharif    Mucuna        130.0612      65.03263 10.544030  57.54414
#> 3  Kharif   Sunhemp        146.3887      57.58448  4.229769  40.31416
#> 4  Kharif  Dhaincha        152.1420      60.21704  5.773539  46.18545
#> 14   Rabi    Mucuna        132.3036      76.42766  6.955677       NaN
#> 15   Rabi   Sunhemp        142.0985      73.28045  4.361954       NaN
#> 16   Rabi  Dhaincha        158.7326      77.58816  6.544048       NaN

ANR is the apparent N recovery from the green manure relative to the control at the same fertilizer N level. NFRV is the fertilizer N replacement value, obtained by inverting a quadratic response fitted to the control plots; it is NA when the yield lies outside the fitted range.

Residual effects on succeeding crops

co <- carryover_effect(gm_agronomy, response = "grain_yield", strata = "fert_N",
                       season_levels = c("Kharif", "Rabi"))
co$effects[co$effects$fert_N == 0,
           c("season", "treatment", "diff", "pct_change", "p_adj", "retention_vs_first")]
#>   season treatment      diff pct_change        p_adj retention_vs_first
#> 1 Kharif  Dhaincha 0.6460840   20.97387 0.0006141382          100.00000
#> 2 Kharif    Mucuna 0.7854164   25.49703 0.0002147292          100.00000
#> 3 Kharif   Sunhemp 0.5718379   18.56362 0.0007236459          100.00000
#> 4   Rabi  Dhaincha 0.4332381   16.78844 0.0165446597           67.05601
#> 5   Rabi    Mucuna 0.3119288   12.08757 0.0564379431           39.71508
#> 6   Rabi   Sunhemp 0.2628912   10.18731 0.0564379431           45.97302
co$pooled
#>   fert_N               term         F df1 df2            p
#> 1      0          treatment 19.526162   3  18 6.852818e-06
#> 2      0 treatment x season  2.867420   3  18 6.532786e-02
#> 3     60          treatment 34.025034   3  18 1.252912e-07
#> 4     60 treatment x season  7.937459   3  18 1.399908e-03
#> 5    120          treatment 12.853615   3  18 9.964931e-05
#> 6    120 treatment x season  1.766828   3  18 1.894973e-01

The treatment x season term in the pooled analysis tests whether the green manure effect changes between crops; retention_vs_first gives the second-crop effect as a percentage of the first-crop effect.

plot(co)

Joint analysis

ja <- suppressWarnings(
  gm_joint_analysis(fit, nr, nb, co, nutrient_name = "N", at_day = 60, fert_N_level = 0))
ja$data
#>   treatment      model     k_mass      t50 N_release_d60 N_gm_input      ANR
#> 1  Dhaincha     double 0.06455903 26.05125      93.38400   155.4373 6.158793
#> 2    Mucuna     double 0.05534686 34.00462      87.32310   131.1824 8.749853
#> 3   Sunhemp asymptotic 0.03251040 69.84544      80.70418   144.2436 4.295862
#>       NFRV yield_gain_pct_Kharif yield_gain_pct_Rabi
#> 1 46.18545              14.92144            9.753898
#> 2 57.54414              16.54269            8.378350
#> 3 40.31416              13.57742            5.931564

With only three species the rank correlations in ja$cor are descriptive; to draw inference, pool several sites or years.

Reporting

greenmanure_report() writes CSV tables, PNG figures and a Word report to a directory of your choice:

greenmanure_report(fit, nr, nb, co, ja, outdir = "gm_report")