Reproducing Didion-Gency et al. (2024) from Dryad dataset 4j0zpc8hz¶

Paper. Didion-Gency M, Vitasse Y, Buchmann N, Gessler A, Gisler J, Schaub M, Grossiord C (2024). Chronic warming and dry soils limit carbon uptake and growth despite a longer growing season in beech and oak. Plant Physiology 194, doi:10.1093/plphys/kiad565. The claims file was written from the version of record in Europe PMC (PMC10828195) with its supplement (Supplemental Figures S1 to S7, Tables S1 to S6, Methods S1 to S4); no figure was seen.

Dataset. doi:10.5061/dryad.4j0zpc8hz, version id 260590 in Dryad's API (version number 3, published 2023-10-17). The paper cites the dataset's DOI, which resolves to the latest version, and no version. Dryad lists only this one version, so it is pinned. Files read, with the SHA-256 that Dryad's file list gives and that the first cell checks:

File SHA-256
Dryad_Data_PlantPhy_MargauxDidionGency.xlsx b18a8e25527e2f5ecc80a9d520913b38eafb4382fe7e6c5e8ee7232e243300a3
Metadata.csv eaffc99d0e0a23c7e3bab236d4ecd951c92733cacbf9d7c8a57447a9b5ad0766

The dataset's README.md (the same text as the workbook's README sheet) is the third file of the version; the analysis does not use it. Dryad needs a token to download, so the files are staged before the notebook runs and read in place (docs/archives.md, "Dryad").

What the dataset holds. One table, one row per tree and measurement campaign: 96 trees (beech and oak, monocultures and mixtures, 6 per treatment, species and mixture, in 16 chambers), 3 campaigns a year in 2019 to 2021, with the yearly phenology, the treatment's mean air temperature per season, GDD and chilling days per tree, the leaf-level traits per campaign (Asat, sugar, starch, predawn and midday water potential) and the yearly height, diameter and AGWB increments. It has no soil moisture, no chamber climate records and no initial tree sizes.

Outside inputs. None. AGWB increments are in the dataset, so the coefficients of Annighofer et al. (2016) are not needed.

Claim Tested
fig1ab-bud-swelling-advance yes
fig1cd-development-duration yes
fig1gh-senescence-duration yes
fig1ij-growing-season yes
fig1-oak-steeper-advance yes
fig1ef-onset-senescence-no-temperature yes
figs1-phenology-no-moisture no, data missing
fig2-gdd-chilling yes
disc-max-chilling-days yes
fig3-psi-warming-2020 yes
fig3-psi-mr-oak-2020 yes
fig3-psi-wmr-2021 yes
disc-psi-minimum yes
fig4-beech-warming-none yes
fig4-oak-warming-growth-2021 yes
disc-oak-warming-no-carbon-change yes
fig4-beech-mr yes
fig4-oak-mr yes
fig4-beech-wmr yes
fig4-oak-wmr yes
fig4-wmr-same-as-mr yes
disc-nsc-unchanged-drier-soil yes
disc-beech-asat-more-impaired yes
tables6-no-seasonal-variation yes
tables2-phenology-no-interaction yes
tables3-beech-warming-no-interaction yes
figs2-beech-asat-selection-warming yes
tables3-oak-warming-diameter yes
fig5-oak-agwb-nbe-warming-2020 yes
tables3-beech-mr-diameter yes
fig5-beech-sugar-nbe-mr yes
oak-mr-no-interaction yes
tables3-beech-wmr-height yes
tables3-oak-wmr-diameter yes
fig5-oak-asat-nbe-wmr-2021 yes
methods-treatment-magnitudes no, data missing
fig6-soil-moisture-mr-equals-wmr no, data missing
tables5-annual-climate no, data missing
tables4-initial-sizes-similar no, data missing

Readings. Where the claims file leaves a detail open it names readings (P1/P2, T1/T2, S1/S2/S3, L1/L2, I1/I2, Y1/Y2, B1/B2, and for Table S6 y1/y2 and F1/F2). Every reading is run. A first run of this attempt asked three questions (questions/dryad-4j0zpc8hz.yaml); a reader answered them from the paper and the claims file was updated, and this version of the notebook follows the updated file. The paper does not say how negative values were square-rooted, so negative starch, sugar and Asat values are read as negative increments are, under S1 (untransformed), S2 (square root after adding the constant that brings the minimum to zero) and a new reading S3 (negative values dropped, as R's sqrt gives NaN for them). The interaction model takes the years of reading Y1 (bud swelling and development duration on 2020 and 2021, the other traits on 2019 to 2021, as the F and p pairs of Tables S2 and S3 imply), which the criteria use, with Y2 (2020 and 2021 for all traits) as a variant. The Table S6 model is run on 2019 to 2021 (y1) and on 2020 and 2021 (y2), with sequential (F1) and marginal (F2) F tests, all of which are readings of its criterion.

After the first verification round, three more questions were asked (questions/dryad-4j0zpc8hz.yaml): over which family the mixture against monoculture contrasts are adjusted, run here as A1 (each contrast alone) and A2 (single-step over the contrasts of the model); whether Eqs. 3 and 4 are to be read so that the complementarity effect is twice the NBE and the selection effect is 0 under B1; and whether growing season length is the deposited Growth_length or bud swelling to onset of senescence. Two variants that are not readings of the claims file are also shown: the regressions of reading P1 with a random intercept per treatment and year, and the Table S6 F values set against the paper's.

In [1]:
import time
import warnings

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import oaktrees as o

pd.set_option("display.width", 220)
pd.set_option("display.max_columns", 40)
pd.set_option("display.max_rows", 400)
warnings.filterwarnings("ignore")
started = time.time()

print(f"Dryad dataset {o.DOI}, version id {o.VERSION_ID}; files read in place from {o.data_dir()}")
print(o.check_files().to_string(index=False))
workbook = o.read_workbook()
metadata = o.read_metadata()
raw = workbook["Total Data"]
d = o.load(raw)
ty = o.tree_year_table(d)          # one row per tree and year (leaf-level traits: yearly tree means, L1)
ca = o.campaign_table(d)           # one row per tree and campaign (L2)
print(f"loaded in {time.time() - started:.1f} s")
Dryad dataset 10.5061/dryad.4j0zpc8hz, version id 260590; files read in place from /tmp/dryad/4j0zpc8hz/260590
                                       file  bytes                                                           sha256  matches_dryad
Dryad_Data_PlantPhy_MargauxDidionGency.xlsx 180851 b18a8e25527e2f5ecc80a9d520913b38eafb4382fe7e6c5e8ee7232e243300a3           True
                               Metadata.csv   2316 eaffc99d0e0a23c7e3bab236d4ecd951c92733cacbf9d7c8a57447a9b5ad0766           True
loaded in 0.4 s

Data check¶

Each check of the description against the values is stated under its output. The dataset has no time series (no chamber climate records), so there is no clock to align; the only time variables are the year and the campaign number.

In [2]:
print("Sheets of the workbook:", {k: v.shape for k, v in workbook.items()})
print("\nColumns of 'Total Data':", list(raw.columns))
print("\nMetadata.csv entries:", list(metadata["Entry"].str.strip()))
print("Columns named in Metadata.csv but not in the sheet:", sorted(set(metadata["Entry"].str.strip()) - set(raw.columns)))
print("Columns of the sheet not in Metadata.csv:", sorted(set(raw.columns) - set(metadata["Entry"].str.strip())))
print("\nTreatment codes in the data:", raw["Treatment"].value_counts().sort_index().to_dict())
print("Metadata.csv says:", metadata.loc[metadata.Entry.str.strip() == "Treatment", "Explaination"].iloc[0])
print(pd.crosstab(raw["Treatment"], [raw["Warming"], raw["Soil moisture reduction"]]))
print("\nRows:", len(raw), "; exact duplicate rows:", int(raw.duplicated().sum()),
      "; trees with duplicates:", sorted(raw[raw.duplicated(keep=False)].Tree.unique().tolist()))
dup = d[d.duplicated(["Tree", "Year", "Campaign"], keep=False)]
print("Rows left with the same tree, year and campaign after dropping exact duplicates:")
print(dup[["Tree", "Year", "Campaign", "Photo", "Sugar", "Starch", "Predawn", "Midday"]].to_string(index=False))
print("\nOne chamber, treatment, species and mixture per tree:",
      bool((d.groupby("Tree")[["Chamber", "treat", "Species", "Mixture", "Compartment"]].nunique() == 1).all().all()))
trees = d.drop_duplicates("Tree")
print("\nTrees per treatment, mixture and species (paper: 6 each, 96 in all):")
print(pd.crosstab([trees.treat, trees.Mixture], trees.Species))
print("\nChambers per treatment (paper: 4):", trees.groupby("treat").Chamber.nunique().to_dict())
print("\nCampaigns per year:", d.groupby("Year").Campaign.unique().apply(sorted).to_dict())
print("Tree-campaign rows per year, species and mixture:")
print(pd.crosstab([ca.Year], [ca.Species, ca.Mixture]))
Sheets of the workbook: {'README.md': (38, 13), 'Total Data': (900, 28)}

Columns of 'Total Data': ['Tree', 'Year', 'Campaign', 'Chamber', 'Treatment', 'Warming', 'Soil moisture reduction', 'Compartment', 'Mixture', 'Species', 'Flush_S1', 'Dev_time', 'Senes_10', 'Senes_time', 'Growth_length', 'Tspring', 'Tfall', 'Tannual', 'GDD', 'Chill_days', 'Photo', 'Sugar', 'Starch', 'Predawn', 'Midday', 'Height_growth', 'Diameter_growth', 'AGB_growth']

Metadata.csv entries: ['Tree', 'Year', 'Campaign', 'Chamber', 'Treatment', 'Warming', 'Soil moisture reduction', 'Compartment', 'Mixture', 'Species', 'Flush_S1', 'Dev_time', 'Senes_10', 'Senes_time', 'Growth_length', 'Tspring', 'Tfall', 'Tannual', 'GDD', 'Chill_days', 'Photo', 'Sugar', 'Starch', 'Predawn', 'Midday', 'Height_growth', 'Diameter_growth', 'AGB_growth']
Columns named in Metadata.csv but not in the sheet: []
Columns of the sheet not in Metadata.csv: []

Treatment codes in the data: {'C': 219, 'D': 234, 'H': 231, 'HD': 216}
Metadata.csv says: Treatment type (C: control, W: warming, MR: soil moisture reduction, WMR: warming + soil moisture reduction) 
Warming                   NO       YES     
Soil moisture reduction   NO  YES   NO  YES
Treatment                                  
C                        219    0    0    0
D                          0  234    0    0
H                          0    0  231    0
HD                         0    0    0  216

Rows: 900 ; exact duplicate rows: 35 ; trees with duplicates: [17, 35, 45, 144]
Rows left with the same tree, year and campaign after dropping exact duplicates:
 Tree  Year  Campaign     Photo    Sugar   Starch  Predawn  Midday
  144  2020         5 13.657881 7.707043 4.993148    -0.26   -1.79
  144  2020         5 13.657881 6.691816 9.989399    -0.26   -1.79

One chamber, treatment, species and mixture per tree: True

Trees per treatment, mixture and species (paper: 6 each, 96 in all):
Species            B  O
treat Mixture          
C     Mixture      6  6
      Monoculture  6  6
MR    Mixture      6  6
      Monoculture  6  6
W     Mixture      6  6
      Monoculture  6  6
WMR   Mixture      6  6
      Monoculture  6  6

Chambers per treatment (paper: 4): {'C': 4, 'MR': 4, 'W': 4, 'WMR': 4}

Campaigns per year: {2019: [np.int64(1), np.int64(2), np.int64(3)], 2020: [np.int64(4), np.int64(5), np.int64(6)], 2021: [np.int64(7), np.int64(8), np.int64(9)]}
Tree-campaign rows per year, species and mixture:
Species       B                   O            
Mixture Mixture Monoculture Mixture Monoculture
Year                                           
2019         72          72      72          72
2020         72          72      72          72
2021         72          72      72          72

The metadata name the treatments C, W, MR and WMR; the data use C, D, H and HD. The Warming and Soil moisture reduction columns map them one to one: H is warming (W), D is moisture reduction (MR) and HD both (WMR). The analysis uses the paper's names, from those two columns. 35 rows repeat another row exactly (trees 17, 35, 45 and 144). They are counted once. Tree 144 also has two different rows for campaign 5 of 2020 (same Asat and water potentials, different sugar and starch), which are averaged. The design matches the paper: 96 trees, 6 per treatment, species and mixture, 4 chambers per treatment, 3 campaigns a year in 2019 to 2021.

In [3]:
cols = ["Flush_S1", "Dev_time", "Senes_10", "Senes_time", "Growth_length", "Tspring", "Tfall", "Tannual", "GDD",
        "Chill_days", "Photo", "Sugar", "Starch", "Predawn", "Midday", "Height_growth", "Diameter_growth", "AGB_growth"]
units = metadata.set_index(metadata.Entry.str.strip())["Unit"]
rng = pd.DataFrame({"unit": units.reindex(cols), "n": ca[cols].count(), "min": ca[cols].min(), "median": ca[cols].median(),
                    "max": ca[cols].max(), "n_negative": (ca[cols] < 0).sum(), "n_zero": (ca[cols] == 0).sum()})
print("Ranges over tree-campaign rows (yearly traits repeat on the three rows of a year):")
print(rng.round(3).to_string())
print("\nYearly traits constant within a tree and year:",
      bool((d.groupby(["Tree", "Year"])[o.YEARLY].nunique() <= 1).all().all()))
clim = d.groupby(["Year", "treat"])[["Tspring", "Tfall", "Tannual"]].agg(["nunique", "first"])
print("\nTspring, Tfall and Tannual per year and treatment (number of distinct values, value):")
print(clim.round(3).to_string())
print("Distinct values per year and chamber:", int(d.groupby(["Year", "Chamber"])[["Tspring", "Tfall", "Tannual"]].nunique().max().max()))
Ranges over tree-campaign rows (yearly traits repeat on the three rows of a year):
                      unit    n      min   median      max  n_negative  n_zero
Flush_S1               DOY  816   64.000   99.000  119.000           0       0
Dev_time              days  780    2.000   10.000   26.000           0       0
Senes_10               DOY  858  250.000  262.000  291.000           0       0
Senes_time            days  858    7.000   49.000   94.000           0       0
Growth_length         days  813  178.000  217.000  299.000           0       0
Tspring                 °C  816    6.679    9.047   14.245           0       0
Tfall                   °C  858    8.617   11.637   14.547           0       0
Tannual                 °C  813   10.468   11.994   16.896           0       0
GDD                °C days  816  123.700  209.330  613.326           0       0
Chill_days            days  816   12.000   82.000   97.000           0       0
Photo            µmol/m²/s  858   -0.289    4.645   24.111           5       0
Sugar                    %  852   -4.063    5.250   13.991           3       0
Starch                   %  852   -6.283    3.456   31.598          77       0
Predawn                Mpa  860   -3.500   -0.525   -0.050         860       0
Midday                 MPa  860   -8.300   -1.955    0.000         858       2
Height_growth           cm  861  -12.500    9.000  103.000          30      42
Diameter_growth         cm  858   -2.290    0.550    4.460          90       6
AGB_growth            g DW  858    0.000    4.907   88.328           0     180

Yearly traits constant within a tree and year: True

Tspring, Tfall and Tannual per year and treatment (number of distinct values, value):
           Tspring           Tfall         Tannual        
           nunique   first nunique   first nunique   first
Year treat                                                
2019 C           1   6.894       1   9.421       1  11.131
     MR          1   6.901       1   9.585       1  11.276
     W           1   6.939       1  14.547       1  14.280
     WMR         1   6.934       1  14.436       1  14.183
2020 C           1   9.047       1   8.861       1  11.719
     MR          1   9.313       1   9.049       1  11.994
     W           1  14.245       1  13.977       1  16.896
     WMR         1  14.125       1  13.843       1  16.729
2021 C           1   6.679       1   8.617       1  10.468
     MR          1   6.918       1   8.814       1  10.720
     W           1  11.927       1  13.814       1  15.670
     WMR         1  11.745       1  13.689       1  15.500
Distinct values per year and chamber: 1

Ranges and units are plausible for the phenology dates (days of year 64 to 291) and durations. The air temperatures are one value per treatment and year, the same in the four chambers of a treatment: the dataset gives no chamber climate, and the sensor height (50 cm or 2 m) is not stated. Starch (77 rows), sugar (3) and Asat (5) have negative values, which a concentration or a light-saturated assimilation rate cannot have. Height increments are negative in 30 rows and diameter increments in 90, which a shrinking stem can give only within measurement error. Soil moisture, the chamber climate records (daily air temperature, VPD, soil water content), the initial heights and diameters (Table S4) and the absolute heights, diameters and AGWB are not in the dataset.

In [4]:
y = ty[ty.Year >= 2020]
desc = metadata.assign(Entry=metadata.Entry.str.strip()).set_index("Entry")
readme = workbook["README.md"]
readme = readme.set_index(readme.columns[1])
print("How the dataset describes the derived variables (Metadata.csv; the workbook's README sheet):")
for col in ("Growth_length", "GDD", "Chill_days"):
    print(f"  {col} [{desc.loc[col, 'Unit']}]: {desc.loc[col, 'Explaination']}")
    print(f"  {'':{len(col)}}  README sheet: {readme.loc[col].iloc[3]}")
print("The Dryad README.md file holds the title, the citation and a contact; it describes no column.\n")
calc = y.Senes_10 - y.Flush_S1
print("Growing season length against the Methods' definition (onset of senescence minus bud swelling):")
print(f"  rows with both: {int(calc.notna().sum())}; equal: {int((calc == y.Growth_length).sum())}; "
      f"median of Growth_length - (Senes_10 - Flush_S1): {np.nanmedian(y.Growth_length - calc):.1f} days")
end90 = y.Senes_10 + y.Senes_time - y.Flush_S1
print(f"  against the end of senescence (10% date + duration) minus bud swelling: equal in {int((end90 == y.Growth_length).sum())}, "
      f"median difference {np.nanmedian(y.Growth_length - end90):.1f} days, range {np.nanmin(y.Growth_length - end90):.0f} to {np.nanmax(y.Growth_length - end90):.0f}")
print("\nOnset of senescence at its minimum (DOY 250 to 252):", int((y.Senes_10 <= 252).sum()), "of", int(y.Senes_10.notna().sum()), "tree-years")
print("\nDiameter increments (column unit 'cm'), monocultures and mixtures, tree-years 2020-21:")
print(y.Diameter_growth.describe().round(3).to_string())
print("Paper, Table S4: initial diameters of 5.2 to 6.1 mm.")
comp = d.drop_duplicates("Tree").groupby(["Chamber", "Compartment"]).apply(
    lambda g: "+".join(sorted(f"{s}-{m[:4]}" for s, m in zip(g.Species, g.Mixture))))
odd = comp[comp.str.contains("Mono") & comp.str.contains("Mixt")]
print("\nCompartments holding both a monoculture tree and a mixture tree:", len(odd), "of", len(comp))
print(odd.to_string())
agb0 = y[(y.AGB_growth == 0)]
print("\nAGWB increment exactly 0 in", len(agb0), "of", int(y.AGB_growth.notna().sum()), "tree-years 2020-21; their height increments:",
      agb0.Height_growth.describe().round(1).to_dict())
How the dataset describes the derived variables (Metadata.csv; the workbook's README sheet):
  Growth_length [days]: Growing season length
                 README sheet: Growing season length
  GDD [°C days]: Growing degree day requirement (i.e., accumulated the daily mean temperature above a threshold of 5°C from January 1st to the date of bud swelling)
       README sheet: Growing degree day requirement (i.e., accumulated the daily mean temperature above a threshold of 5°C from January 1st to the date of bud swelling)
  Chill_days [days]: Chilling days (i.e., days with average temperature somewhat below 5-10°C from the November 1st to the date of leaf flushing) 
              README sheet: Chilling days (i.e., days with average temperature somewhat below 5-10°C from the November 1st to the date of leaf flushing) 
The Dryad README.md file holds the title, the citation and a contact; it describes no column.

Growing season length against the Methods' definition (onset of senescence minus bud swelling):
  rows with both: 191; equal: 0; median of Growth_length - (Senes_10 - Flush_S1): 55.0 days
  against the end of senescence (10% date + duration) minus bud swelling: equal in 0, median difference 7.0 days, range 2 to 33

Onset of senescence at its minimum (DOY 250 to 252): 48 of 191 tree-years

Diameter increments (column unit 'cm'), monocultures and mixtures, tree-years 2020-21:
count    191.000
mean       0.680
std        0.957
min       -2.290
25%        0.120
50%        0.420
75%        1.055
max        4.460
Paper, Table S4: initial diameters of 5.2 to 6.1 mm.

Compartments holding both a monoculture tree and a mixture tree: 4 of 76
Chamber  Compartment
A3       6              B-Mono+O-Mixt
A4       6              B-Mono+O-Mixt
B3       6              B-Mono+O-Mixt
B4       6              B-Mono+O-Mixt

AGWB increment exactly 0 in 57 of 191 tree-years 2020-21; their height increments: {'count': 57.0, 'mean': 7.2, 'std': 14.9, 'min': -12.5, '25%': 0.0, '50%': 5.0, '75%': 10.0, 'max': 103.0}

Growth_length never equals onset of senescence minus bud swelling, the Methods' definition of growing season length; it is close to the end of senescence (10% date plus senescence duration) minus bud swelling, but not equal to it either. The deposited Growth_length is used, as the claims file names the dataset's growing season length; the Methods' definition is shown as a variant in fig1ij. The onset of senescence sits at day 250 to 252 in many tree-years: the observations began in September, so these values are censored at the first observation. Diameter increments of a median of about 0.5 "cm" a year on stems of about 6 mm are implausible; the values are consistent with millimetres. Some compartments hold a monoculture tree of one species and a mixture tree of the other, which the design (each compartment a monoculture or a mixture) does not allow; the compartment labels are not used. AGWB increments are 0 in many tree-years whose height increment is positive.

The deposited data against the paper's Table S1¶

Table S1 gives F tests of the treatment model. This check refits it on 2019 to 2021 (as the table does), on yearly tree means (L1) and on campaign values (L2), and gives both the sequential tests (the claims file's reading) and the marginal ones, for traits whose values have no negatives, where the square root is defined. It is a check of the data and of the model code, and decides no outcome.

In [5]:
TABLE_S1 = {   # Supplemental Table S1, F values in the order W, MR, Y, W:MR, W:Y, MR:Y, W:MR:Y
    ("B", "Photo"): [2.44, 0.99, 25.86, 4.12, 5.22, 19.00, 2.75],
    ("O", "Photo"): [0.00, 2.70, 3.41, 0.17, 1.02, 0.66, 1.58],
    ("B", "AGB_growth"): [0.17, 0.04, 1.75, 0.09, 0.19, 2.83, 1.08],
    ("O", "AGB_growth"): [0.33, 0.93, 5.05, 0.89, 1.62, 7.27, 1.04],
    ("B", "Predawn"): [2.83, 0.10, 0.25, 0.00, 2.12, 0.12, 3.54],
    ("O", "Predawn"): [0.34, 0.07, 7.95, 2.34, 0.90, 1.70, 3.59],
    ("B", "Midday"): [0.96, 0.06, 6.50, 0.04, 2.10, 0.27, 0.97],
    ("O", "Midday"): [0.50, 0.04, 2.25, 0.00, 0.35, 0.95, 0.42],
}
rows = []
for (sp, trait), paper in TABLE_S1.items():
    sq = trait not in ("Predawn", "Midday")
    for L, data in (("L1", ty), ("L2", ca)):
        r = o.treatment_test(data, sp, trait, [2019, 2020, 2021], sq, "S1")
        for kind in ("anova", "anova_marginal"):
            F = r[kind].F.round(2).tolist()
            rows.append({"species": sp, "trait": trait, "L": L, "tests": "sequential" if kind == "anova" else "marginal",
                         "n": r["n"], "F": F, "max_abs_diff": float(np.max(np.abs(np.array(F) - paper)))})
link = pd.DataFrame(rows)
print(link.to_string(index=False))
best = link.loc[link.groupby(["species", "trait"]).max_abs_diff.idxmin()]
print("\nClosest version per trait:")
print(best[["species", "trait", "L", "tests", "max_abs_diff"]].to_string(index=False))
species      trait  L      tests   n                                             F  max_abs_diff
      B      Photo L1 sequential  72   [0.75, 34.0, 9.59, 0.47, 2.29, 16.74, 1.99]         33.01
      B      Photo L1   marginal  72  [2.26, 1.03, 18.97, 3.29, 3.95, 15.05, 1.99]          6.89
      B      Photo L2 sequential 215  [0.86, 34.03, 13.1, 0.78, 2.86, 19.99, 2.74]         33.04
      B      Photo L2   marginal 215    [2.43, 1.0, 25.72, 4.11, 5.2, 18.75, 2.74]          0.25
      O      Photo L1 sequential  72    [0.2, 58.13, 3.83, 1.36, 1.04, 6.01, 1.35]         55.43
      O      Photo L1   marginal  72    [0.06, 3.72, 2.64, 0.38, 0.84, 1.02, 1.35]          1.02
      O      Photo L2 sequential 215     [0.15, 71.02, 5.8, 2.02, 1.33, 6.23, 1.5]         68.32
      O      Photo L2   marginal 215       [0.05, 4.13, 3.7, 0.3, 1.35, 0.89, 1.5]          1.43
      B AGB_growth L1 sequential  72    [0.48, 1.93, 4.55, 1.67, 0.38, 3.61, 0.89]          2.80
      B AGB_growth L1   marginal  72    [0.16, 0.02, 1.71, 0.11, 0.19, 2.62, 0.89]          0.21
      B AGB_growth L2 sequential 216    [0.72, 0.94, 18.87, 0.85, 1.6, 15.0, 3.69]         17.12
      B AGB_growth L2   marginal 216    [0.32, 0.0, 7.12, 0.33, 0.78, 10.87, 3.69]          8.04
      O AGB_growth L1 sequential  72  [1.75, 28.82, 4.62, 2.77, 1.11, 10.49, 1.04]         27.89
      O AGB_growth L1   marginal  72    [0.33, 0.93, 5.05, 0.89, 1.62, 7.27, 1.04]          0.00
      O AGB_growth L2 sequential 216 [2.37, 27.23, 18.38, 2.97, 4.42, 41.75, 4.13]         34.48
      O AGB_growth L2   marginal 216  [0.84, 1.43, 20.12, 1.62, 6.43, 28.92, 4.13]         21.65
      B    Predawn L1 sequential  72    [16.84, 0.21, 2.01, 0.0, 0.68, 1.71, 2.91]         14.01
      B    Predawn L1   marginal  72     [1.15, 0.03, 0.47, 0.08, 2.27, 0.2, 2.91]          1.68
      B    Predawn L2 sequential 215    [17.7, 0.36, 2.17, 0.02, 0.73, 1.93, 3.35]         14.87
      B    Predawn L2   marginal 215     [1.34, 0.04, 0.6, 0.11, 2.39, 0.26, 3.35]          1.49
      O    Predawn L1 sequential  72    [8.18, 10.76, 5.31, 0.84, 1.54, 2.74, 3.5]         10.69
      O    Predawn L1   marginal  72     [0.14, 0.02, 3.95, 1.17, 0.45, 0.94, 3.5]          4.00
      O    Predawn L2 sequential 216   [8.05, 10.24, 7.35, 0.94, 2.13, 3.79, 4.84]         10.17
      O    Predawn L2   marginal 216     [0.16, 0.02, 5.46, 1.49, 0.62, 1.3, 4.84]          2.49
      B     Midday L1 sequential  72    [8.72, 6.11, 19.13, 0.18, 4.18, 3.58, 2.0]         12.63
      B     Midday L1   marginal  72      [0.0, 0.45, 1.73, 0.73, 5.89, 0.15, 2.0]          4.77
      B     Midday L2 sequential 215      [7.9, 5.48, 9.34, 0.22, 2.07, 1.8, 1.03]          6.94
      B     Midday L2   marginal 215     [0.0, 0.28, 0.86, 0.42, 2.99, 0.08, 1.03]          5.64
      O     Midday L1 sequential  72     [2.9, 2.13, 10.9, 0.38, 0.54, 1.78, 0.75]          8.65
      O     Midday L1   marginal  72     [0.57, 0.05, 3.78, 0.0, 0.59, 1.64, 0.75]          1.53
      O     Midday L2 sequential 216    [2.78, 1.99, 6.45, 0.51, 0.32, 1.05, 0.44]          4.20
      O     Midday L2   marginal 216      [0.5, 0.04, 2.24, 0.0, 0.35, 0.97, 0.44]          0.02

Closest version per trait:
species      trait  L    tests  max_abs_diff
      B AGB_growth L1 marginal          0.21
      B     Midday L1 marginal          4.77
      B      Photo L2 marginal          0.25
      B    Predawn L2 marginal          1.49
      O AGB_growth L1 marginal          0.00
      O     Midday L2 marginal          0.02
      O      Photo L1 marginal          1.02
      O    Predawn L2 marginal          2.49

The marginal tests on the deposited data reproduce Table S1 for oak AGWB increment exactly (largest difference in F 0.00, yearly tree means), for beech Asat closely (0.25, campaign values) and for oak midday water potential within 0.02 (campaign values). The sequential tests, which the claims file names, differ from the table by up to 68 in F. Other traits match less well. This is consistent with the deposited data being the paper's data and with the paper's F tests being marginal; it decides no outcome, and the question is asked (questions/dryad-4j0zpc8hz.yaml). The criteria below rest on the contrasts, which do not depend on how the F tests are taken.

Phenology regressions (Figure 1)¶

Phenology regression of the claims file: per species, monoculture trees, 2020 and 2021 pooled, a linear regression of the trait on the season's air temperature. Reading P1 is each tree and year against the temperature of its chamber; the dataset gives the temperature per treatment and year only, so P1 here uses the treatment's value (the same in its four chambers). Reading P2 is the eight treatment and year means. The sensor readings H1 and H2 cannot be told apart: the dataset gives one temperature and does not say which sensor it comes from.

In [6]:
import statsmodels.formula.api as smf

mono = ty[(ty.Mixture == "Monoculture") & ty.Year.isin([2020, 2021])]

def pheno(trait, temp):
    rows = []
    for sp in ("B", "O"):
        s = mono[mono.Species == sp].dropna(subset=[trait, temp])
        r1 = o.linear_fit(s[temp], s[trait])
        m = s.groupby(["treat", "Year"])[[trait, temp]].mean()
        r2 = o.linear_fit(m[temp], m[trait])
        rows += [{"species": sp, "reading": "P1", **r1}, {"species": sp, "reading": "P2", **r2}]
    return pd.DataFrame(rows)

def within(v, target, tol):
    return abs(v - target) <= tol + 1e-12

def judge_slopes(tab, targets):
    out = []
    for reading, g in tab.groupby("reading"):
        g = g.set_index("species")
        ok = all(within(g.loc[sp, "slope"], targets[sp][0], targets[sp][1]) and g.loc[sp, "p"] <= 0.05 for sp in "BO")
        out.append({"reading": reading, "slopes": g.slope.round(3).to_dict(), "p": g.p.map(lambda v: f"{v:.2g}").to_dict(),
                    "all_within_and_p<=0.05": ok})
    return pd.DataFrame(out)

def pheno_re(trait, temp):
    """Variant of P1 (not a reading of the claims file): each tree-year, with a random intercept per treatment
    and year, as the temperature is one value per treatment and year (REML, Wald z of the slope)."""
    rows = []
    for sp in ("B", "O"):
        s = mono[mono.Species == sp].dropna(subset=[trait, temp]).assign(g=lambda f: f.treat + f.Year.astype(str))
        f = smf.mixedlm(f"{trait} ~ {temp}", s, groups=s.g).fit(reml=True)
        rows.append({"species": sp, "reading": "P1 + random treatment-year", "slope": f.params[temp], "se": f.bse[temp],
                     "p": f.pvalues[temp], "n": len(s), "groups": s.g.nunique(), "converged": f.converged})
    return pd.DataFrame(rows)

PH, PHRE = {}, {}
for cid, trait, temp in [("fig1ab", "Flush_S1", "Tspring"), ("fig1cd", "Dev_time", "Tspring"), ("fig1ef", "Senes_10", "Tfall"),
                         ("fig1gh", "Senes_time", "Tfall"), ("fig1ij", "Growth_length", "Tannual")]:
    PH[cid] = pheno(trait, temp)
    PHRE[cid] = pheno_re(trait, temp)
print("Monoculture tree-years with data, 2020-21:", mono.groupby("Species")[["Flush_S1", "Dev_time", "Senes_10", "Senes_time", "Growth_length"]].count().to_dict("index"))
print("Temperature ranges (deg C):", {t: (round(mono[t].min(), 2), round(mono[t].max(), 2)) for t in ("Tspring", "Tfall", "Tannual")})
Monoculture tree-years with data, 2020-21: {'B': {'Flush_S1': 48, 'Dev_time': 48, 'Senes_10': 48, 'Senes_time': 48, 'Growth_length': 48}, 'O': {'Flush_S1': 48, 'Dev_time': 48, 'Senes_10': 48, 'Senes_time': 48, 'Growth_length': 48}}
Temperature ranges (deg C): {'Tspring': (np.float64(6.68), np.float64(14.25)), 'Tfall': (np.float64(8.62), np.float64(13.98)), 'Tannual': (np.float64(10.47), np.float64(16.9))}

fig1ab-bud-swelling-advance¶

Warmer spring air advanced bud swelling in both species, by 1.1 days per degree in beech and 2.3 days per degree in oak, across 2020 and 2021 and the four treatments.

In [7]:
print(PH["fig1ab"].round(4).to_string(index=False))
print(judge_slopes(PH["fig1ab"], {"B": (-1.1, 0.11), "O": (-2.3, 0.23)}).to_string(index=False))
fig, axes = plt.subplots(1, 2, figsize=(8, 3))
for ax, sp in zip(axes, "BO"):
    s = mono[mono.Species == sp]
    ax.scatter(s.Tspring, s.Flush_S1, s=8)
    ax.set_title(sp); ax.set_xlabel("Tspring (C)"); ax.set_ylabel("bud swelling (DOY)")
plt.tight_layout(); plt.show()
print("Plotted ranges: Tspring", round(mono.Tspring.min(), 2), "to", round(mono.Tspring.max(), 2), "; DOY", mono.Flush_S1.min(), "to", mono.Flush_S1.max())
print("\nVariant, P1 with a random intercept per treatment and year:")
print(PHRE["fig1ab"].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
species reading   slope  intercept     r2      p  n
      B      P1 -1.0782   110.6963 0.2796 0.0001 48
      B      P2 -1.0782   110.6963 0.5573 0.0334  8
      O      P1 -2.2961   117.9625 0.5093 0.0000 48
      O      P2 -2.2961   117.9625 0.6954 0.0101  8
reading                     slopes                                p  all_within_and_p<=0.05
     P1 {'B': -1.078, 'O': -2.296} {'B': '0.00011', 'O': '1.2e-08'}                    True
     P2 {'B': -1.078, 'O': -2.296}      {'B': '0.033', 'O': '0.01'}                    True
No description has been provided for this image
Plotted ranges: Tspring 6.68 to 14.25 ; DOY 78.0 to 113.0

Variant, P1 with a random intercept per treatment and year:
species                    reading  slope     se         p  n  groups  converged
      B P1 + random treatment-year -1.078 0.3923  0.005989 48       8       True
      O P1 + random treatment-year -2.296 0.6204 0.0002147 48       8       True

Result: reproduced. Bud swelling advances by 1.08 days per degree in beech (P1 p = 0.00011, P2 p = 0.033) and 2.30 in oak (P1 p = 1.2e-08, P2 p = 0.010), both within tolerance under both readings. The slopes are the same under P1 and P2 because every treatment and year has six trees; P1 uses the treatment's temperature, as the dataset has no chamber value. With a random intercept per treatment and year added to P1 (a variant), p = 0.0060 (beech) and 0.0002 (oak).

fig1cd-development-duration¶

Warmer spring air shortened leaf development duration by 0.7 days per degree in both species.

In [8]:
print(PH["fig1cd"].round(4).to_string(index=False))
print(judge_slopes(PH["fig1cd"], {"B": (-0.7, 0.07), "O": (-0.7, 0.07)}).to_string(index=False))
print("\nVariant, P1 with a random intercept per treatment and year:")
print(PHRE["fig1cd"].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
species reading   slope  intercept     r2      p  n
      B      P1 -0.6514    17.7141 0.2102 0.0010 48
      B      P2 -0.6514    17.7141 0.5112 0.0462  8
      O      P1 -0.6593    16.9852 0.1675 0.0039 48
      O      P2 -0.6593    16.9852 0.2958 0.1635  8
reading                     slopes                             p  all_within_and_p<=0.05
     P1 {'B': -0.651, 'O': -0.659} {'B': '0.001', 'O': '0.0039'}                    True
     P2 {'B': -0.651, 'O': -0.659}   {'B': '0.046', 'O': '0.16'}                   False

Variant, P1 with a random intercept per treatment and year:
species                    reading   slope     se       p  n  groups  converged
      B P1 + random treatment-year -0.6514   0.26 0.01225 48       8       True
      O P1 + random treatment-year -0.6593 0.4153  0.1124 48       8       True

Result: reproduced. Development duration shortens by 0.65 days per degree in beech and 0.66 in oak, within 0.7 +- 0.07. Under P1 both regressions have P <= 0.05 (0.0010 and 0.0039); under P2 the oak regression does not (p = 0.16). The criterion needs one reading. P1 treats the 48 tree-years as independent although the temperature is one value per treatment and year; with a random intercept per treatment and year (a variant, not a reading of the claims file), oak has p = 0.11 and beech 0.012, so the oak result rests on P1 as the claims file gives it.

fig1gh-senescence-duration¶

Warmer fall air extended leaf senescence duration by 3.4 days per degree in beech and 3.1 days per degree in oak.

In [9]:
print(PH["fig1gh"].round(4).to_string(index=False))
print(judge_slopes(PH["fig1gh"], {"B": (3.4, 0.34), "O": (3.1, 0.31)}).to_string(index=False))
print("\nVariant, P1 with a random intercept per treatment and year:")
print(PHRE["fig1gh"].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
species reading  slope  intercept     r2      p  n
      B      P1 3.3963    11.6761 0.2925 0.0001 48
      B      P2 3.3963    11.6761 0.8069 0.0024  8
      O      P1 3.0842    15.7547 0.3223 0.0000 48
      O      P2 3.0842    15.7547 0.7470 0.0056  8
reading                   slopes                                p  all_within_and_p<=0.05
     P1 {'B': 3.396, 'O': 3.084} {'B': '7.2e-05', 'O': '2.6e-05'}                    True
     P2 {'B': 3.396, 'O': 3.084}   {'B': '0.0024', 'O': '0.0056'}                    True

Variant, P1 with a random intercept per treatment and year:
species                    reading  slope     se         p  n  groups  converged
      B P1 + random treatment-year  3.396 0.7787 1.293e-05 48       8       True
      O P1 + random treatment-year  3.084 0.6815 6.011e-06 48       8      False

Result: reproduced. Senescence duration lengthens by 3.40 days per degree in beech and 3.08 in oak, within tolerance, with P <= 0.0056 under both readings, and under the variant with a random intercept per treatment and year (p < 0.0001 in both species).

fig1ij-growing-season¶

Warmer annual air lengthened the growing season by 4.5 days per degree in beech and 5.7 days per degree in oak.

In [10]:
print(PH["fig1ij"].round(4).to_string(index=False))
print(judge_slopes(PH["fig1ij"], {"B": (4.5, 0.45), "O": (5.7, 0.57)}).to_string(index=False))
alt = mono.assign(GSL_methods=mono.Senes_10 - mono.Flush_S1)
rows = []
for sp in "BO":
    s = alt[alt.Species == sp].dropna(subset=["GSL_methods"])
    m = s.groupby(["treat", "Year"])[["GSL_methods", "Tannual"]].mean()
    rows += [{"species": sp, "reading": "P1", **o.linear_fit(s.Tannual, s.GSL_methods)},
             {"species": sp, "reading": "P2", **o.linear_fit(m.Tannual, m.GSL_methods)}]
print("\nVariant, growing season length as the Methods define it (Senes_10 - Flush_S1):")
print(pd.DataFrame(rows).round(4).to_string(index=False))
print("\nVariant, P1 with a random intercept per treatment and year:")
print(PHRE["fig1ij"].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
species reading  slope  intercept     r2      p  n
      B      P1 4.4599   157.2210 0.2789 0.0001 48
      B      P2 4.4599   157.2210 0.5511 0.0349  8
      O      P1 5.6519   155.8138 0.5443 0.0000 48
      O      P2 5.6519   155.8138 0.7882 0.0032  8
reading                  slopes                                p  all_within_and_p<=0.05
     P1 {'B': 4.46, 'O': 5.652} {'B': '0.00011', 'O': '2.2e-09'}                    True
     P2 {'B': 4.46, 'O': 5.652}    {'B': '0.035', 'O': '0.0032'}                    True

Variant, growing season length as the Methods define it (Senes_10 - Flush_S1):
species reading  slope  intercept     r2      p  n
      B      P1 1.0878   145.2299 0.0630 0.0852 48
      B      P2 1.0878   145.2299 0.1394 0.3623  8
      O      P1 2.1626   145.8877 0.2013 0.0014 48
      O      P2 2.1626   145.8877 0.5555 0.0338  8

Variant, P1 with a random intercept per treatment and year:
species                    reading  slope    se         p  n  groups  converged
      B P1 + random treatment-year   4.46 1.643  0.006652 48       8       True
      O P1 + random treatment-year  5.652 1.196 2.297e-06 48       8       True

Result: reproduced. Growing season length increases by 4.46 days per degree in beech and 5.65 in oak, within tolerance, with P <= 0.035 under both readings. The deposited Growth_length is not onset of senescence minus bud swelling, as the Methods define it (data check); with the Methods' definition, which the criterion repeats (bud swelling to onset of senescence), the slopes are 1.09 (beech, P1 p = 0.085) and 2.16 (oak, P1 p = 0.0014), and the claim would not be reproduced. Neither the workbook nor Metadata.csv defines Growth_length (data check). The deposited column gives the paper's slopes within 0.04, so it is taken as the paper's variable; a question asks which is to be tested. With a random intercept per treatment and year (a variant), p = 0.0067 (beech) and < 0.0001 (oak).

fig1-oak-steeper-advance¶

The temperature-driven advance was larger in oak than in beech (P = 0.004, least squares analysis).

In [11]:
rows = []
for reading, trait, temp in [("a", "Flush_S1", "Tspring"), ("b", "Growth_length", "Tannual")]:
    s = mono.dropna(subset=[trait])[["Species", "treat", "Year", trait, temp]]
    for unit, data in (("P1", s), ("P2", s.groupby(["Species", "treat", "Year"], as_index=False)[[trait, temp]].mean())):
        fit = smf.ols(f"{trait} ~ {temp} * C(Species)", data).fit()
        term = f"{temp}:C(Species)[T.O]"
        slope_b = fit.params[temp]
        slope_o = slope_b + fit.params[term]
        rows.append({"reading": reading, "unit": unit, "slope_beech": slope_b, "slope_oak": slope_o,
                     "interaction_p": fit.pvalues[term], "n": int(fit.nobs),
                     "oak_larger_and_p<0.05": bool(abs(slope_o) > abs(slope_b) and fit.pvalues[term] < 0.05)})
steep = pd.DataFrame(rows)
print(steep.round(4).to_string(index=False))
rows = []
for reading, trait, temp in [("a", "Flush_S1", "Tspring"), ("b", "Growth_length", "Tannual")]:
    s = mono.dropna(subset=[trait]).assign(g=lambda f: f.Species + f.treat + f.Year.astype(str))
    fit = smf.mixedlm(f"{trait} ~ {temp} * C(Species)", s, groups=s.g).fit(reml=True)
    term = f"{temp}:C(Species)[T.O]"
    rows.append({"reading": reading, "unit": "P1 + random species-treatment-year", "slope_beech": fit.params[temp],
                 "slope_oak": fit.params[temp] + fit.params[term], "interaction_p": fit.pvalues[term], "n": len(s),
                 "groups": s.g.nunique(), "converged": fit.converged})
print("\nVariant, P1 with a random intercept per species, treatment and year (Wald z):")
print(pd.DataFrame(rows).round(4).to_string(index=False))
reading unit  slope_beech  slope_oak  interaction_p  n  oak_larger_and_p<0.05
      a   P1      -1.0782    -2.2961         0.0046 96                   True
      a   P2      -1.0782    -2.2961         0.1230 16                  False
      b   P1       4.4599     5.6519         0.3629 96                  False
      b   P2       4.4599     5.6519         0.5684 16                  False

Variant, P1 with a random intercept per species, treatment and year (Wald z):
reading                               unit  slope_beech  slope_oak  interaction_p  n  groups  converged
      a P1 + random species-treatment-year      -1.0782    -2.2961         0.0971 96      16       True
      b P1 + random species-treatment-year       4.4599     5.6519         0.5576 96      16       True

Result: reproduced. Under reading (a), bud swelling on Tspring with each tree and year (P1), the oak slope (-2.30) is steeper than the beech slope (-1.08), with species by temperature interaction p = 0.0046 against the paper's 0.004. On the 16 treatment means (P2) p = 0.12, and for growing season length (reading b) p = 0.36 (P1) and 0.57 (P2). With a random intercept per species, treatment and year added to P1 (a variant, not a reading of the claims file), reading (a) gives p = 0.097, so the result rests on P1 as the claims file gives it.

fig1ef-onset-senescence-no-temperature¶

The onset of senescence was not related to fall air temperature in either species.

In [12]:
print(PH["fig1ef"].round(4).to_string(index=False))
print("Any regression with P <= 0.05:", bool((PH["fig1ef"].p <= 0.05).any()))
print("\nVariant, P1 with a random intercept per treatment and year:")
print(PHRE["fig1ef"].to_string(index=False, float_format=lambda v: f"{v:.4g}"))
species reading   slope  intercept     r2      p  n
      B      P1  0.2371   256.8333 0.0046 0.6458 48
      B      P2  0.2371   256.8333 0.0117 0.7986  8
      O      P1 -0.4540   274.5413 0.0129 0.4429 48
      O      P2 -0.4540   274.5413 0.0882 0.4751  8
Any regression with P <= 0.05: False

Variant, P1 with a random intercept per treatment and year:
species                    reading  slope     se      p  n  groups  converged
      B P1 + random treatment-year 0.2371 0.8891 0.7897 48       8       True
      O P1 + random treatment-year -0.454  0.596 0.4462 48       8       True

Result: reproduced. No regression of onset of senescence on Tfall has P <= 0.05 (p = 0.44 to 0.80), with slopes of 0.24 (beech) and -0.45 (oak) days per degree. The variant with a random intercept per treatment and year gives p = 0.79 and 0.45.

fig2-gdd-chilling¶

The more chilling days trees received, the fewer growing degree days they needed to reach bud swelling, in both species, following a negative exponential.

The dataset gives GDD and chilling days per tree and year, computed by the authors; the chamber temperature records they come from are not in it. So the claims file's readings of how they are computed ((a) or (b) for GDD, (c) or (d) for the end of the chilling count, sensor H1 or H2) cannot be run one by one: the test uses the deposited values, whose description says chilling days are counted to leaf flushing (reading d) and GDD accumulate "the daily mean temperature above a threshold of 5 C" (a or b). Both forms of the negative exponential, (e) and (f), are fitted.

In [13]:
rows = []
for sp in "BO":
    s = mono[mono.Species == sp].dropna(subset=["GDD", "Chill_days"])
    for form in ("e", "f"):
        r = o.nls_exponential(s.Chill_days, s.GDD, form)
        rows.append({"species": sp, **{k: r.get(k) for k in ("form", "n", "converged", "a", "b", "c", "rate", "p_rate", "r2", "decreasing")}})
gdd = pd.DataFrame(rows)
gdd["holds"] = gdd.converged & gdd.decreasing & (gdd.p_rate <= 0.05)
print(gdd.to_string(index=False))
print("Ranges: Chill_days", mono.Chill_days.min(), "to", mono.Chill_days.max(), "; GDD", round(mono.GDD.min(), 1), "to", round(mono.GDD.max(), 1))
print("Spearman correlation of GDD with chilling days:",
      {sp: round(mono[mono.Species == sp][["GDD", "Chill_days"]].corr("spearman").iloc[0, 1], 3) for sp in "BO"})
species form  n  converged          a          b         c      rate       p_rate       r2  decreasing  holds
      B    e 48       True 633.490490  -0.013450       NaN -0.013450 4.389901e-27 0.947726        True   True
      B    f 48       True 172.466313 584.360343 -0.034570 -0.034570 2.892806e-07 0.958339        True   True
      O    e 48       True 512.064166  -0.011398       NaN -0.011398 7.411258e-20 0.876710        True   True
      O    f 48       True 192.669852 545.207226 -0.054311 -0.054311 4.246002e-07 0.907468        True   True
Ranges: Chill_days 12.0 to 97.0 ; GDD 143.5 to 613.3
Spearman correlation of GDD with chilling days: {'B': np.float64(-0.923), 'O': np.float64(-0.938)}

Result: reproduced. With the deposited GDD and chilling days, both forms of the negative exponential decrease with chilling days in both species, with rate parameters of p = 4.4e-27 (beech, e), 2.9e-07 (beech, f), 7.4e-20 (oak, e) and 4.2e-07 (oak, f). The readings of how GDD and chilling days are computed could not be run separately (the records are not in the dataset).

disc-max-chilling-days¶

Even without warming, trees received at most 97 chilling days.

In [14]:
unw = mono[mono.treat.isin(["C", "MR"])]
print("Maximum chilling days, C and MR monoculture trees 2020-21:", unw.Chill_days.max())
print(unw.groupby(["Year", "treat", "Species"]).Chill_days.agg(["min", "max", "count"]).to_string())
print("All trees and years in the dataset:", d.Chill_days.max())
Maximum chilling days, C and MR monoculture trees 2020-21: 97.0
                     min   max  count
Year treat Species                   
2020 C     B        82.0  82.0      6
           O        82.0  82.0      6
     MR    B        76.0  76.0      6
           O        76.0  76.0      6
2021 C     B        94.0  97.0      6
           O        92.0  97.0      6
     MR    B        88.0  94.0      6
           O        88.0  94.0      6
All trees and years in the dataset: 97.0

Result: reproduced. The largest number of chilling days among C and MR monoculture trees in 2020 and 2021 is 97 (in 2021), as is the largest in the whole dataset.

Treatment tests (Figures 3 and 4)¶

Treatment test of the claims file: per species, monoculture trees, lme(trait ~ (W + MR + year)^3, random = ~1|Chamber), fitted by REML; Tukey-type contrasts among the four treatments within each year, with single-step adjusted p over the six pairs of a year. Square root for starch, sugar, Asat and the increments, none for the water potentials. Readings: T1 (2019 to 2021) and T2 (2020 and 2021); where some values to be square-rooted are negative (starch, sugar and Asat as well as the increments), S1 (untransformed), S2 (square root after adding the constant that brings the minimum to zero) and S3 (negative values dropped, the others square-rooted); L1 (yearly tree means) and L2 (campaign values) for starch, sugar and Asat. A contrast is significant at adjusted p < 0.05. In the tables, raw_diff is the difference of the raw means (first treatment minus second) of the rows the model uses (under S3, without the dropped rows) and estimate the model contrast on the transformed scale. The water potentials are not transformed, so S1, S2 and S3 give the same fit for them.

In [15]:
LEAF_C = ["Starch", "Sugar", "Photo"]
GROWTH = ["Height_growth", "Diameter_growth", "AGB_growth"]
WP = ["Predawn", "Midday"]
YEARS = {"T1": [2019, 2020, 2021], "T2": [2020, 2021]}
SS = ("S1", "S2", "S3")
TT, fits = {}, []
t0 = time.time()
for sp in "BO":
    for trait in LEAF_C + GROWTH + WP:
        for T, yrs in YEARS.items():
            for L, data in (("L1", ty), ("L2", ca)):
                if L == "L2" and trait not in LEAF_C:
                    continue
                for S in SS:
                    r = o.treatment_test(data, sp, trait, yrs, trait not in WP, S)
                    TT[(sp, trait, T, S, L)] = r
                    fits.append({"species": sp, "trait": trait, "T": T, "L": L, "S": S, "n": r["n"],
                                 "transform": r["transform"], "converged": r["converged"]})
fits = pd.DataFrame(fits)
print(f"{len(fits)} fits in {time.time() - t0:.0f} s; not converged: {int((~fits.converged).sum())}")
print(fits.drop_duplicates(["species", "trait", "T", "L", "transform"]).to_string(index=False))
print("\nRows dropped under S3 (negative values), per species, trait, years and level:")
n12 = fits[fits.S != "S3"].groupby(["species", "trait", "T", "L"]).n.max()
n3 = fits[fits.S == "S3"].set_index(["species", "trait", "T", "L"]).n
print((n12 - n3).rename("dropped")[lambda s: s > 0].to_string())

def readings(trait):
    Ls = ("L1", "L2") if trait in LEAF_C else ("L1",)
    return [(T, S, L) for T in YEARS for S in SS for L in Ls]

def contrast(sp, trait, reading, year, label):
    T, S, L = reading
    c = TT[(sp, trait, T, S, L)]["contrasts"]
    return c[(c.year == year) & (c.contrast == label)].iloc[0]

def below(sp, trait, reading, year, label):
    r = contrast(sp, trait, reading, year, label)
    return bool(r.p_adj < 0.05 and r.estimate < 0)

def signif(sp, trait, reading, year, label):
    return bool(contrast(sp, trait, reading, year, label).p_adj < 0.05)

def table(sp, traits, label, years=(2020, 2021)):
    rows = []
    for trait in traits:
        for reading in readings(trait):
            for yr in years:
                r = contrast(sp, trait, reading, yr, label)
                rows.append({"species": sp, "trait": trait, "reading": "/".join(reading), "year": yr, "contrast": label,
                             "raw_diff": r.raw_diff, "estimate": r.estimate, "z": r.z, "p_adj": r.p_adj})
    return pd.DataFrame(rows)
132 fits in 60 s; not converged: 0
species           trait  T  L  S   n                      transform  converged
      B          Starch T1 L1 S1  72           none (negatives, S1)       True
      B          Starch T1 L1 S2  72           sqrt(x + 0.256) (S2)       True
      B          Starch T1 L1 S3  71  sqrt, 1 negative dropped (S3)       True
      B          Starch T1 L2 S1 211           none (negatives, S1)       True
      B          Starch T1 L2 S2 211            sqrt(x + 5.25) (S2)       True
      B          Starch T1 L2 S3 184 sqrt, 27 negative dropped (S3)       True
      B          Starch T2 L1 S1  48           none (negatives, S1)       True
      B          Starch T2 L1 S2  48           sqrt(x + 0.256) (S2)       True
      B          Starch T2 L1 S3  47  sqrt, 1 negative dropped (S3)       True
      B          Starch T2 L2 S1 140           none (negatives, S1)       True
      B          Starch T2 L2 S2 140            sqrt(x + 5.25) (S2)       True
      B          Starch T2 L2 S3 123 sqrt, 17 negative dropped (S3)       True
      B           Sugar T1 L1 S1  72                           sqrt       True
      B           Sugar T1 L2 S1 211           none (negatives, S1)       True
      B           Sugar T1 L2 S2 211            sqrt(x + 4.06) (S2)       True
      B           Sugar T1 L2 S3 210  sqrt, 1 negative dropped (S3)       True
      B           Sugar T2 L1 S1  48                           sqrt       True
      B           Sugar T2 L2 S1 140           none (negatives, S1)       True
      B           Sugar T2 L2 S2 140            sqrt(x + 4.06) (S2)       True
      B           Sugar T2 L2 S3 139  sqrt, 1 negative dropped (S3)       True
      B           Photo T1 L1 S1  72                           sqrt       True
      B           Photo T1 L2 S1 215                           sqrt       True
      B           Photo T2 L1 S1  48                           sqrt       True
      B           Photo T2 L2 S1 144                           sqrt       True
      B   Height_growth T1 L1 S1  72           none (negatives, S1)       True
      B   Height_growth T1 L1 S2  72             sqrt(x + 4.5) (S2)       True
      B   Height_growth T1 L1 S3  71  sqrt, 1 negative dropped (S3)       True
      B   Height_growth T2 L1 S1  48           none (negatives, S1)       True
      B   Height_growth T2 L1 S2  48             sqrt(x + 4.5) (S2)       True
      B   Height_growth T2 L1 S3  47  sqrt, 1 negative dropped (S3)       True
      B Diameter_growth T1 L1 S1  72           none (negatives, S1)       True
      B Diameter_growth T1 L1 S2  72            sqrt(x + 2.29) (S2)       True
      B Diameter_growth T1 L1 S3  63  sqrt, 9 negative dropped (S3)       True
      B Diameter_growth T2 L1 S1  48           none (negatives, S1)       True
      B Diameter_growth T2 L1 S2  48            sqrt(x + 2.29) (S2)       True
      B Diameter_growth T2 L1 S3  39  sqrt, 9 negative dropped (S3)       True
      B      AGB_growth T1 L1 S1  72                           sqrt       True
      B      AGB_growth T2 L1 S1  48                           sqrt       True
      B         Predawn T1 L1 S1  72                           none       True
      B         Predawn T2 L1 S1  48                           none       True
      B          Midday T1 L1 S1  72                           none       True
      B          Midday T2 L1 S1  48                           none       True
      O          Starch T1 L1 S1  72                           sqrt       True
      O          Starch T1 L2 S1 216           none (negatives, S1)       True
      O          Starch T1 L2 S2 216            sqrt(x + 4.61) (S2)       True
      O          Starch T1 L2 S3 201 sqrt, 15 negative dropped (S3)       True
      O          Starch T2 L1 S1  48                           sqrt       True
      O          Starch T2 L2 S1 144           none (negatives, S1)       True
      O          Starch T2 L2 S2 144            sqrt(x + 4.61) (S2)       True
      O          Starch T2 L2 S3 136  sqrt, 8 negative dropped (S3)       True
      O           Sugar T1 L1 S1  72                           sqrt       True
      O           Sugar T1 L2 S1 216           none (negatives, S1)       True
      O           Sugar T1 L2 S2 216            sqrt(x + 1.86) (S2)       True
      O           Sugar T1 L2 S3 215  sqrt, 1 negative dropped (S3)       True
      O           Sugar T2 L1 S1  48                           sqrt       True
      O           Sugar T2 L2 S1 144           none (negatives, S1)       True
      O           Sugar T2 L2 S2 144            sqrt(x + 1.86) (S2)       True
      O           Sugar T2 L2 S3 143  sqrt, 1 negative dropped (S3)       True
      O           Photo T1 L1 S1  72                           sqrt       True
      O           Photo T1 L2 S1 215           none (negatives, S1)       True
      O           Photo T1 L2 S2 215          sqrt(x + 0.0597) (S2)       True
      O           Photo T1 L2 S3 214  sqrt, 1 negative dropped (S3)       True
      O           Photo T2 L1 S1  48                           sqrt       True
      O           Photo T2 L2 S1 144           none (negatives, S1)       True
      O           Photo T2 L2 S2 144          sqrt(x + 0.0597) (S2)       True
      O           Photo T2 L2 S3 143  sqrt, 1 negative dropped (S3)       True
      O   Height_growth T1 L1 S1  72           none (negatives, S1)       True
      O   Height_growth T1 L1 S2  72             sqrt(x + 1.5) (S2)       True
      O   Height_growth T1 L1 S3  71  sqrt, 1 negative dropped (S3)       True
      O   Height_growth T2 L1 S1  48           none (negatives, S1)       True
      O   Height_growth T2 L1 S2  48             sqrt(x + 1.5) (S2)       True
      O   Height_growth T2 L1 S3  47  sqrt, 1 negative dropped (S3)       True
      O Diameter_growth T1 L1 S1  72           none (negatives, S1)       True
      O Diameter_growth T1 L1 S2  72            sqrt(x + 0.41) (S2)       True
      O Diameter_growth T1 L1 S3  67  sqrt, 5 negative dropped (S3)       True
      O Diameter_growth T2 L1 S1  48           none (negatives, S1)       True
      O Diameter_growth T2 L1 S2  48            sqrt(x + 0.41) (S2)       True
      O Diameter_growth T2 L1 S3  43  sqrt, 5 negative dropped (S3)       True
      O      AGB_growth T1 L1 S1  72                           sqrt       True
      O      AGB_growth T2 L1 S1  48                           sqrt       True
      O         Predawn T1 L1 S1  72                           none       True
      O         Predawn T2 L1 S1  48                           none       True
      O          Midday T1 L1 S1  72                           none       True
      O          Midday T2 L1 S1  48                           none       True

Rows dropped under S3 (negative values), per species, trait, years and level:
species  trait            T   L 
B        Diameter_growth  T1  L1     9
                          T2  L1     9
         Height_growth    T1  L1     1
                          T2  L1     1
         Starch           T1  L1     1
                              L2    27
                          T2  L1     1
                              L2    17
         Sugar            T1  L2     1
                          T2  L2     1
O        Diameter_growth  T1  L1     5
                          T2  L1     5
         Height_growth    T1  L1     1
                          T2  L1     1
         Photo            T1  L2     1
                          T2  L2     1
         Starch           T1  L2    15
                          T2  L2     8
         Sugar            T1  L2     1
                          T2  L2     1

fig3-psi-warming-2020¶

Warming made predawn leaf water potential more negative in 2020 in both species, and midday leaf water potential more negative in 2020 in beech only.

In [16]:
print(pd.concat([table(sp, WP, "W-C", [2020]) for sp in "BO"]).round(4).to_string(index=False))
rows = []
for reading in readings("Predawn"):
    conds = {"PD beech": below("B", "Predawn", reading, 2020, "W-C"), "PD oak": below("O", "Predawn", reading, 2020, "W-C"),
             "MD beech": below("B", "Midday", reading, 2020, "W-C"), "MD oak not": not below("O", "Midday", reading, 2020, "W-C")}
    n = sum(conds.values())
    rows.append({"reading": "/".join(reading), **conds, "holding": n,
                 "outcome": "reproduced" if n == 4 else "partially_reproduced" if n >= 2 else "not_reproduced"})
print(pd.DataFrame(rows).to_string(index=False))
print("\nMeans of the tree-year means (MPa), 2020, monocultures:")
print(ty[(ty.Mixture == "Monoculture") & (ty.Year == 2020)].groupby(["Species", "treat"])[WP].mean().round(3).to_string())
species   trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Predawn T1/S1/L1  2020      W-C   -0.6736   -0.6592 -3.4943 0.0027
      B Predawn T1/S2/L1  2020      W-C   -0.6736   -0.6592 -3.4943 0.0027
      B Predawn T1/S3/L1  2020      W-C   -0.6736   -0.6592 -3.4943 0.0027
      B Predawn T2/S1/L1  2020      W-C   -0.6736   -0.6179 -2.7933 0.0268
      B Predawn T2/S2/L1  2020      W-C   -0.6736   -0.6179 -2.7933 0.0268
      B Predawn T2/S3/L1  2020      W-C   -0.6736   -0.6179 -2.7933 0.0268
      B  Midday T1/S1/L1  2020      W-C   -1.3583   -1.3191 -3.9504 0.0005
      B  Midday T1/S2/L1  2020      W-C   -1.3583   -1.3191 -3.9504 0.0005
      B  Midday T1/S3/L1  2020      W-C   -1.3583   -1.3191 -3.9504 0.0005
      B  Midday T2/S1/L1  2020      W-C   -1.3583   -1.2770 -3.1982 0.0077
      B  Midday T2/S2/L1  2020      W-C   -1.3583   -1.2770 -3.1982 0.0077
      B  Midday T2/S3/L1  2020      W-C   -1.3583   -1.2770 -3.1982 0.0077
      O Predawn T1/S1/L1  2020      W-C   -0.2331   -0.2331 -1.5787 0.3908
      O Predawn T1/S2/L1  2020      W-C   -0.2331   -0.2331 -1.5787 0.3908
      O Predawn T1/S3/L1  2020      W-C   -0.2331   -0.2331 -1.5787 0.3908
      O Predawn T2/S1/L1  2020      W-C   -0.2331   -0.2334 -1.3199 0.5498
      O Predawn T2/S2/L1  2020      W-C   -0.2331   -0.2334 -1.3199 0.5498
      O Predawn T2/S3/L1  2020      W-C   -0.2331   -0.2334 -1.3199 0.5498
      O  Midday T1/S1/L1  2020      W-C   -0.5339   -0.5145 -1.5954 0.3814
      O  Midday T1/S2/L1  2020      W-C   -0.5339   -0.5145 -1.5954 0.3814
      O  Midday T1/S3/L1  2020      W-C   -0.5339   -0.5145 -1.5954 0.3814
      O  Midday T2/S1/L1  2020      W-C   -0.5339   -0.5037 -1.3173 0.5515
      O  Midday T2/S2/L1  2020      W-C   -0.5339   -0.5037 -1.3173 0.5515
      O  Midday T2/S3/L1  2020      W-C   -0.5339   -0.5037 -1.3173 0.5515
 reading  PD beech  PD oak  MD beech  MD oak not  holding              outcome
T1/S1/L1      True   False      True        True        3 partially_reproduced
T1/S2/L1      True   False      True        True        3 partially_reproduced
T1/S3/L1      True   False      True        True        3 partially_reproduced
T2/S1/L1      True   False      True        True        3 partially_reproduced
T2/S2/L1      True   False      True        True        3 partially_reproduced
T2/S3/L1      True   False      True        True        3 partially_reproduced

Means of the tree-year means (MPa), 2020, monocultures:
               Predawn  Midday
Species treat                 
B       C       -0.549  -2.590
        MR      -0.678  -2.189
        W       -1.222  -3.948
        WMR     -0.881  -2.794
O       C       -0.304  -1.772
        MR      -0.583  -2.296
        W       -0.537  -2.306
        WMR     -0.527  -2.183

Result: partially reproduced. In 2020, warming lowers predawn potential in beech (W - C -0.67 MPa, adjusted p 0.0027 under T1, 0.027 under T2) and midday potential in beech (-1.36 MPa, p 0.0005 and 0.0077), and midday potential in oak does not differ (p 0.38 and 0.55). Predawn potential in oak is lower under W by 0.23 MPa, but not significantly (p 0.39 and 0.55). Three of the four conditions hold under both readings.

fig3-psi-mr-oak-2020¶

Lower soil moisture alone made predawn leaf water potential more negative in 2020 in oak only.

In [17]:
print(pd.concat([table(sp, ["Predawn"], "MR-C", [2020]) for sp in "BO"]).round(4).to_string(index=False))
rows = []
for reading in readings("Predawn"):
    oak, beech = below("O", "Predawn", reading, 2020, "MR-C"), below("B", "Predawn", reading, 2020, "MR-C")
    rows.append({"reading": "/".join(reading), "oak MR<C": oak, "beech MR<C": beech,
                 "outcome": "reproduced" if oak and not beech else "not_reproduced"})
print(pd.DataFrame(rows).to_string(index=False))
species   trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Predawn T1/S1/L1  2020     MR-C   -0.1289   -0.1236 -0.6551 0.9138
      B Predawn T1/S2/L1  2020     MR-C   -0.1289   -0.1236 -0.6551 0.9138
      B Predawn T1/S3/L1  2020     MR-C   -0.1289   -0.1236 -0.6551 0.9138
      B Predawn T2/S1/L1  2020     MR-C   -0.1289   -0.0957 -0.4327 0.9729
      B Predawn T2/S2/L1  2020     MR-C   -0.1289   -0.0957 -0.4327 0.9729
      B Predawn T2/S3/L1  2020     MR-C   -0.1289   -0.0957 -0.4327 0.9729
      O Predawn T1/S1/L1  2020     MR-C   -0.2792   -0.2747 -1.8605 0.2452
      O Predawn T1/S2/L1  2020     MR-C   -0.2792   -0.2747 -1.8605 0.2452
      O Predawn T1/S3/L1  2020     MR-C   -0.2792   -0.2747 -1.8605 0.2452
      O Predawn T2/S1/L1  2020     MR-C   -0.2792   -0.2724 -1.5404 0.4134
      O Predawn T2/S2/L1  2020     MR-C   -0.2792   -0.2724 -1.5404 0.4134
      O Predawn T2/S3/L1  2020     MR-C   -0.2792   -0.2724 -1.5404 0.4134
 reading  oak MR<C  beech MR<C        outcome
T1/S1/L1     False       False not_reproduced
T1/S2/L1     False       False not_reproduced
T1/S3/L1     False       False not_reproduced
T2/S1/L1     False       False not_reproduced
T2/S2/L1     False       False not_reproduced
T2/S3/L1     False       False not_reproduced

Result: not reproduced. In 2020, predawn potential under MR is 0.28 MPa below C in oak but not significantly (adjusted p 0.25 under T1, 0.41 under T2); in beech it does not differ either (p 0.91 and 0.97).

fig3-psi-wmr-2021¶

Combined warming and drier soil made predawn leaf water potential more negative in 2021 in both species.

In [18]:
print(pd.concat([table(sp, ["Predawn"], "WMR-C", [2021]) for sp in "BO"]).round(4).to_string(index=False))
rows = []
for reading in readings("Predawn"):
    b, oo = below("B", "Predawn", reading, 2021, "WMR-C"), below("O", "Predawn", reading, 2021, "WMR-C")
    rows.append({"reading": "/".join(reading), "beech": b, "oak": oo,
                 "outcome": "reproduced" if b and oo else "partially_reproduced" if b or oo else "not_reproduced"})
print(pd.DataFrame(rows).to_string(index=False))
species   trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Predawn T1/S1/L1  2021    WMR-C   -0.6117   -0.6117 -3.2424 0.0066
      B Predawn T1/S2/L1  2021    WMR-C   -0.6117   -0.6117 -3.2424 0.0066
      B Predawn T1/S3/L1  2021    WMR-C   -0.6117   -0.6117 -3.2424 0.0066
      B Predawn T2/S1/L1  2021    WMR-C   -0.6117   -0.5879 -2.6574 0.0393
      B Predawn T2/S2/L1  2021    WMR-C   -0.6117   -0.5879 -2.6574 0.0393
      B Predawn T2/S3/L1  2021    WMR-C   -0.6117   -0.5879 -2.6574 0.0393
      O Predawn T1/S1/L1  2021    WMR-C   -0.7234   -0.7395 -5.0091 0.0000
      O Predawn T1/S2/L1  2021    WMR-C   -0.7234   -0.7395 -5.0091 0.0000
      O Predawn T1/S3/L1  2021    WMR-C   -0.7234   -0.7395 -5.0091 0.0000
      O Predawn T2/S1/L1  2021    WMR-C   -0.7234   -0.7682 -4.3450 0.0000
      O Predawn T2/S2/L1  2021    WMR-C   -0.7234   -0.7682 -4.3450 0.0000
      O Predawn T2/S3/L1  2021    WMR-C   -0.7234   -0.7682 -4.3450 0.0000
 reading  beech  oak    outcome
T1/S1/L1   True True reproduced
T1/S2/L1   True True reproduced
T1/S3/L1   True True reproduced
T2/S1/L1   True True reproduced
T2/S2/L1   True True reproduced
T2/S3/L1   True True reproduced

Result: reproduced. In 2021, predawn potential under WMR is below C in beech (-0.61 MPa, adjusted p 0.0066 under T1, 0.039 under T2) and in oak (-0.72 MPa, p < 0.0001 under both).

disc-psi-minimum¶

Under the low moisture treatment trees reached predawn water potentials of about -1.9 MPa in beech and -1.2 MPa in oak.

In [19]:
m = ty[(ty.Mixture == "Monoculture") & ty.Year.isin([2020, 2021])]
mc = ca[(ca.Mixture == "Monoculture") & ca.Year.isin([2020, 2021])]
yearly = m.groupby(["Species", "treat", "Year"]).Predawn.mean()
camp = mc.groupby(["Species", "treat", "Year", "season"]).Predawn.mean()
rows = []
for sp, target, tol in (("B", -1.9, 0.19), ("O", -1.2, 0.12)):
    vals = {"a": yearly.loc[sp].loc[["MR"]].min(), "b": yearly.loc[sp].loc[["MR", "WMR"]].min(),
            "c": camp.loc[sp].loc[["MR", "WMR"]].min(), "d": mc[(mc.Species == sp) & mc.treat.isin(["MR", "WMR"])].Predawn.min()}
    for k, v in vals.items():
        rows.append({"species": sp, "reading": k, "value": v, "target": target, "within": within(v, target, tol)})
psi = pd.DataFrame(rows)
print(psi.round(3).to_string(index=False))
print("\nReadings with both species within tolerance:",
      [k for k in "abcd" if psi[psi.reading == k].within.all()])
print("\nYearly treatment means (MPa):"); print(yearly.unstack([1]).round(3).to_string())
species reading  value  target  within
      B       a -0.678    -1.9   False
      B       b -1.057    -1.9   False
      B       c -1.177    -1.9   False
      B       d -2.180    -1.9   False
      O       a -0.583    -1.2   False
      O       b -0.949    -1.2   False
      O       c -1.148    -1.2    True
      O       d -3.500    -1.2   False

Readings with both species within tolerance: []

Yearly treatment means (MPa):
treat             C     MR      W    WMR
Species Year                            
B       2020 -0.549 -0.678 -1.222 -0.881
        2021 -0.445 -0.473 -0.661 -1.057
O       2020 -0.304 -0.583 -0.537 -0.527
        2021 -0.226 -0.429 -0.343 -0.949

Result: not reproduced. No reading puts both species within tolerance. The oak value is within tolerance only under reading (c), the lowest campaign mean (-1.15 MPa against -1.2); beech's is -0.68 (a), -1.06 (b), -1.18 (c) and -2.18 (d, one measurement) against -1.9 +- 0.19.

fig4-beech-warming-none¶

In beech, warming alone had no effect on starch, sugar, Asat, or height, diameter and AGWB increments.

In [20]:
t = table("B", LEAF_C + GROWTH, "W-C")
print(t.round(4).to_string(index=False))
sig = t[t.p_adj < 0.05]
print("\nSignificant W-C contrasts:", len(sig), "of", len(t))
print(sig.round(4).to_string(index=False))
by = t.groupby("reading").apply(lambda g: int((g.p_adj < 0.05).sum())).rename("significant").reset_index()
print(by.to_string(index=False))
print("\nTable S1 warming terms (beech, sequential and marginal F), per reading:")
rows = []
for trait in LEAF_C + GROWTH:
    for reading in readings(trait):
        r = TT[("B", trait, *reading)]
        rows.append({"trait": trait, "reading": "/".join(reading),
                     "W_seq_F": r["anova"].F[0], "W_seq_p": r["anova"].p[0], "W_marg_F": r["anova_marginal"].F[0],
                     "W_marg_p": r["anova_marginal"].p[0], "WxY_marg_F": r["anova_marginal"].F[4], "WxY_marg_p": r["anova_marginal"].p[4]})
print(pd.DataFrame(rows).round(3).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B          Starch T1/S1/L1  2020      W-C   -3.5188   -3.5923 -2.2924 0.0992
      B          Starch T1/S1/L1  2021      W-C    1.3888    1.3153  0.8393 0.8358
      B          Starch T1/S1/L2  2020      W-C   -3.5651   -3.5651 -2.0249 0.1790
      B          Starch T1/S1/L2  2021      W-C    1.6038    1.6038  0.9109 0.7991
      B          Starch T1/S2/L1  2020      W-C   -3.5188   -0.9478 -2.6463 0.0408
      B          Starch T1/S2/L1  2021      W-C    1.3888    0.3011  0.8408 0.8351
      B          Starch T1/S2/L2  2020      W-C   -3.5651   -0.6809 -2.5685 0.0501
      B          Starch T1/S2/L2  2021      W-C    1.6038    0.3103  1.1706 0.6457
      B          Starch T1/S3/L1  2020      W-C   -3.5188   -1.0076 -2.9219 0.0184
      B          Starch T1/S3/L1  2021      W-C    1.3888    0.3010  0.8727 0.8191
      B          Starch T1/S3/L2  2020      W-C   -3.1874   -0.7528 -2.0183 0.1814
      B          Starch T1/S3/L2  2021      W-C   -0.9193   -0.1452 -0.3789 0.9814
      B          Starch T2/S1/L1  2020      W-C   -3.5188   -3.6159 -1.9052 0.2258
      B          Starch T2/S1/L1  2021      W-C    1.3888    1.2917  0.6806 0.9046
      B          Starch T2/S1/L2  2020      W-C   -3.5651   -3.5651 -1.6839 0.3323
      B          Starch T2/S1/L2  2021      W-C    1.6038    1.6038  0.7576 0.8735
      B          Starch T2/S2/L1  2020      W-C   -3.5188   -0.9498 -2.2552 0.1087
      B          Starch T2/S2/L1  2021      W-C    1.3888    0.2991  0.7101 0.8931
      B          Starch T2/S2/L2  2020      W-C   -3.5651   -0.6809 -2.1604 0.1345
      B          Starch T2/S2/L2  2021      W-C    1.6038    0.3103  0.9846 0.7583
      B          Starch T2/S3/L1  2020      W-C   -3.5188   -1.0142 -2.5189 0.0571
      B          Starch T2/S3/L1  2021      W-C    1.3888    0.2943  0.7309 0.8848
      B          Starch T2/S3/L2  2020      W-C   -3.1874   -0.7528 -1.7244 0.3112
      B          Starch T2/S3/L2  2021      W-C   -0.9193   -0.1452 -0.3237 0.9883
      B           Sugar T1/S1/L1  2020      W-C   -0.1736   -0.0386 -0.2280 0.9958
      B           Sugar T1/S1/L1  2021      W-C   -1.2021   -0.2690 -1.5907 0.3839
      B           Sugar T1/S1/L2  2020      W-C    0.0427    0.1074  0.1466 0.9989
      B           Sugar T1/S1/L2  2021      W-C   -1.2011   -1.1242 -1.5313 0.4174
      B           Sugar T1/S2/L1  2020      W-C   -0.1736   -0.0386 -0.2280 0.9958
      B           Sugar T1/S2/L1  2021      W-C   -1.2021   -0.2690 -1.5907 0.3839
      B           Sugar T1/S2/L2  2020      W-C    0.0427    0.0145  0.1111 0.9995
      B           Sugar T1/S2/L2  2021      W-C   -1.2011   -0.2746 -2.1029 0.1520
      B           Sugar T1/S3/L1  2020      W-C   -0.1736   -0.0386 -0.2280 0.9958
      B           Sugar T1/S3/L1  2021      W-C   -1.2021   -0.2690 -1.5907 0.3839
      B           Sugar T1/S3/L2  2020      W-C    0.0427    0.0326  0.1988 0.9972
      B           Sugar T1/S3/L2  2021      W-C   -0.6475   -0.1114 -0.6716 0.9079
      B           Sugar T2/S1/L1  2020      W-C   -0.1736   -0.0490 -0.2775 0.9925
      B           Sugar T2/S1/L1  2021      W-C   -1.2021   -0.2794 -1.5834 0.3881
      B           Sugar T2/S1/L2  2020      W-C    0.0427    0.0427  0.0604 0.9999
      B           Sugar T2/S1/L2  2021      W-C   -1.2011   -1.2011 -1.7003 0.3234
      B           Sugar T2/S2/L1  2020      W-C   -0.1736   -0.0490 -0.2775 0.9925
      B           Sugar T2/S2/L1  2021      W-C   -1.2021   -0.2794 -1.5834 0.3881
      B           Sugar T2/S2/L2  2020      W-C    0.0427    0.0082  0.0595 0.9999
      B           Sugar T2/S2/L2  2021      W-C   -1.2011   -0.2830 -2.0466 0.1710
      B           Sugar T2/S3/L1  2020      W-C   -0.1736   -0.0490 -0.2775 0.9925
      B           Sugar T2/S3/L1  2021      W-C   -1.2021   -0.2794 -1.5834 0.3881
      B           Sugar T2/S3/L2  2020      W-C    0.0427    0.0136  0.0875 0.9998
      B           Sugar T2/S3/L2  2021      W-C   -0.6475   -0.1338 -0.8491 0.8308
      B           Photo T1/S1/L1  2020      W-C    0.2249    0.0603  0.2797 0.9924
      B           Photo T1/S1/L1  2021      W-C   -2.3880   -0.4413 -2.0453 0.1717
      B           Photo T1/S1/L2  2020      W-C    0.2249    0.1216  0.5985 0.9325
      B           Photo T1/S1/L2  2021      W-C   -2.3880   -0.4548 -2.2390 0.1128
      B           Photo T1/S2/L1  2020      W-C    0.2249    0.0603  0.2797 0.9924
      B           Photo T1/S2/L1  2021      W-C   -2.3880   -0.4413 -2.0453 0.1717
      B           Photo T1/S2/L2  2020      W-C    0.2249    0.1216  0.5985 0.9325
      B           Photo T1/S2/L2  2021      W-C   -2.3880   -0.4548 -2.2390 0.1128
      B           Photo T1/S3/L1  2020      W-C    0.2249    0.0603  0.2797 0.9924
      B           Photo T1/S3/L1  2021      W-C   -2.3880   -0.4413 -2.0453 0.1717
      B           Photo T1/S3/L2  2020      W-C    0.2249    0.1216  0.5985 0.9325
      B           Photo T1/S3/L2  2021      W-C   -2.3880   -0.4548 -2.2390 0.1128
      B           Photo T2/S1/L1  2020      W-C    0.2249    0.0763  0.3143 0.9893
      B           Photo T2/S1/L1  2021      W-C   -2.3880   -0.4253 -1.7513 0.2977
      B           Photo T2/S1/L2  2020      W-C    0.2249    0.1375  0.5785 0.9385
      B           Photo T2/S1/L2  2021      W-C   -2.3880   -0.4389 -1.8469 0.2514
      B           Photo T2/S2/L1  2020      W-C    0.2249    0.0763  0.3143 0.9893
      B           Photo T2/S2/L1  2021      W-C   -2.3880   -0.4253 -1.7513 0.2977
      B           Photo T2/S2/L2  2020      W-C    0.2249    0.1375  0.5785 0.9385
      B           Photo T2/S2/L2  2021      W-C   -2.3880   -0.4389 -1.8469 0.2514
      B           Photo T2/S3/L1  2020      W-C    0.2249    0.0763  0.3143 0.9893
      B           Photo T2/S3/L1  2021      W-C   -2.3880   -0.4253 -1.7513 0.2977
      B           Photo T2/S3/L2  2020      W-C    0.2249    0.1375  0.5785 0.9385
      B           Photo T2/S3/L2  2021      W-C   -2.3880   -0.4389 -1.8469 0.2514
      B   Height_growth T1/S1/L1  2020      W-C    0.1667    0.1667  0.0563 0.9999
      B   Height_growth T1/S1/L1  2021      W-C   -2.5000   -2.5000 -0.8450 0.8330
      B   Height_growth T1/S2/L1  2020      W-C    0.1667    0.0408  0.0954 0.9997
      B   Height_growth T1/S2/L1  2021      W-C   -2.5000   -0.3843 -0.8979 0.8059
      B   Height_growth T1/S3/L1  2020      W-C    0.1667    0.0599  0.1065 0.9996
      B   Height_growth T1/S3/L1  2021      W-C   -2.5000   -0.3842 -0.6828 0.9037
      B   Height_growth T2/S1/L1  2020      W-C    0.1667    0.1667  0.0565 0.9999
      B   Height_growth T2/S1/L1  2021      W-C   -2.5000   -2.5000 -0.8479 0.8317
      B   Height_growth T2/S2/L1  2020      W-C    0.1667    0.0408  0.0954 0.9997
      B   Height_growth T2/S2/L1  2021      W-C   -2.5000   -0.3843 -0.8973 0.8062
      B   Height_growth T2/S3/L1  2020      W-C    0.1667    0.0599  0.1128 0.9995
      B   Height_growth T2/S3/L1  2021      W-C   -2.5000   -0.3842 -0.7231 0.8879
      B Diameter_growth T1/S1/L1  2020      W-C   -0.3083   -0.3083 -0.6293 0.9226
      B Diameter_growth T1/S1/L1  2021      W-C    0.4450    0.4450  0.9083 0.8005
      B Diameter_growth T1/S2/L1  2020      W-C   -0.3083   -0.1005 -0.5919 0.9345
      B Diameter_growth T1/S2/L1  2021      W-C    0.4450    0.0998  0.5879 0.9358
      B Diameter_growth T1/S3/L1  2020      W-C   -0.3083   -0.3045 -1.1729 0.6439
      B Diameter_growth T1/S3/L1  2021      W-C    0.7383    0.2502  0.9191 0.7871
      B Diameter_growth T2/S1/L1  2020      W-C   -0.3083   -0.3083 -0.6128 0.9280
      B Diameter_growth T2/S1/L1  2021      W-C    0.4450    0.4450  0.8844 0.8130
      B Diameter_growth T2/S2/L1  2020      W-C   -0.3083   -0.1005 -0.5355 0.9503
      B Diameter_growth T2/S2/L1  2021      W-C    0.4450    0.0998  0.5318 0.9514
      B Diameter_growth T2/S3/L1  2020      W-C   -0.3083   -0.3043 -1.2176 0.6155
      B Diameter_growth T2/S3/L1  2021      W-C    0.7383    0.2501  0.9547 0.7671
      B      AGB_growth T1/S1/L1  2020      W-C   -2.6143   -0.8803 -1.2687 0.5827
      B      AGB_growth T1/S1/L1  2021      W-C   -3.4447   -0.5251 -0.7568 0.8738
      B      AGB_growth T1/S2/L1  2020      W-C   -2.6143   -0.8803 -1.2687 0.5827
      B      AGB_growth T1/S2/L1  2021      W-C   -3.4447   -0.5251 -0.7568 0.8738
      B      AGB_growth T1/S3/L1  2020      W-C   -2.6143   -0.8803 -1.2687 0.5827
      B      AGB_growth T1/S3/L1  2021      W-C   -3.4447   -0.5251 -0.7568 0.8738
      B      AGB_growth T2/S1/L1  2020      W-C   -2.6143   -0.8957 -1.1762 0.6418
      B      AGB_growth T2/S1/L1  2021      W-C   -3.4447   -0.5405 -0.7098 0.8932
      B      AGB_growth T2/S2/L1  2020      W-C   -2.6143   -0.8957 -1.1762 0.6418
      B      AGB_growth T2/S2/L1  2021      W-C   -3.4447   -0.5405 -0.7098 0.8932
      B      AGB_growth T2/S3/L1  2020      W-C   -2.6143   -0.8957 -1.1762 0.6418
      B      AGB_growth T2/S3/L1  2021      W-C   -3.4447   -0.5405 -0.7098 0.8932

Significant W-C contrasts: 2 of 108
species  trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Starch T1/S2/L1  2020      W-C   -3.5188   -0.9478 -2.6463 0.0408
      B Starch T1/S3/L1  2020      W-C   -3.5188   -1.0076 -2.9219 0.0184
 reading  significant
T1/S1/L1            0
T1/S1/L2            0
T1/S2/L1            1
T1/S2/L2            0
T1/S3/L1            1
T1/S3/L2            0
T2/S1/L1            0
T2/S1/L2            0
T2/S2/L1            0
T2/S2/L2            0
T2/S3/L1            0
T2/S3/L2            0

Table S1 warming terms (beech, sequential and marginal F), per reading:
          trait  reading  W_seq_F  W_seq_p  W_marg_F  W_marg_p  WxY_marg_F  WxY_marg_p
         Starch T1/S1/L1    6.516    0.025     0.509     0.489       2.642       0.082
         Starch T1/S1/L2    5.473    0.037     0.373     0.553       2.155       0.119
         Starch T1/S2/L1    7.932    0.016     0.722     0.412       3.299       0.045
         Starch T1/S2/L2    6.222    0.028     0.561     0.468       3.495       0.032
         Starch T1/S3/L1   11.708    0.005     0.892     0.364       4.124       0.022
         Starch T1/S3/L2    6.164    0.029     0.325     0.579       0.800       0.451
         Starch T2/S1/L1    3.911    0.071     3.630     0.081       3.749       0.063
         Starch T2/S1/L2    3.269    0.096     2.836     0.118       2.980       0.087
         Starch T2/S2/L1    3.963    0.070     5.086     0.044       4.921       0.035
         Starch T2/S2/L2    3.283    0.095     4.667     0.052       4.946       0.028
         Starch T2/S3/L1    6.831    0.023     6.345     0.027       6.536       0.017
         Starch T2/S3/L2    5.747    0.034     2.974     0.110       0.942       0.334
          Sugar T1/S1/L1    1.443    0.253     2.780     0.121       0.728       0.488
          Sugar T1/S1/L2    1.058    0.324     3.618     0.081       1.421       0.244
          Sugar T1/S2/L1    1.443    0.253     2.780     0.121       0.728       0.488
          Sugar T1/S2/L2    1.365    0.265     2.804     0.120       1.490       0.228
          Sugar T1/S3/L1    1.443    0.253     2.780     0.121       0.728       0.488
          Sugar T1/S3/L2    0.226    0.643     2.718     0.125       1.259       0.286
          Sugar T2/S1/L1    0.795    0.390     0.077     0.786       0.853       0.364
          Sugar T2/S1/L2    0.487    0.499     0.004     0.953       1.550       0.216
          Sugar T2/S2/L1    0.795    0.390     0.077     0.786       0.853       0.364
          Sugar T2/S2/L2    0.665    0.431     0.004     0.954       2.218       0.139
          Sugar T2/S3/L1    0.795    0.390     0.077     0.786       0.853       0.364
          Sugar T2/S3/L2    0.026    0.874     0.008     0.932       0.514       0.475
          Photo T1/S1/L1    0.752    0.403     2.258     0.159       3.954       0.026
          Photo T1/S1/L2    0.863    0.371     2.433     0.145       5.197       0.006
          Photo T1/S2/L1    0.752    0.403     2.258     0.159       3.954       0.026
          Photo T1/S2/L2    0.863    0.371     2.433     0.145       5.197       0.006
          Photo T1/S3/L1    0.752    0.403     2.258     0.159       3.954       0.026
          Photo T1/S3/L2    0.863    0.371     2.433     0.145       5.197       0.006
          Photo T2/S1/L1    1.281    0.280     0.099     0.759       5.023       0.033
          Photo T2/S1/L2    1.239    0.288     0.335     0.574       6.360       0.013
          Photo T2/S2/L1    1.281    0.280     0.099     0.759       5.023       0.033
          Photo T2/S2/L2    1.239    0.288     0.335     0.574       6.360       0.013
          Photo T2/S3/L1    1.281    0.280     0.099     0.759       5.023       0.033
          Photo T2/S3/L2    1.239    0.288     0.335     0.574       6.360       0.013
  Height_growth T1/S1/L1    0.197    0.665     0.235     0.637       0.206       0.815
  Height_growth T1/S2/L1    0.012    0.915     0.316     0.584       0.255       0.776
  Height_growth T1/S3/L1    0.121    0.734     0.365     0.557       0.189       0.828
  Height_growth T2/S1/L1    0.003    0.956     0.003     0.956       0.409       0.528
  Height_growth T2/S2/L1    0.201    0.662     0.009     0.926       0.493       0.489
  Height_growth T2/S3/L1    0.004    0.949     0.013     0.912       0.349       0.559
Diameter_growth T1/S1/L1    0.014    0.909     0.172     0.685       0.694       0.505
Diameter_growth T1/S2/L1    0.031    0.862     0.135     0.720       0.392       0.678
Diameter_growth T1/S3/L1    0.540    0.477     0.546     0.474       1.199       0.312
Diameter_growth T2/S1/L1    0.207    0.657     0.376     0.551       1.121       0.299
Diameter_growth T2/S2/L1    0.003    0.957     0.287     0.602       0.570       0.457
Diameter_growth T2/S3/L1    0.202    0.661     1.483     0.247       2.376       0.140
     AGB_growth T1/S1/L1    0.478    0.503     0.164     0.692       0.188       0.829
     AGB_growth T1/S2/L1    0.478    0.503     0.164     0.692       0.188       0.829
     AGB_growth T1/S3/L1    0.478    0.503     0.164     0.692       0.188       0.829
     AGB_growth T2/S1/L1    0.061    0.810     1.383     0.262       0.130       0.721
     AGB_growth T2/S2/L1    0.061    0.810     1.383     0.262       0.130       0.721
     AGB_growth T2/S3/L1    0.061    0.810     1.383     0.262       0.130       0.721

Result: blocked (methods underspecified). Of 108 W against C contrasts in beech (six traits, two years, twelve readings), two are significant, both starch in 2020 under T1 on yearly means: under S2 (raw difference -3.52 %, adjusted p 0.041) and under S3 (p 0.018). Under S1 the same contrast has p 0.099, and under T2 or on campaign values p 0.050 to 0.33. The answer to the question named S1, S2 and S3 for the negative starch values; these readings still disagree, so the claim stays blocked. The warming main effect is not significant in the marginal tests under T1 (p 0.081 to 0.72).

fig4-oak-warming-growth-2021¶

In oak, warming alone reduced height, diameter and AGWB increments, in 2021 only.

In [21]:
t = table("O", GROWTH, "W-C")
print(t.round(4).to_string(index=False))
rows = []
for reading in readings("Height_growth"):
    n21 = sum(below("O", tr, reading, 2021, "W-C") for tr in GROWTH)
    n20 = sum(below("O", tr, reading, 2020, "W-C") for tr in GROWTH)
    out = ("reproduced" if n21 == 3 and n20 == 0 else "partially_reproduced" if n21 in (1, 2) and n20 == 0 else "not_reproduced")
    rows.append({"reading": "/".join(reading), "W<C in 2021": n21, "W<C in 2020": n20, "outcome": out})
print(pd.DataFrame(rows).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      O   Height_growth T1/S1/L1  2020      W-C   -8.0833   -8.4368 -2.1303 0.1433
      O   Height_growth T1/S1/L1  2021      W-C  -11.6667  -12.0202 -3.0350 0.0128
      O   Height_growth T1/S2/L1  2020      W-C   -8.0833   -1.0758 -1.8769 0.2380
      O   Height_growth T1/S2/L1  2021      W-C  -11.6667   -1.4981 -2.6138 0.0445
      O   Height_growth T1/S3/L1  2020      W-C   -8.0833   -1.1332 -1.8179 0.2646
      O   Height_growth T1/S3/L1  2021      W-C  -11.6667   -1.5911 -2.5524 0.0524
      O   Height_growth T2/S1/L1  2020      W-C   -8.0833   -8.1144 -2.1160 0.1477
      O   Height_growth T2/S1/L1  2021      W-C  -11.6667  -11.6977 -3.0504 0.0121
      O   Height_growth T2/S2/L1  2020      W-C   -8.0833   -1.0304 -1.8624 0.2443
      O   Height_growth T2/S2/L1  2021      W-C  -11.6667   -1.4527 -2.6257 0.0431
      O   Height_growth T2/S3/L1  2020      W-C   -8.0833   -1.0669 -1.7787 0.2835
      O   Height_growth T2/S3/L1  2021      W-C  -11.6667   -1.5248 -2.5420 0.0537
      O Diameter_growth T1/S1/L1  2020      W-C   -0.6250   -0.6333 -1.9102 0.2238
      O Diameter_growth T1/S1/L1  2021      W-C   -0.7283   -0.7367 -2.2218 0.1171
      O Diameter_growth T1/S2/L1  2020      W-C   -0.6250   -0.2491 -1.7320 0.3070
      O Diameter_growth T1/S2/L1  2021      W-C   -0.7283   -0.2895 -2.0133 0.1826
      O Diameter_growth T1/S3/L1  2020      W-C   -0.6250   -0.3106 -1.7518 0.2967
      O Diameter_growth T1/S3/L1  2021      W-C   -0.7283   -0.3402 -1.9189 0.2153
      O Diameter_growth T2/S1/L1  2020      W-C   -0.6250   -0.6250 -1.7894 0.2787
      O Diameter_growth T2/S1/L1  2021      W-C   -0.7283   -0.7283 -2.0852 0.1580
      O Diameter_growth T2/S2/L1  2020      W-C   -0.6250   -0.2473 -1.6150 0.3701
      O Diameter_growth T2/S2/L1  2021      W-C   -0.7283   -0.2877 -1.8792 0.2367
      O Diameter_growth T2/S3/L1  2020      W-C   -0.6250   -0.3106 -1.6384 0.3570
      O Diameter_growth T2/S3/L1  2021      W-C   -0.7283   -0.3402 -1.7946 0.2704
      O      AGB_growth T1/S1/L1  2020      W-C   -7.9573   -0.8243 -0.9931 0.7534
      O      AGB_growth T1/S1/L1  2021      W-C  -21.5428   -2.2673 -2.7317 0.0321
      O      AGB_growth T1/S2/L1  2020      W-C   -7.9573   -0.8243 -0.9931 0.7534
      O      AGB_growth T1/S2/L1  2021      W-C  -21.5428   -2.2673 -2.7317 0.0321
      O      AGB_growth T1/S3/L1  2020      W-C   -7.9573   -0.8243 -0.9931 0.7534
      O      AGB_growth T1/S3/L1  2021      W-C  -21.5428   -2.2673 -2.7317 0.0321
      O      AGB_growth T2/S1/L1  2020      W-C   -7.9573   -0.7815 -0.8778 0.8164
      O      AGB_growth T2/S1/L1  2021      W-C  -21.5428   -2.2244 -2.4987 0.0600
      O      AGB_growth T2/S2/L1  2020      W-C   -7.9573   -0.7815 -0.8778 0.8164
      O      AGB_growth T2/S2/L1  2021      W-C  -21.5428   -2.2244 -2.4987 0.0600
      O      AGB_growth T2/S3/L1  2020      W-C   -7.9573   -0.7815 -0.8778 0.8164
      O      AGB_growth T2/S3/L1  2021      W-C  -21.5428   -2.2244 -2.4987 0.0600
 reading  W<C in 2021  W<C in 2020              outcome
T1/S1/L1            2            0 partially_reproduced
T1/S2/L1            2            0 partially_reproduced
T1/S3/L1            1            0 partially_reproduced
T2/S1/L1            1            0 partially_reproduced
T2/S2/L1            1            0 partially_reproduced
T2/S3/L1            0            0       not_reproduced

Result: blocked (methods underspecified). In oak in 2021, warming lowers height increment (raw -11.7 cm; adjusted p 0.012 to 0.045 under S1 and S2, 0.052 and 0.054 under S3) and AGWB increment (-21.5 g, p 0.032 under T1, 0.060 under T2), not diameter increment; nothing is significant in 2020. Two or one of the three 2021 contrasts hold under five readings (partially reproduced) and none under T2 with S3 (not reproduced). Reading S3, which the answer added for negative increments, makes the readings differ.

disc-oak-warming-no-carbon-change¶

In oak, warming had no effect on Asat or on starch and sugar concentrations.

In [22]:
t = table("O", LEAF_C, "W-C")
print(t.round(4).to_string(index=False))
print("\nSignificant W-C contrasts per reading:")
print(t.groupby("reading").apply(lambda g: int((g.p_adj < 0.05).sum())).to_string())
species  trait  reading  year contrast  raw_diff  estimate       z  p_adj
      O Starch T1/S1/L1  2020      W-C   -1.2283   -0.2300 -0.7130 0.8919
      O Starch T1/S1/L1  2021      W-C    0.2283    0.0368  0.1142 0.9995
      O Starch T1/S1/L2  2020      W-C   -1.2283   -1.2540 -0.7580 0.8732
      O Starch T1/S1/L2  2021      W-C    0.2283    0.2027  0.1225 0.9993
      O Starch T1/S2/L1  2020      W-C   -1.2283   -0.2300 -0.7130 0.8919
      O Starch T1/S2/L1  2021      W-C    0.2283    0.0368  0.1142 0.9995
      O Starch T1/S2/L2  2020      W-C   -1.2283   -0.1490 -0.5737 0.9399
      O Starch T1/S2/L2  2021      W-C    0.2283    0.0453  0.1743 0.9981
      O Starch T1/S3/L1  2020      W-C   -1.2283   -0.2300 -0.7130 0.8919
      O Starch T1/S3/L1  2021      W-C    0.2283    0.0368  0.1142 0.9995
      O Starch T1/S3/L2  2020      W-C   -0.5461    0.0814  0.2337 0.9955
      O Starch T1/S3/L2  2021      W-C    0.2283    0.0778  0.2357 0.9954
      O Starch T2/S1/L1  2020      W-C   -1.2283   -0.2107 -0.6582 0.9126
      O Starch T2/S1/L1  2021      W-C    0.2283    0.0562  0.1754 0.9981
      O Starch T2/S1/L2  2020      W-C   -1.2283   -1.2224 -0.8497 0.8306
      O Starch T2/S1/L2  2021      W-C    0.2283    0.2343  0.1629 0.9985
      O Starch T2/S2/L1  2020      W-C   -1.2283   -0.2107 -0.6582 0.9126
      O Starch T2/S2/L1  2021      W-C    0.2283    0.0562  0.1754 0.9981
      O Starch T2/S2/L2  2020      W-C   -1.2283   -0.1471 -0.6256 0.9239
      O Starch T2/S2/L2  2021      W-C    0.2283    0.0472  0.2006 0.9971
      O Starch T2/S3/L1  2020      W-C   -1.2283   -0.2107 -0.6582 0.9126
      O Starch T2/S3/L1  2021      W-C    0.2283    0.0562  0.1754 0.9981
      O Starch T2/S3/L2  2020      W-C   -0.5461    0.0914  0.3077 0.9899
      O Starch T2/S3/L2  2021      W-C    0.2283    0.0840  0.3004 0.9906
      O  Sugar T1/S1/L1  2020      W-C    0.6092    0.1885  1.2507 0.5942
      O  Sugar T1/S1/L1  2021      W-C   -0.8375   -0.1588 -1.0532 0.7177
      O  Sugar T1/S1/L2  2020      W-C    0.6092    0.7686  1.1621 0.6508
      O  Sugar T1/S1/L2  2021      W-C   -0.8375   -0.6781 -1.0252 0.7348
      O  Sugar T1/S2/L1  2020      W-C    0.6092    0.1885  1.2507 0.5942
      O  Sugar T1/S2/L1  2021      W-C   -0.8375   -0.1588 -1.0532 0.7177
      O  Sugar T1/S2/L2  2020      W-C    0.6092    0.2337  1.7241 0.3110
      O  Sugar T1/S2/L2  2021      W-C   -0.8375   -0.1242 -0.9166 0.7960
      O  Sugar T1/S3/L1  2020      W-C    0.6092    0.1885  1.2507 0.5942
      O  Sugar T1/S3/L1  2021      W-C   -0.8375   -0.1588 -1.0532 0.7177
      O  Sugar T1/S3/L2  2020      W-C    0.1842    0.0720  0.5706 0.9408
      O  Sugar T1/S3/L2  2021      W-C   -0.8375   -0.1758 -1.4138 0.4911
      O  Sugar T2/S1/L1  2020      W-C    0.6092    0.1912  1.1499 0.6584
      O  Sugar T2/S1/L1  2021      W-C   -0.8375   -0.1561 -0.9388 0.7839
      O  Sugar T2/S1/L2  2020      W-C    0.6092    0.7858  1.1077 0.6848
      O  Sugar T2/S1/L2  2021      W-C   -0.8375   -0.6610 -0.9318 0.7877
      O  Sugar T2/S2/L1  2020      W-C    0.6092    0.1912  1.1499 0.6584
      O  Sugar T2/S2/L1  2021      W-C   -0.8375   -0.1561 -0.9388 0.7839
      O  Sugar T2/S2/L2  2020      W-C    0.6092    0.2474  1.5700 0.3957
      O  Sugar T2/S2/L2  2021      W-C   -0.8375   -0.1106 -0.7017 0.8965
      O  Sugar T2/S3/L1  2020      W-C    0.6092    0.1912  1.1499 0.6584
      O  Sugar T2/S3/L1  2021      W-C   -0.8375   -0.1561 -0.9388 0.7839
      O  Sugar T2/S3/L2  2020      W-C    0.1842    0.0673  0.5178 0.9549
      O  Sugar T2/S3/L2  2021      W-C   -0.8375   -0.1803 -1.4071 0.4947
      O  Photo T1/S1/L1  2020      W-C    2.2524    0.3455  1.3426 0.5354
      O  Photo T1/S1/L1  2021      W-C   -0.3788   -0.0498 -0.1934 0.9974
      O  Photo T1/S1/L2  2020      W-C    2.2524    2.2524  1.7541 0.2956
      O  Photo T1/S1/L2  2021      W-C   -0.3788   -0.3788 -0.2950 0.9911
      O  Photo T1/S2/L1  2020      W-C    2.2524    0.3455  1.3426 0.5354
      O  Photo T1/S2/L1  2021      W-C   -0.3788   -0.0498 -0.1934 0.9974
      O  Photo T1/S2/L2  2020      W-C    2.2524    0.4006  1.5232 0.4236
      O  Photo T1/S2/L2  2021      W-C   -0.3788   -0.0363 -0.1381 0.9991
      O  Photo T1/S3/L1  2020      W-C    2.2524    0.3455  1.3426 0.5354
      O  Photo T1/S3/L1  2021      W-C   -0.3788   -0.0498 -0.1934 0.9974
      O  Photo T1/S3/L2  2020      W-C    2.2524    0.4048  1.6774 0.3355
      O  Photo T1/S3/L2  2021      W-C   -0.3788   -0.0432 -0.1791 0.9980
      O  Photo T2/S1/L1  2020      W-C    2.2524    0.3449  1.2177 0.6155
      O  Photo T2/S1/L1  2021      W-C   -0.3788   -0.0504 -0.1779 0.9980
      O  Photo T2/S1/L2  2020      W-C    2.2524    2.2759  1.7224 0.3120
      O  Photo T2/S1/L2  2021      W-C   -0.3788   -0.3552 -0.2688 0.9932
      O  Photo T2/S2/L1  2020      W-C    2.2524    0.3449  1.2177 0.6155
      O  Photo T2/S2/L1  2021      W-C   -0.3788   -0.0504 -0.1779 0.9980
      O  Photo T2/S2/L2  2020      W-C    2.2524    0.4269  1.4350 0.4773
      O  Photo T2/S2/L2  2021      W-C   -0.3788   -0.0100 -0.0337 1.0000
      O  Photo T2/S3/L1  2020      W-C    2.2524    0.3449  1.2177 0.6155
      O  Photo T2/S3/L1  2021      W-C   -0.3788   -0.0504 -0.1779 0.9980
      O  Photo T2/S3/L2  2020      W-C    2.2524    0.4184  1.6258 0.3641
      O  Photo T2/S3/L2  2021      W-C   -0.3788   -0.0296 -0.1151 0.9995

Significant W-C contrasts per reading:
reading
T1/S1/L1    0
T1/S1/L2    0
T1/S2/L1    0
T1/S2/L2    0
T1/S3/L1    0
T1/S3/L2    0
T2/S1/L1    0
T2/S1/L2    0
T2/S2/L1    0
T2/S2/L2    0
T2/S3/L1    0
T2/S3/L2    0

Result: reproduced. No W against C contrast of starch, sugar or Asat in oak is significant in 2020 or 2021 under any of the twelve readings (T1 or T2, S1 to S3, L1 or L2; smallest adjusted p 0.30).

fig4-beech-mr¶

In beech, lower soil moisture alone reduced Asat in 2021, height increment in 2021, diameter increment in 2020 and 2021, and AGWB increment in 2021.

In [23]:
t = table("B", LEAF_C + GROWTH, "MR-C")
print(t.round(4).to_string(index=False))
named = [("Photo", 2021), ("Height_growth", 2021), ("Diameter_growth", 2020), ("Diameter_growth", 2021), ("AGB_growth", 2021)]
rows = []
for reading in [(T, S, L) for T in YEARS for S in SS for L in ("L1", "L2")]:
    hits = {f"{tr} {yr}": below("B", tr, reading if tr in LEAF_C else (reading[0], reading[1], "L1"), yr, "MR-C") for tr, yr in named}
    n = sum(hits.values())
    rows.append({"reading": "/".join(reading), **hits, "n": n,
                 "outcome": "reproduced" if n == 5 else "partially_reproduced" if n >= 3 else "not_reproduced"})
print(pd.DataFrame(rows).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B          Starch T1/S1/L1  2020     MR-C   -1.5815   -1.5980 -1.0197 0.7378
      B          Starch T1/S1/L1  2021     MR-C    3.1649    3.1484  2.0091 0.1845
      B          Starch T1/S1/L2  2020     MR-C   -1.7193   -1.7193 -0.9904 0.7548
      B          Starch T1/S1/L2  2021     MR-C    3.6167    3.6167  2.0834 0.1585
      B          Starch T1/S2/L1  2020     MR-C   -1.5815   -0.5065 -1.4141 0.4904
      B          Starch T1/S2/L1  2021     MR-C    3.1649    0.6810  1.9014 0.2274
      B          Starch T1/S2/L2  2020     MR-C   -1.7193   -0.3351 -1.2821 0.5745
      B          Starch T1/S2/L2  2021     MR-C    3.6167    0.5729  2.1919 0.1255
      B          Starch T1/S3/L1  2020     MR-C   -0.7598   -0.1563 -0.4348 0.9725
      B          Starch T1/S3/L1  2021     MR-C    3.1649    0.6892  1.9985 0.1884
      B          Starch T1/S3/L2  2020     MR-C   -1.6831   -0.4858 -1.3468 0.5330
      B          Starch T1/S3/L2  2021     MR-C    0.5787    0.1026  0.2742 0.9928
      B          Starch T2/S1/L1  2020     MR-C   -1.5815   -1.5852 -0.8352 0.8376
      B          Starch T2/S1/L1  2021     MR-C    3.1649    3.1612  1.6656 0.3421
      B          Starch T2/S1/L2  2020     MR-C   -1.7193   -1.7193 -0.8236 0.8434
      B          Starch T2/S1/L2  2021     MR-C    3.6167    3.6167  1.7326 0.3069
      B          Starch T2/S2/L1  2020     MR-C   -1.5815   -0.5013 -1.1903 0.6326
      B          Starch T2/S2/L1  2021     MR-C    3.1649    0.6862  1.6292 0.3621
      B          Starch T2/S2/L2  2020     MR-C   -1.7193   -0.3351 -1.0784 0.7028
      B          Starch T2/S2/L2  2021     MR-C    3.6167    0.5729  1.8437 0.2533
      B          Starch T2/S3/L1  2020     MR-C   -0.7598   -0.1495 -0.3572 0.9844
      B          Starch T2/S3/L1  2021     MR-C    3.1649    0.6930  1.7212 0.3127
      B          Starch T2/S3/L2  2020     MR-C   -1.6831   -0.4858 -1.1507 0.6577
      B          Starch T2/S3/L2  2021     MR-C    0.5787    0.1026  0.2343 0.9955
      B           Sugar T1/S1/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B           Sugar T1/S1/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B           Sugar T1/S1/L2  2020     MR-C    0.1634    0.1528  0.2109 0.9967
      B           Sugar T1/S1/L2  2021     MR-C   -1.6469   -1.6277 -2.2419 0.1121
      B           Sugar T1/S2/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B           Sugar T1/S2/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B           Sugar T1/S2/L2  2020     MR-C    0.1634    0.0186  0.1441 0.9989
      B           Sugar T1/S2/L2  2021     MR-C   -1.6469   -0.2743 -2.1271 0.1447
      B           Sugar T1/S3/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B           Sugar T1/S3/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B           Sugar T1/S3/L2  2020     MR-C    0.1634    0.0154  0.0952 0.9997
      B           Sugar T1/S3/L2  2021     MR-C   -1.6469   -0.3777 -2.3195 0.0937
      B           Sugar T2/S1/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B           Sugar T2/S1/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B           Sugar T2/S1/L2  2020     MR-C    0.1634    0.1634  0.2345 0.9955
      B           Sugar T2/S1/L2  2021     MR-C   -1.6469   -1.6469 -2.3645 0.0842
      B           Sugar T2/S2/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B           Sugar T2/S2/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B           Sugar T2/S2/L2  2020     MR-C    0.1634    0.0194  0.1422 0.9990
      B           Sugar T2/S2/L2  2021     MR-C   -1.6469   -0.2759 -2.0234 0.1795
      B           Sugar T2/S3/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B           Sugar T2/S3/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B           Sugar T2/S3/L2  2020     MR-C    0.1634    0.0156  0.1014 0.9996
      B           Sugar T2/S3/L2  2021     MR-C   -1.6469   -0.3857 -2.5073 0.0590
      B           Photo T1/S1/L1  2020     MR-C   -1.6490   -0.5066 -2.3477 0.0871
      B           Photo T1/S1/L1  2021     MR-C   -5.9049   -1.2975 -6.0133 0.0000
      B           Photo T1/S1/L2  2020     MR-C   -1.6490   -0.4058 -1.9978 0.1887
      B           Photo T1/S1/L2  2021     MR-C   -5.9049   -1.3095 -6.4462 0.0000
      B           Photo T1/S2/L1  2020     MR-C   -1.6490   -0.5066 -2.3477 0.0871
      B           Photo T1/S2/L1  2021     MR-C   -5.9049   -1.2975 -6.0133 0.0000
      B           Photo T1/S2/L2  2020     MR-C   -1.6490   -0.4058 -1.9978 0.1887
      B           Photo T1/S2/L2  2021     MR-C   -5.9049   -1.3095 -6.4462 0.0000
      B           Photo T1/S3/L1  2020     MR-C   -1.6490   -0.5066 -2.3477 0.0871
      B           Photo T1/S3/L1  2021     MR-C   -5.9049   -1.2975 -6.0133 0.0000
      B           Photo T1/S3/L2  2020     MR-C   -1.6490   -0.4058 -1.9978 0.1887
      B           Photo T1/S3/L2  2021     MR-C   -5.9049   -1.3095 -6.4462 0.0000
      B           Photo T2/S1/L1  2020     MR-C   -1.6490   -0.4388 -1.8065 0.2700
      B           Photo T2/S1/L1  2021     MR-C   -5.9049   -1.2297 -5.0632 0.0000
      B           Photo T2/S1/L2  2020     MR-C   -1.6490   -0.3489 -1.4682 0.4573
      B           Photo T2/S1/L2  2021     MR-C   -5.9049   -1.2526 -5.2706 0.0000
      B           Photo T2/S2/L1  2020     MR-C   -1.6490   -0.4388 -1.8065 0.2700
      B           Photo T2/S2/L1  2021     MR-C   -5.9049   -1.2297 -5.0632 0.0000
      B           Photo T2/S2/L2  2020     MR-C   -1.6490   -0.3489 -1.4682 0.4573
      B           Photo T2/S2/L2  2021     MR-C   -5.9049   -1.2526 -5.2706 0.0000
      B           Photo T2/S3/L1  2020     MR-C   -1.6490   -0.4388 -1.8065 0.2700
      B           Photo T2/S3/L1  2021     MR-C   -5.9049   -1.2297 -5.0632 0.0000
      B           Photo T2/S3/L2  2020     MR-C   -1.6490   -0.3489 -1.4682 0.4573
      B           Photo T2/S3/L2  2021     MR-C   -5.9049   -1.2526 -5.2706 0.0000
      B   Height_growth T1/S1/L1  2020     MR-C   -0.0833   -0.0833 -0.0282 1.0000
      B   Height_growth T1/S1/L1  2021     MR-C   -9.5833   -9.5833 -3.2392 0.0066
      B   Height_growth T1/S2/L1  2020     MR-C   -0.0833   -0.0044 -0.0103 1.0000
      B   Height_growth T1/S2/L1  2021     MR-C   -9.5833   -1.6917 -3.9531 0.0004
      B   Height_growth T1/S3/L1  2020     MR-C   -0.0833    0.0004  0.0007 1.0000
      B   Height_growth T1/S3/L1  2021     MR-C   -8.6333   -1.8508 -3.1362 0.0091
      B   Height_growth T2/S1/L1  2020     MR-C   -0.0833   -0.0833 -0.0283 1.0000
      B   Height_growth T2/S1/L1  2021     MR-C   -9.5833   -9.5833 -3.2501 0.0064
      B   Height_growth T2/S2/L1  2020     MR-C   -0.0833   -0.0044 -0.0103 1.0000
      B   Height_growth T2/S2/L1  2021     MR-C   -9.5833   -1.6917 -3.9506 0.0004
      B   Height_growth T2/S3/L1  2020     MR-C   -0.0833    0.0004  0.0007 1.0000
      B   Height_growth T2/S3/L1  2021     MR-C   -8.6333   -1.8508 -3.3212 0.0051
      B Diameter_growth T1/S1/L1  2020     MR-C   -0.2483   -0.2483 -0.5068 0.9575
      B Diameter_growth T1/S1/L1  2021     MR-C   -1.5583   -1.5583 -3.1806 0.0080
      B Diameter_growth T1/S2/L1  2020     MR-C   -0.2483   -0.0749 -0.4412 0.9713
      B Diameter_growth T1/S2/L1  2021     MR-C   -1.5583   -0.5281 -3.1118 0.0099
      B Diameter_growth T1/S3/L1  2020     MR-C   -0.2483   -0.2320 -0.8937 0.8081
      B Diameter_growth T1/S3/L1  2021     MR-C   -0.3517   -0.1646 -0.3388 0.9860
      B Diameter_growth T2/S1/L1  2020     MR-C   -0.2483   -0.2483 -0.4936 0.9605
      B Diameter_growth T2/S1/L1  2021     MR-C   -1.5583   -1.5583 -3.0972 0.0103
      B Diameter_growth T2/S2/L1  2020     MR-C   -0.2483   -0.0749 -0.3992 0.9785
      B Diameter_growth T2/S2/L1  2021     MR-C   -1.5583   -0.5281 -2.8153 0.0251
      B Diameter_growth T2/S3/L1  2020     MR-C   -0.2483   -0.2319 -0.9280 0.7897
      B Diameter_growth T2/S3/L1  2021     MR-C   -0.3517   -0.1578 -0.3383 0.9860
      B      AGB_growth T1/S1/L1  2020     MR-C    0.6221   -0.1384 -0.1995 0.9972
      B      AGB_growth T1/S1/L1  2021     MR-C   -9.3633   -2.0564 -2.9639 0.0159
      B      AGB_growth T1/S2/L1  2020     MR-C    0.6221   -0.1384 -0.1995 0.9972
      B      AGB_growth T1/S2/L1  2021     MR-C   -9.3633   -2.0564 -2.9639 0.0159
      B      AGB_growth T1/S3/L1  2020     MR-C    0.6221   -0.1384 -0.1995 0.9972
      B      AGB_growth T1/S3/L1  2021     MR-C   -9.3633   -2.0564 -2.9639 0.0159
      B      AGB_growth T2/S1/L1  2020     MR-C    0.6221   -0.1029 -0.1351 0.9991
      B      AGB_growth T2/S1/L1  2021     MR-C   -9.3633   -2.0208 -2.6536 0.0396
      B      AGB_growth T2/S2/L1  2020     MR-C    0.6221   -0.1029 -0.1351 0.9991
      B      AGB_growth T2/S2/L1  2021     MR-C   -9.3633   -2.0208 -2.6536 0.0396
      B      AGB_growth T2/S3/L1  2020     MR-C    0.6221   -0.1029 -0.1351 0.9991
      B      AGB_growth T2/S3/L1  2021     MR-C   -9.3633   -2.0208 -2.6536 0.0396
 reading  Photo 2021  Height_growth 2021  Diameter_growth 2020  Diameter_growth 2021  AGB_growth 2021  n              outcome
T1/S1/L1        True                True                 False                  True             True  4 partially_reproduced
T1/S1/L2        True                True                 False                  True             True  4 partially_reproduced
T1/S2/L1        True                True                 False                  True             True  4 partially_reproduced
T1/S2/L2        True                True                 False                  True             True  4 partially_reproduced
T1/S3/L1        True                True                 False                 False             True  3 partially_reproduced
T1/S3/L2        True                True                 False                 False             True  3 partially_reproduced
T2/S1/L1        True                True                 False                  True             True  4 partially_reproduced
T2/S1/L2        True                True                 False                  True             True  4 partially_reproduced
T2/S2/L1        True                True                 False                  True             True  4 partially_reproduced
T2/S2/L2        True                True                 False                  True             True  4 partially_reproduced
T2/S3/L1        True                True                 False                 False             True  3 partially_reproduced
T2/S3/L2        True                True                 False                 False             True  3 partially_reproduced

Result: partially reproduced. In beech, MR is below C for Asat in 2021 (raw -5.90, adjusted p < 0.0001), height increment in 2021 (-9.6 cm, p 0.0004 to 0.0091) and AGWB increment in 2021 (-9.4 g, p 0.016 and 0.040) under every reading. Diameter increment in 2021 (-1.56) is below C under S1 and S2 (p 0.008 to 0.025) but not under S3 (-0.35 on the rows kept, p 0.99), and diameter increment in 2020 under none. Four of the five hold under S1 and S2 and three under S3, all partial.

fig4-oak-mr¶

In oak, lower soil moisture alone reduced Asat and height, diameter and AGWB increments in both 2020 and 2021.

In [24]:
t = table("O", ["Photo"] + GROWTH, "MR-C")
print(t.round(4).to_string(index=False))

def count_table(sp, label, trait_years, full, partial_min):
    rows = []
    for reading in [(T, S, L) for T in YEARS for S in SS for L in ("L1", "L2")]:
        hits = {f"{tr} {yr}": below(sp, tr, reading if tr in LEAF_C else (reading[0], reading[1], "L1"), yr, label)
                for tr, yr in trait_years}
        n = sum(hits.values())
        rows.append({"reading": "/".join(reading), **hits, "n": n,
                     "outcome": "reproduced" if n == full else "partially_reproduced" if n >= partial_min else "not_reproduced"})
    return pd.DataFrame(rows)

print(count_table("O", "MR-C", [(tr, yr) for tr in ["Photo"] + GROWTH for yr in (2020, 2021)], 8, 4).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      O           Photo T1/S1/L1  2020     MR-C   -4.9883   -0.9858 -3.8306 0.0007
      O           Photo T1/S1/L1  2021     MR-C   -3.4219   -0.6058 -2.3541 0.0861
      O           Photo T1/S1/L2  2020     MR-C   -4.9883   -4.9883 -3.8846 0.0006
      O           Photo T1/S1/L2  2021     MR-C   -3.4219   -3.4219 -2.6648 0.0386
      O           Photo T1/S2/L1  2020     MR-C   -4.9883   -0.9858 -3.8306 0.0007
      O           Photo T1/S2/L1  2021     MR-C   -3.4219   -0.6058 -2.3541 0.0861
      O           Photo T1/S2/L2  2020     MR-C   -4.9883   -0.9189 -3.4945 0.0026
      O           Photo T1/S2/L2  2021     MR-C   -3.4219   -0.6804 -2.5873 0.0476
      O           Photo T1/S3/L1  2020     MR-C   -4.9883   -0.9858 -3.8306 0.0007
      O           Photo T1/S3/L1  2021     MR-C   -3.4219   -0.6058 -2.3541 0.0861
      O           Photo T1/S3/L2  2020     MR-C   -4.9883   -0.9076 -3.7608 0.0010
      O           Photo T1/S3/L2  2021     MR-C   -2.9575   -0.5205 -2.1258 0.1453
      O           Photo T2/S1/L1  2020     MR-C   -4.9883   -0.9846 -3.4761 0.0028
      O           Photo T2/S1/L1  2021     MR-C   -3.4219   -0.6046 -2.1347 0.1420
      O           Photo T2/S1/L2  2020     MR-C   -4.9883   -4.9870 -3.7742 0.0009
      O           Photo T2/S1/L2  2021     MR-C   -3.4219   -3.4206 -2.5887 0.0473
      O           Photo T2/S2/L1  2020     MR-C   -4.9883   -0.9846 -3.4761 0.0028
      O           Photo T2/S2/L1  2021     MR-C   -3.4219   -0.6046 -2.1347 0.1420
      O           Photo T2/S2/L2  2020     MR-C   -4.9883   -0.9246 -3.1082 0.0104
      O           Photo T2/S2/L2  2021     MR-C   -3.4219   -0.6860 -2.3063 0.0965
      O           Photo T2/S3/L1  2020     MR-C   -4.9883   -0.9846 -3.4761 0.0028
      O           Photo T2/S3/L1  2021     MR-C   -3.4219   -0.6046 -2.1347 0.1420
      O           Photo T2/S3/L2  2020     MR-C   -4.9883   -0.9055 -3.5184 0.0024
      O           Photo T2/S3/L2  2021     MR-C   -2.9575   -0.5238 -2.0063 0.1855
      O   Height_growth T1/S1/L1  2020     MR-C   -9.5833   -9.0600 -2.2876 0.1002
      O   Height_growth T1/S1/L1  2021     MR-C  -20.8333  -20.3100 -5.1282 0.0000
      O   Height_growth T1/S2/L1  2020     MR-C   -9.5833   -1.1432 -1.9945 0.1897
      O   Height_growth T1/S2/L1  2021     MR-C  -20.8333   -3.1609 -5.5150 0.0000
      O   Height_growth T1/S3/L1  2020     MR-C   -9.5833   -1.2399 -1.9888 0.1920
      O   Height_growth T1/S3/L1  2021     MR-C  -20.3333   -3.4448 -5.3439 0.0000
      O   Height_growth T2/S1/L1  2020     MR-C   -9.5833   -9.5379 -2.4872 0.0616
      O   Height_growth T2/S1/L1  2021     MR-C  -20.8333  -20.7879 -5.4209 0.0000
      O   Height_growth T2/S2/L1  2020     MR-C   -9.5833   -1.2135 -2.1933 0.1250
      O   Height_growth T2/S2/L1  2021     MR-C  -20.8333   -3.2312 -5.8402 0.0000
      O   Height_growth T2/S3/L1  2020     MR-C   -9.5833   -1.3348 -2.2252 0.1162
      O   Height_growth T2/S3/L1  2021     MR-C  -20.3333   -3.4650 -5.5102 0.0000
      O Diameter_growth T1/S1/L1  2020     MR-C   -1.0400   -1.0477 -3.1599 0.0089
      O Diameter_growth T1/S1/L1  2021     MR-C   -1.4033   -1.4110 -4.2557 0.0001
      O Diameter_growth T1/S2/L1  2020     MR-C   -1.0400   -0.4276 -2.9732 0.0156
      O Diameter_growth T1/S2/L1  2021     MR-C   -1.4033   -0.6146 -4.2735 0.0001
      O Diameter_growth T1/S3/L1  2020     MR-C   -1.0400   -0.5552 -3.1313 0.0097
      O Diameter_growth T1/S3/L1  2021     MR-C   -1.3283   -0.7041 -3.7862 0.0008
      O Diameter_growth T2/S1/L1  2020     MR-C   -1.0400   -1.0400 -2.9775 0.0154
      O Diameter_growth T2/S1/L1  2021     MR-C   -1.4033   -1.4033 -4.0178 0.0003
      O Diameter_growth T2/S2/L1  2020     MR-C   -1.0400   -0.4256 -2.7796 0.0278
      O Diameter_growth T2/S2/L1  2021     MR-C   -1.4033   -0.6126 -4.0009 0.0004
      O Diameter_growth T2/S3/L1  2020     MR-C   -1.0400   -0.5552 -2.9286 0.0180
      O Diameter_growth T2/S3/L1  2021     MR-C   -1.3283   -0.7041 -3.5411 0.0021
      O      AGB_growth T1/S1/L1  2020     MR-C  -16.5265   -2.7719 -3.3398 0.0047
      O      AGB_growth T1/S1/L1  2021     MR-C  -35.9234   -4.8258 -5.8144 0.0000
      O      AGB_growth T1/S2/L1  2020     MR-C  -16.5265   -2.7719 -3.3398 0.0047
      O      AGB_growth T1/S2/L1  2021     MR-C  -35.9234   -4.8258 -5.8144 0.0000
      O      AGB_growth T1/S3/L1  2020     MR-C  -16.5265   -2.7719 -3.3398 0.0047
      O      AGB_growth T1/S3/L1  2021     MR-C  -35.9234   -4.8258 -5.8144 0.0000
      O      AGB_growth T2/S1/L1  2020     MR-C  -16.5265   -2.8029 -3.1485 0.0092
      O      AGB_growth T2/S1/L1  2021     MR-C  -35.9234   -4.8568 -5.4556 0.0000
      O      AGB_growth T2/S2/L1  2020     MR-C  -16.5265   -2.8029 -3.1485 0.0092
      O      AGB_growth T2/S2/L1  2021     MR-C  -35.9234   -4.8568 -5.4556 0.0000
      O      AGB_growth T2/S3/L1  2020     MR-C  -16.5265   -2.8029 -3.1485 0.0092
      O      AGB_growth T2/S3/L1  2021     MR-C  -35.9234   -4.8568 -5.4556 0.0000
 reading  Photo 2020  Photo 2021  Height_growth 2020  Height_growth 2021  Diameter_growth 2020  Diameter_growth 2021  AGB_growth 2020  AGB_growth 2021  n              outcome
T1/S1/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T1/S1/L2        True        True               False                True                  True                  True             True             True  7 partially_reproduced
T1/S2/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T1/S2/L2        True        True               False                True                  True                  True             True             True  7 partially_reproduced
T1/S3/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T1/S3/L2        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T2/S1/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T2/S1/L2        True        True               False                True                  True                  True             True             True  7 partially_reproduced
T2/S2/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T2/S2/L2        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T2/S3/L1        True       False               False                True                  True                  True             True             True  6 partially_reproduced
T2/S3/L2        True       False               False                True                  True                  True             True             True  6 partially_reproduced

Result: partially reproduced. Six or seven of the eight trait-years hold under every reading. Height increment in 2020 is not significant under any reading (raw -9.6 cm, smallest adjusted p 0.062). Asat in 2021 is significant on campaign values under T1 with S1 or S2 and under T2 with S1 (p 0.039 to 0.048), not under S3 (p 0.15 and 0.19), and not on yearly means.

fig4-beech-wmr¶

In beech, combined warming and low moisture reduced Asat and diameter increment in 2020 and 2021.

In [25]:
t = table("B", ["Photo", "Diameter_growth"], "WMR-C")
print(t.round(4).to_string(index=False))
print(count_table("B", "WMR-C", [(tr, yr) for tr in ["Photo", "Diameter_growth"] for yr in (2020, 2021)], 4, 2).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B           Photo T1/S1/L1  2020    WMR-C   -1.6693   -0.5364 -2.4860 0.0622
      B           Photo T1/S1/L1  2021    WMR-C   -6.4045   -1.5158 -7.0250 0.0000
      B           Photo T1/S1/L2  2020    WMR-C   -1.6693   -0.4741 -2.3338 0.0904
      B           Photo T1/S1/L2  2021    WMR-C   -6.4045   -1.5251 -7.5073 0.0000
      B           Photo T1/S2/L1  2020    WMR-C   -1.6693   -0.5364 -2.4860 0.0622
      B           Photo T1/S2/L1  2021    WMR-C   -6.4045   -1.5158 -7.0250 0.0000
      B           Photo T1/S2/L2  2020    WMR-C   -1.6693   -0.4741 -2.3338 0.0904
      B           Photo T1/S2/L2  2021    WMR-C   -6.4045   -1.5251 -7.5073 0.0000
      B           Photo T1/S3/L1  2020    WMR-C   -1.6693   -0.5364 -2.4860 0.0622
      B           Photo T1/S3/L1  2021    WMR-C   -6.4045   -1.5158 -7.0250 0.0000
      B           Photo T1/S3/L2  2020    WMR-C   -1.6693   -0.4741 -2.3338 0.0904
      B           Photo T1/S3/L2  2021    WMR-C   -6.4045   -1.5251 -7.5073 0.0000
      B           Photo T2/S1/L1  2020    WMR-C   -1.6693   -0.5150 -2.1205 0.1470
      B           Photo T2/S1/L1  2021    WMR-C   -6.4045   -1.4944 -6.1530 0.0000
      B           Photo T2/S1/L2  2020    WMR-C   -1.6693   -0.4525 -1.9040 0.2263
      B           Photo T2/S1/L2  2021    WMR-C   -6.4045   -1.5035 -6.3262 0.0000
      B           Photo T2/S2/L1  2020    WMR-C   -1.6693   -0.5150 -2.1205 0.1470
      B           Photo T2/S2/L1  2021    WMR-C   -6.4045   -1.4944 -6.1530 0.0000
      B           Photo T2/S2/L2  2020    WMR-C   -1.6693   -0.4525 -1.9040 0.2263
      B           Photo T2/S2/L2  2021    WMR-C   -6.4045   -1.5035 -6.3262 0.0000
      B           Photo T2/S3/L1  2020    WMR-C   -1.6693   -0.5150 -2.1205 0.1470
      B           Photo T2/S3/L1  2021    WMR-C   -6.4045   -1.4944 -6.1530 0.0000
      B           Photo T2/S3/L2  2020    WMR-C   -1.6693   -0.4525 -1.9040 0.2263
      B           Photo T2/S3/L2  2021    WMR-C   -6.4045   -1.5035 -6.3262 0.0000
      B Diameter_growth T1/S1/L1  2020    WMR-C   -0.3000   -0.3000 -0.6123 0.9282
      B Diameter_growth T1/S1/L1  2021    WMR-C   -1.1850   -1.1850 -2.4186 0.0737
      B Diameter_growth T1/S2/L1  2020    WMR-C   -0.3000   -0.0915 -0.5394 0.9494
      B Diameter_growth T1/S2/L1  2021    WMR-C   -1.1850   -0.4902 -2.8884 0.0198
      B Diameter_growth T1/S3/L1  2020    WMR-C   -0.3000   -0.2455 -0.9458 0.7801
      B Diameter_growth T1/S3/L1  2021    WMR-C   -0.4650   -0.2784 -0.8758 0.8105
      B Diameter_growth T2/S1/L1  2020    WMR-C   -0.3000   -0.3000 -0.5963 0.9332
      B Diameter_growth T2/S1/L1  2021    WMR-C   -1.1850   -1.1850 -2.3552 0.0857
      B Diameter_growth T2/S2/L1  2020    WMR-C   -0.3000   -0.0915 -0.4880 0.9618
      B Diameter_growth T2/S2/L1  2021    WMR-C   -1.1850   -0.4902 -2.6132 0.0445
      B Diameter_growth T2/S3/L1  2020    WMR-C   -0.3000   -0.2459 -0.9838 0.7587
      B Diameter_growth T2/S3/L1  2021    WMR-C   -0.4650   -0.2757 -0.9024 0.7962
 reading  Photo 2020  Photo 2021  Diameter_growth 2020  Diameter_growth 2021  n              outcome
T1/S1/L1       False        True                 False                 False  1       not_reproduced
T1/S1/L2       False        True                 False                 False  1       not_reproduced
T1/S2/L1       False        True                 False                  True  2 partially_reproduced
T1/S2/L2       False        True                 False                  True  2 partially_reproduced
T1/S3/L1       False        True                 False                 False  1       not_reproduced
T1/S3/L2       False        True                 False                 False  1       not_reproduced
T2/S1/L1       False        True                 False                 False  1       not_reproduced
T2/S1/L2       False        True                 False                 False  1       not_reproduced
T2/S2/L1       False        True                 False                  True  2 partially_reproduced
T2/S2/L2       False        True                 False                  True  2 partially_reproduced
T2/S3/L1       False        True                 False                 False  1       not_reproduced
T2/S3/L2       False        True                 False                 False  1       not_reproduced

Result: blocked (methods underspecified). Asat under WMR is below C in 2021 (raw -6.40, adjusted p < 0.0001) but not in 2020 (p 0.062 to 0.23); diameter increment in 2021 (-1.19) is significant under S2 (p 0.020 under T1, 0.045 under T2) but not under S1 (p 0.074 and 0.086) or S3 (-0.47 on the rows kept, p 0.81 and 0.80), and not in 2020. One of four holds under S1 and S3 (not reproduced) and two under S2 (partially reproduced), so the readings differ.

fig4-oak-wmr¶

In oak, combined warming and low moisture reduced Asat and height, diameter and AGWB increments in 2020 and 2021.

In [26]:
t = table("O", ["Photo"] + GROWTH, "WMR-C")
print(t.round(4).to_string(index=False))
print(count_table("O", "WMR-C", [(tr, yr) for tr in ["Photo"] + GROWTH for yr in (2020, 2021)], 8, 4).to_string(index=False))
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      O           Photo T1/S1/L1  2020    WMR-C   -6.1148   -1.1974 -4.6529 0.0000
      O           Photo T1/S1/L1  2021    WMR-C   -5.8127   -1.0760 -4.1812 0.0001
      O           Photo T1/S1/L2  2020    WMR-C   -6.1148   -6.1148 -4.7619 0.0000
      O           Photo T1/S1/L2  2021    WMR-C   -5.8127   -5.8127 -4.5267 0.0000
      O           Photo T1/S2/L1  2020    WMR-C   -6.1148   -1.1974 -4.6529 0.0000
      O           Photo T1/S2/L1  2021    WMR-C   -5.8127   -1.0760 -4.1812 0.0001
      O           Photo T1/S2/L2  2020    WMR-C   -6.1148   -1.1393 -4.3329 0.0000
      O           Photo T1/S2/L2  2021    WMR-C   -5.8127   -1.0993 -4.1806 0.0001
      O           Photo T1/S3/L1  2020    WMR-C   -6.1148   -1.1974 -4.6529 0.0000
      O           Photo T1/S3/L1  2021    WMR-C   -5.8127   -1.0760 -4.1812 0.0001
      O           Photo T1/S3/L2  2020    WMR-C   -6.1148   -1.1426 -4.7345 0.0000
      O           Photo T1/S3/L2  2021    WMR-C   -5.8127   -1.1106 -4.6022 0.0000
      O           Photo T2/S1/L1  2020    WMR-C   -6.1148   -1.1982 -4.2303 0.0001
      O           Photo T2/S1/L1  2021    WMR-C   -5.8127   -1.0768 -3.8017 0.0008
      O           Photo T2/S1/L2  2020    WMR-C   -6.1148   -6.1051 -4.6204 0.0000
      O           Photo T2/S1/L2  2021    WMR-C   -5.8127   -5.8030 -4.3917 0.0000
      O           Photo T2/S2/L1  2020    WMR-C   -6.1148   -1.1982 -4.2303 0.0001
      O           Photo T2/S2/L1  2021    WMR-C   -5.8127   -1.0768 -3.8017 0.0008
      O           Photo T2/S2/L2  2020    WMR-C   -6.1148   -1.1353 -3.8166 0.0005
      O           Photo T2/S2/L2  2021    WMR-C   -5.8127   -1.0953 -3.6820 0.0013
      O           Photo T2/S3/L1  2020    WMR-C   -6.1148   -1.1982 -4.2303 0.0001
      O           Photo T2/S3/L1  2021    WMR-C   -5.8127   -1.0768 -3.8017 0.0008
      O           Photo T2/S3/L2  2020    WMR-C   -6.1148   -1.1389 -4.4252 0.0000
      O           Photo T2/S3/L2  2021    WMR-C   -5.8127   -1.1070 -4.3012 0.0000
      O   Height_growth T1/S1/L1  2020    WMR-C  -10.6667  -10.3937 -2.6244 0.0429
      O   Height_growth T1/S1/L1  2021    WMR-C  -20.0833  -19.8104 -5.0021 0.0000
      O   Height_growth T1/S2/L1  2020    WMR-C  -10.6667   -1.4795 -2.5814 0.0482
      O   Height_growth T1/S2/L1  2021    WMR-C  -20.0833   -2.9135 -5.0835 0.0000
      O   Height_growth T1/S3/L1  2020    WMR-C  -10.6667   -1.6462 -2.6408 0.0411
      O   Height_growth T1/S3/L1  2021    WMR-C  -20.0833   -3.4416 -5.5211 0.0000
      O   Height_growth T2/S1/L1  2020    WMR-C  -10.6667  -10.6518 -2.7777 0.0279
      O   Height_growth T2/S1/L1  2021    WMR-C  -20.0833  -20.0685 -5.2333 0.0000
      O   Height_growth T2/S2/L1  2020    WMR-C  -10.6667   -1.4932 -2.6988 0.0350
      O   Height_growth T2/S2/L1  2021    WMR-C  -20.0833   -2.9272 -5.2908 0.0000
      O   Height_growth T2/S3/L1  2020    WMR-C  -10.6667   -1.6447 -2.7418 0.0311
      O   Height_growth T2/S3/L1  2021    WMR-C  -20.0833   -3.4401 -5.7350 0.0000
      O Diameter_growth T1/S1/L1  2020    WMR-C   -1.0533   -1.0572 -3.1885 0.0079
      O Diameter_growth T1/S1/L1  2021    WMR-C   -1.9017   -1.9055 -5.7471 0.0000
      O Diameter_growth T1/S2/L1  2020    WMR-C   -1.0533   -0.4272 -2.9705 0.0157
      O Diameter_growth T1/S2/L1  2021    WMR-C   -1.9017   -1.0309 -7.1686 0.0000
      O Diameter_growth T1/S3/L1  2020    WMR-C   -1.0533   -0.5240 -2.9552 0.0167
      O Diameter_growth T1/S3/L1  2021    WMR-C   -1.5883   -0.9164 -3.6546 0.0013
      O Diameter_growth T2/S1/L1  2020    WMR-C   -1.0533   -1.0533 -3.0157 0.0137
      O Diameter_growth T2/S1/L1  2021    WMR-C   -1.9017   -1.9017 -5.4445 0.0000
      O Diameter_growth T2/S2/L1  2020    WMR-C   -1.0533   -0.4253 -2.7781 0.0279
      O Diameter_growth T2/S2/L1  2021    WMR-C   -1.9017   -1.0291 -6.7212 0.0000
      O Diameter_growth T2/S3/L1  2020    WMR-C   -1.0533   -0.5240 -2.7639 0.0291
      O Diameter_growth T2/S3/L1  2021    WMR-C   -1.5883   -0.9164 -3.4180 0.0034
      O      AGB_growth T1/S1/L1  2020    WMR-C  -17.5074   -3.2215 -3.8815 0.0005
      O      AGB_growth T1/S1/L1  2021    WMR-C  -35.0272   -4.5988 -5.5408 0.0000
      O      AGB_growth T1/S2/L1  2020    WMR-C  -17.5074   -3.2215 -3.8815 0.0005
      O      AGB_growth T1/S2/L1  2021    WMR-C  -35.0272   -4.5988 -5.5408 0.0000
      O      AGB_growth T1/S3/L1  2020    WMR-C  -17.5074   -3.2215 -3.8815 0.0005
      O      AGB_growth T1/S3/L1  2021    WMR-C  -35.0272   -4.5988 -5.5408 0.0000
      O      AGB_growth T2/S1/L1  2020    WMR-C  -17.5074   -3.2165 -3.6131 0.0017
      O      AGB_growth T2/S1/L1  2021    WMR-C  -35.0272   -4.5937 -5.1601 0.0000
      O      AGB_growth T2/S2/L1  2020    WMR-C  -17.5074   -3.2165 -3.6131 0.0017
      O      AGB_growth T2/S2/L1  2021    WMR-C  -35.0272   -4.5937 -5.1601 0.0000
      O      AGB_growth T2/S3/L1  2020    WMR-C  -17.5074   -3.2165 -3.6131 0.0017
      O      AGB_growth T2/S3/L1  2021    WMR-C  -35.0272   -4.5937 -5.1601 0.0000
 reading  Photo 2020  Photo 2021  Height_growth 2020  Height_growth 2021  Diameter_growth 2020  Diameter_growth 2021  AGB_growth 2020  AGB_growth 2021  n    outcome
T1/S1/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T1/S1/L2        True        True                True                True                  True                  True             True             True  8 reproduced
T1/S2/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T1/S2/L2        True        True                True                True                  True                  True             True             True  8 reproduced
T1/S3/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T1/S3/L2        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S1/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S1/L2        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S2/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S2/L2        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S3/L1        True        True                True                True                  True                  True             True             True  8 reproduced
T2/S3/L2        True        True                True                True                  True                  True             True             True  8 reproduced

Result: reproduced. In oak, WMR is below C for Asat, height, diameter and AGWB increments in both 2020 and 2021, all eight under every reading, S3 included (adjusted p 0.0013 or less for Asat; 0.028 to 0.048 for height in 2020; 0.029 or less for the others).

fig4-wmr-same-as-mr¶

Responses to combined warming and low moisture did not differ from responses to low moisture alone.

In [27]:
t = pd.concat([table(sp, LEAF_C + GROWTH, "WMR-MR") for sp in "BO"])
sig = t[t.p_adj < 0.05]
print("Significant WMR-MR contrasts:", len(sig), "of", len(t))
print(sig.round(4).to_string(index=False))
print("\nPer reading (number significant):")
print(t.groupby("reading").apply(lambda g: int((g.p_adj < 0.05).sum())).to_string())
print("\nAll contrasts, absolute raw difference range per trait:")
print(t.groupby(["species", "trait"]).raw_diff.agg(lambda s: f"{s.abs().min():.3g} to {s.abs().max():.3g}").to_string())
Significant WMR-MR contrasts: 2 of 216
species           trait  reading  year contrast  raw_diff  estimate       z  p_adj
      O Diameter_growth T1/S2/L1  2021   WMR-MR   -0.4983   -0.4163 -2.8951 0.0199
      O Diameter_growth T2/S2/L1  2021   WMR-MR   -0.4983   -0.4165 -2.7203 0.0332

Per reading (number significant):
reading
T1/S1/L1    0
T1/S1/L2    0
T1/S2/L1    1
T1/S2/L2    0
T1/S3/L1    0
T1/S3/L2    0
T2/S1/L1    0
T2/S1/L2    0
T2/S2/L1    1
T2/S2/L2    0
T2/S3/L1    0
T2/S3/L2    0

All contrasts, absolute raw difference range per trait:
species  trait          
B        AGB_growth           0.735 to 1.92
         Diameter_growth    0.0517 to 0.373
         Height_growth          0.5 to 3.17
         Photo                0.0202 to 0.5
         Starch                1.81 to 3.67
         Sugar               0.699 to 0.849
O        AGB_growth          0.896 to 0.981
         Diameter_growth    0.0133 to 0.498
         Height_growth         0.25 to 1.08
         Photo                 1.13 to 2.86
         Starch               0.431 to 1.23
         Sugar               0.166 to 0.609

Result: blocked (methods underspecified). Of 216 MR against WMR contrasts, two are significant, both oak diameter increment in 2021 under S2 (raw WMR - MR -0.50, adjusted p 0.020 under T1 and 0.033 under T2); under S1 and S3 none is. The readings differ.

disc-nsc-unchanged-drier-soil¶

Drier soils did not change starch and sugar concentrations in either species.

In [28]:
t = pd.concat([table(sp, ["Starch", "Sugar"], "MR-C") for sp in "BO"])
print(t.round(4).to_string(index=False))
print("\nSignificant MR-C per reading:"); print(t.groupby("reading").apply(lambda g: int((g.p_adj < 0.05).sum())).to_string())
v = pd.concat([table(sp, ["Starch", "Sugar"], "WMR-C") for sp in "BO"])
print("\nVariant WMR-C, significant:", int((v.p_adj < 0.05).sum()), "of", len(v))
print(v[v.p_adj < 0.05].round(4).to_string(index=False))
species  trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Starch T1/S1/L1  2020     MR-C   -1.5815   -1.5980 -1.0197 0.7378
      B Starch T1/S1/L1  2021     MR-C    3.1649    3.1484  2.0091 0.1845
      B Starch T1/S1/L2  2020     MR-C   -1.7193   -1.7193 -0.9904 0.7548
      B Starch T1/S1/L2  2021     MR-C    3.6167    3.6167  2.0834 0.1585
      B Starch T1/S2/L1  2020     MR-C   -1.5815   -0.5065 -1.4141 0.4904
      B Starch T1/S2/L1  2021     MR-C    3.1649    0.6810  1.9014 0.2274
      B Starch T1/S2/L2  2020     MR-C   -1.7193   -0.3351 -1.2821 0.5745
      B Starch T1/S2/L2  2021     MR-C    3.6167    0.5729  2.1919 0.1255
      B Starch T1/S3/L1  2020     MR-C   -0.7598   -0.1563 -0.4348 0.9725
      B Starch T1/S3/L1  2021     MR-C    3.1649    0.6892  1.9985 0.1884
      B Starch T1/S3/L2  2020     MR-C   -1.6831   -0.4858 -1.3468 0.5330
      B Starch T1/S3/L2  2021     MR-C    0.5787    0.1026  0.2742 0.9928
      B Starch T2/S1/L1  2020     MR-C   -1.5815   -1.5852 -0.8352 0.8376
      B Starch T2/S1/L1  2021     MR-C    3.1649    3.1612  1.6656 0.3421
      B Starch T2/S1/L2  2020     MR-C   -1.7193   -1.7193 -0.8236 0.8434
      B Starch T2/S1/L2  2021     MR-C    3.6167    3.6167  1.7326 0.3069
      B Starch T2/S2/L1  2020     MR-C   -1.5815   -0.5013 -1.1903 0.6326
      B Starch T2/S2/L1  2021     MR-C    3.1649    0.6862  1.6292 0.3621
      B Starch T2/S2/L2  2020     MR-C   -1.7193   -0.3351 -1.0784 0.7028
      B Starch T2/S2/L2  2021     MR-C    3.6167    0.5729  1.8437 0.2533
      B Starch T2/S3/L1  2020     MR-C   -0.7598   -0.1495 -0.3572 0.9844
      B Starch T2/S3/L1  2021     MR-C    3.1649    0.6930  1.7212 0.3127
      B Starch T2/S3/L2  2020     MR-C   -1.6831   -0.4858 -1.1507 0.6577
      B Starch T2/S3/L2  2021     MR-C    0.5787    0.1026  0.2343 0.9955
      B  Sugar T1/S1/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B  Sugar T1/S1/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B  Sugar T1/S1/L2  2020     MR-C    0.1634    0.1528  0.2109 0.9967
      B  Sugar T1/S1/L2  2021     MR-C   -1.6469   -1.6277 -2.2419 0.1121
      B  Sugar T1/S2/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B  Sugar T1/S2/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B  Sugar T1/S2/L2  2020     MR-C    0.1634    0.0186  0.1441 0.9989
      B  Sugar T1/S2/L2  2021     MR-C   -1.6469   -0.2743 -2.1271 0.1447
      B  Sugar T1/S3/L1  2020     MR-C    0.1009    0.0368  0.2177 0.9964
      B  Sugar T1/S3/L1  2021     MR-C   -1.6805   -0.3741 -2.2124 0.1202
      B  Sugar T1/S3/L2  2020     MR-C    0.1634    0.0154  0.0952 0.9997
      B  Sugar T1/S3/L2  2021     MR-C   -1.6469   -0.3777 -2.3195 0.0937
      B  Sugar T2/S1/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B  Sugar T2/S1/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B  Sugar T2/S1/L2  2020     MR-C    0.1634    0.1634  0.2345 0.9955
      B  Sugar T2/S1/L2  2021     MR-C   -1.6469   -1.6469 -2.3645 0.0842
      B  Sugar T2/S2/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B  Sugar T2/S2/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B  Sugar T2/S2/L2  2020     MR-C    0.1634    0.0194  0.1422 0.9990
      B  Sugar T2/S2/L2  2021     MR-C   -1.6469   -0.2759 -2.0234 0.1795
      B  Sugar T2/S3/L1  2020     MR-C    0.1009    0.0366  0.2074 0.9968
      B  Sugar T2/S3/L1  2021     MR-C   -1.6805   -0.3744 -2.1213 0.1466
      B  Sugar T2/S3/L2  2020     MR-C    0.1634    0.0156  0.1014 0.9996
      B  Sugar T2/S3/L2  2021     MR-C   -1.6469   -0.3857 -2.5073 0.0590
      O Starch T1/S1/L1  2020     MR-C   -1.1956   -0.1880 -0.5828 0.9373
      O Starch T1/S1/L1  2021     MR-C   -1.4768   -0.3326 -1.0310 0.7311
      O Starch T1/S1/L2  2020     MR-C   -1.1956   -1.2246 -0.7402 0.8809
      O Starch T1/S1/L2  2021     MR-C   -1.4768   -1.5058 -0.9102 0.7993
      O Starch T1/S2/L1  2020     MR-C   -1.1956   -0.1880 -0.5828 0.9373
      O Starch T1/S2/L1  2021     MR-C   -1.4768   -0.3326 -1.0310 0.7311
      O Starch T1/S2/L2  2020     MR-C   -1.1956   -0.0678 -0.2608 0.9938
      O Starch T1/S2/L2  2021     MR-C   -1.4768   -0.2340 -0.9008 0.8044
      O Starch T1/S3/L1  2020     MR-C   -1.1956   -0.1880 -0.5828 0.9373
      O Starch T1/S3/L1  2021     MR-C   -1.4768   -0.3326 -1.0310 0.7311
      O Starch T1/S3/L2  2020     MR-C   -1.7258   -0.3197 -0.9557 0.7746
      O Starch T1/S3/L2  2021     MR-C   -1.1781   -0.2846 -0.8526 0.8289
      O Starch T2/S1/L1  2020     MR-C   -1.1956   -0.1864 -0.5823 0.9374
      O Starch T2/S1/L1  2021     MR-C   -1.4768   -0.3310 -1.0340 0.7293
      O Starch T2/S1/L2  2020     MR-C   -1.1956   -1.2145 -0.8443 0.8333
      O Starch T2/S1/L2  2021     MR-C   -1.4768   -1.4958 -1.0397 0.7260
      O Starch T2/S2/L1  2020     MR-C   -1.1956   -0.1864 -0.5823 0.9374
      O Starch T2/S2/L1  2021     MR-C   -1.4768   -0.3310 -1.0340 0.7293
      O Starch T2/S2/L2  2020     MR-C   -1.1956   -0.0684 -0.2907 0.9915
      O Starch T2/S2/L2  2021     MR-C   -1.4768   -0.2346 -0.9975 0.7508
      O Starch T2/S3/L1  2020     MR-C   -1.1956   -0.1864 -0.5823 0.9374
      O Starch T2/S3/L1  2021     MR-C   -1.4768   -0.3310 -1.0340 0.7293
      O Starch T2/S3/L2  2020     MR-C   -1.7258   -0.2876 -1.0133 0.7413
      O Starch T2/S3/L2  2021     MR-C   -1.1781   -0.2538 -0.8945 0.8075
      O  Sugar T1/S1/L1  2020     MR-C   -0.3703   -0.0381 -0.2529 0.9943
      O  Sugar T1/S1/L1  2021     MR-C    0.1944    0.0395  0.2621 0.9937
      O  Sugar T1/S1/L2  2020     MR-C   -0.3703   -0.3059 -0.4624 0.9672
      O  Sugar T1/S1/L2  2021     MR-C    0.1944    0.2589  0.3914 0.9797
      O  Sugar T1/S2/L1  2020     MR-C   -0.3703   -0.0381 -0.2529 0.9943
      O  Sugar T1/S2/L1  2021     MR-C    0.1944    0.0395  0.2621 0.9937
      O  Sugar T1/S2/L2  2020     MR-C   -0.3703    0.0269  0.1981 0.9972
      O  Sugar T1/S2/L2  2021     MR-C    0.1944    0.0386  0.2847 0.9920
      O  Sugar T1/S3/L1  2020     MR-C   -0.3703   -0.0381 -0.2529 0.9943
      O  Sugar T1/S3/L1  2021     MR-C    0.1944    0.0395  0.2621 0.9937
      O  Sugar T1/S3/L2  2020     MR-C   -0.7953   -0.1625 -1.2883 0.5704
      O  Sugar T1/S3/L2  2021     MR-C    0.1944    0.0213  0.1709 0.9982
      O  Sugar T2/S1/L1  2020     MR-C   -0.3703   -0.0334 -0.2007 0.9971
      O  Sugar T2/S1/L1  2021     MR-C    0.1944    0.0443  0.2662 0.9934
      O  Sugar T2/S1/L2  2020     MR-C   -0.3703   -0.2736 -0.3858 0.9805
      O  Sugar T2/S1/L2  2021     MR-C    0.1944    0.2911  0.4104 0.9767
      O  Sugar T2/S2/L1  2020     MR-C   -0.3703   -0.0334 -0.2007 0.9971
      O  Sugar T2/S2/L1  2021     MR-C    0.1944    0.0443  0.2662 0.9934
      O  Sugar T2/S2/L2  2020     MR-C   -0.3703    0.0393  0.2497 0.9945
      O  Sugar T2/S2/L2  2021     MR-C    0.1944    0.0511  0.3241 0.9882
      O  Sugar T2/S3/L1  2020     MR-C   -0.3703   -0.0334 -0.2007 0.9971
      O  Sugar T2/S3/L1  2021     MR-C    0.1944    0.0443  0.2662 0.9934
      O  Sugar T2/S3/L2  2020     MR-C   -0.7953   -0.1622 -1.2480 0.5960
      O  Sugar T2/S3/L2  2021     MR-C    0.1944    0.0216  0.1687 0.9983

Significant MR-C per reading:
reading
T1/S1/L1    0
T1/S1/L2    0
T1/S2/L1    0
T1/S2/L2    0
T1/S3/L1    0
T1/S3/L2    0
T2/S1/L1    0
T2/S1/L2    0
T2/S2/L1    0
T2/S2/L2    0
T2/S3/L1    0
T2/S3/L2    0

Variant WMR-C, significant: 1 of 96
species  trait  reading  year contrast  raw_diff  estimate       z  p_adj
      B Starch T1/S3/L2  2020    WMR-C   -3.8033   -1.0173 -2.7756 0.0281

Result: reproduced. No MR against C contrast of starch or sugar is significant in either species or year under any of the twelve readings (smallest adjusted p 0.059, beech sugar in 2021 on campaign values under T2 and S3). In the WMR against C variant one of 96 is significant, beech starch in 2020 on campaign values under T1 and S3 (raw -3.80 %, p 0.028).

disc-beech-asat-more-impaired¶

Low soil moisture impaired Asat more strongly in beech than in oak.

In [29]:
m = ty[(ty.Mixture == "Monoculture") & ty.Year.isin([2020, 2021])]
rows = []
for X in (["MR"], ["MR", "WMR"], ["WMR"]):
    for yrs in ([2020], [2021], [2020, 2021]):
        res = {}
        for sp in "BO":
            s = m[(m.Species == sp) & m.Year.isin(yrs)]
            c = s[s.treat == "C"].Photo.mean()
            x = s[s.treat.isin(X)].Photo.mean()
            res[sp] = (c, x)
        r1 = {sp: (c - x) / c for sp, (c, x) in res.items()}
        r2 = {sp: c - x for sp, (c, x) in res.items()}
        rows.append({"X": "+".join(X), "years": "+".join(map(str, yrs)), "C_beech": res["B"][0], "X_beech": res["B"][1],
                     "C_oak": res["O"][0], "X_oak": res["O"][1], "r1_beech": r1["B"], "r1_oak": r1["O"], "r2_beech": r2["B"],
                     "r2_oak": r2["O"], "r1_beech_larger": r1["B"] > r1["O"], "r2_beech_larger": r2["B"] > r2["O"]})
imp = pd.DataFrame(rows)
print(imp.round(3).to_string(index=False))
named = imp[imp.X != "WMR"]
print("\nReadings of the criterion (X = MR or MR+WMR): beech larger in",
      int(named.r1_beech_larger.sum() + named.r2_beech_larger.sum()), "of", 2 * len(named))
     X     years  C_beech  X_beech  C_oak  X_oak  r1_beech  r1_oak  r2_beech  r2_oak  r1_beech_larger  r2_beech_larger
    MR      2020    3.501    1.852 10.359  5.371     0.471   0.482     1.649   4.988            False            False
    MR      2021    8.243    2.339 11.257  7.835     0.716   0.304     5.905   3.422             True             True
    MR 2020+2021    5.872    2.095 10.808  6.603     0.643   0.389     3.777   4.205             True            False
MR+WMR      2020    3.501    1.842 10.359  4.808     0.474   0.536     1.659   5.552            False            False
MR+WMR      2021    8.243    2.089 11.257  6.639     0.747   0.410     6.155   4.617             True             True
MR+WMR 2020+2021    5.872    1.965 10.808  5.724     0.665   0.470     3.907   5.084             True            False
   WMR      2020    3.501    1.832 10.359  4.244     0.477   0.590     1.669   6.115            False            False
   WMR      2021    8.243    1.839 11.257  5.444     0.777   0.516     6.405   5.813             True             True
   WMR 2020+2021    5.872    1.835 10.808  4.844     0.687   0.552     4.037   5.964             True            False

Readings of the criterion (X = MR or MR+WMR): beech larger in 6 of 12

Result: blocked (methods underspecified). The reduction of Asat is larger in beech in 6 of the 12 readings: in 2021 under both measures (MR: relative 0.72 against 0.30, absolute 5.9 against 3.4), and for the pooled years only as a relative reduction; in 2020 it is larger in oak (MR: 0.47 against 0.48, 1.6 against 5.0).

tables6-no-seasonal-variation¶

Asat, starch and sugar did not vary among the three campaigns of the growing season.

In [30]:
S6Y = {"y1": [2019, 2020, 2021], "y2": [2020, 2021]}
rows = []
for trait in LEAF_C:
    for Y, yrs in S6Y.items():
        for trees in ("mono", "mono+mix"):
            base = ca[ca.Year.isin(yrs) & ((ca.Mixture == "Monoculture") if trees == "mono" else True)]
            for group in ("pooled", "B", "O"):
                sub0 = (base if group == "pooled" else base[base.Species == group]).dropna(subset=[trait])
                for S in SS:
                    sub = sub0.copy()
                    sub["y"], how = o.transform(sub[trait], True, S)
                    sub = sub.dropna(subset=["y"])
                    mdl = o.LME(sub, "y", "(C(W) + C(M) + C(season))**3")
                    for F, a in (("F1", mdl.anova_sequential()), ("F2", mdl.anova_marginal())):
                        rows.append({"trait": trait, "Y": Y, "trees": trees, "species": group, "S": S, "F": F,
                                     "transform": how, "n": len(sub), "converged": mdl.converged,
                                     "season_F": a.F[2], "season_p": a.p[2], "WS_F": a.F[4], "MS_F": a.F[5], "WMS_F": a.F[6]})
s6 = pd.DataFrame(rows)
print("Fits not converged:", int((~s6.converged).sum()))
print(s6.round(4).to_string(index=False))
by = s6.groupby(["Y", "trees", "species", "S", "F"]).season_p.apply(lambda p: bool((p > 0.05).all())).rename("all_three_p_over_005")
print("\nSeason term p > 0.05 for all three traits, per group:")
print(by.unstack("F").to_string())
rd = []
for Y in S6Y:
    for trees in ("mono", "mono+mix"):
        for S in SS:
            for F in ("F1", "F2"):
                a = bool(by.loc[(Y, trees, "pooled", S, F)])
                b = bool(by.loc[(Y, trees, "B", S, F)] and by.loc[(Y, trees, "O", S, F)])
                rd += [{"species": "a (pooled)", "Y": Y, "trees": trees, "S": S, "F": F, "absence_holds": a},
                       {"species": "b (each species)", "Y": Y, "trees": trees, "S": S, "F": F, "absence_holds": b}]
rd = pd.DataFrame(rd)
print("\nReadings of the criterion (a or b, y1 or y2, trees, S1 to S3, F1 or F2):")
print(rd.to_string(index=False))
print("Readings where the absence holds:", int(rd.absence_holds.sum()), "of", len(rd))
print(rd.groupby("F").absence_holds.agg(["sum", "count"]).to_string())
print("\nRange of the season term p per trait and kind of F test, over all readings:")
print(s6.groupby(["trait", "F"]).season_p.agg(["min", "max"]).round(4).to_string())
print("\nCampaign means (monocultures and mixtures, all years):")
print(ca.groupby(["season"])[LEAF_C].mean().round(3).to_string())
# Supplemental Table S6, F values of S, W x S, MR x S and W x MR x S
TABLE_S6 = {"Starch": [2.64, 0.05, 0.93, 0.24], "Sugar": [1.56, 0.04, 2.39, 0.64], "Photo": [2.03, 0.22, 0.79, 0.09]}
s6["F_paper"] = s6.trait.map(lambda t: TABLE_S6[t][0])
cmp_ = s6.assign(maxdiff=s6.apply(lambda r: max(abs(a - b) for a, b in zip([r.season_F, r.WS_F, r.MS_F, r.WMS_F], TABLE_S6[r.trait])), axis=1))
print("\nThe four season terms against Table S6, per trait and group: the 10 closest of", len(cmp_), "fits")
print(cmp_.sort_values("maxdiff").head(10)[["trait", "Y", "trees", "species", "S", "F", "season_F", "WS_F", "MS_F", "WMS_F", "maxdiff"]].round(3).to_string(index=False))
whole = cmp_.groupby(["Y", "trees", "species", "S", "F"]).maxdiff.max().sort_values()
print("\nLargest difference in F over all three traits and four terms, per reading (the 10 closest of", len(whole), "):")
print(whole.head(10).round(3).to_string())
print("Table S6:", TABLE_S6)
Fits not converged: 0
 trait  Y    trees species  S  F                      transform   n  converged  season_F  season_p   WS_F    MS_F  WMS_F
Starch y1     mono  pooled S1 F1           none (negatives, S1) 427       True    4.1755    0.0160 0.0394  3.5300 0.0405
Starch y1     mono  pooled S1 F2           none (negatives, S1) 427       True    0.0114    0.9887 0.0485  2.1320 0.0405
Starch y1     mono  pooled S2 F1            sqrt(x + 5.25) (S2) 427       True    2.1411    0.1189 0.0571  3.5342 0.0186
Starch y1     mono  pooled S2 F2            sqrt(x + 5.25) (S2) 427       True    0.0582    0.9435 0.0060  1.6024 0.0186
Starch y1     mono  pooled S3 F1 sqrt, 42 negative dropped (S3) 385       True    5.2120    0.0059 0.4126  1.9970 0.0625
Starch y1     mono  pooled S3 F2 sqrt, 42 negative dropped (S3) 385       True    0.0503    0.9510 0.3738  1.1126 0.0625
Starch y1     mono       B S1 F1           none (negatives, S1) 211       True   26.3680    0.0000 0.3797  0.7312 0.0677
Starch y1     mono       B S1 F2           none (negatives, S1) 211       True    7.2816    0.0009 0.1605  0.6216 0.0677
Starch y1     mono       B S2 F1            sqrt(x + 5.25) (S2) 211       True   21.2335    0.0000 0.1468  1.0575 0.0442
Starch y1     mono       B S2 F2            sqrt(x + 5.25) (S2) 211       True    6.8178    0.0014 0.1573  0.6566 0.0442
Starch y1     mono       B S3 F1 sqrt, 27 negative dropped (S3) 184       True   25.0254    0.0000 0.0890  0.7896 0.1830
Starch y1     mono       B S3 F2 sqrt, 27 negative dropped (S3) 184       True    3.7241    0.0263 0.2250  0.6679 0.1830
Starch y1     mono       O S1 F1           none (negatives, S1) 216       True    6.8015    0.0014 0.8983  5.2563 0.0031
Starch y1     mono       O S1 F2           none (negatives, S1) 216       True    7.9544    0.0005 0.5009  2.7577 0.0031
Starch y1     mono       O S2 F1            sqrt(x + 4.61) (S2) 216       True    9.4550    0.0001 0.6058  6.4766 0.0034
Starch y1     mono       O S2 F2            sqrt(x + 4.61) (S2) 216       True    9.6918    0.0001 0.3062  3.2072 0.0034
Starch y1     mono       O S3 F1 sqrt, 15 negative dropped (S3) 201       True    3.7016    0.0266 0.7871  1.9960 0.0654
Starch y1     mono       O S3 F2 sqrt, 15 negative dropped (S3) 201       True    2.9869    0.0530 0.2057  0.6937 0.0654
Starch y1 mono+mix  pooled S1 F1           none (negatives, S1) 852       True    8.6699    0.0002 0.2158  2.4904 1.3425
Starch y1 mono+mix  pooled S1 F2           none (negatives, S1) 852       True    0.9124    0.4020 0.2425  2.6122 1.3425
Starch y1 mono+mix  pooled S2 F1            sqrt(x + 6.28) (S2) 852       True    4.6292    0.0100 0.3595  2.7337 1.0431
Starch y1 mono+mix  pooled S2 F2            sqrt(x + 6.28) (S2) 852       True    0.4169    0.6592 0.0916  2.5491 1.0431
Starch y1 mono+mix  pooled S3 F1 sqrt, 77 negative dropped (S3) 775       True   15.9738    0.0000 0.0484  2.5503 1.2875
Starch y1 mono+mix  pooled S3 F2 sqrt, 77 negative dropped (S3) 775       True    1.8420    0.1592 0.4258  1.7505 1.2875
Starch y1 mono+mix       B S1 F1           none (negatives, S1) 422       True   54.2729    0.0000 1.2152  4.1762 2.5502
Starch y1 mono+mix       B S1 F2           none (negatives, S1) 422       True   17.6182    0.0000 0.1538  1.7863 2.5502
Starch y1 mono+mix       B S2 F1            sqrt(x + 5.25) (S2) 422       True   44.3792    0.0000 1.4865  5.1118 1.7265
Starch y1 mono+mix       B S2 F2            sqrt(x + 5.25) (S2) 422       True   16.7512    0.0000 0.0315  1.9797 1.7265
Starch y1 mono+mix       B S3 F1 sqrt, 43 negative dropped (S3) 379       True   64.0868    0.0000 0.3827  2.7222 2.2891
Starch y1 mono+mix       B S3 F2 sqrt, 43 negative dropped (S3) 379       True   15.7556    0.0000 0.3372  1.5702 2.2891
Starch y1 mono+mix       O S1 F1           none (negatives, S1) 430       True   10.9369    0.0000 0.2142  4.1702 0.0333
Starch y1 mono+mix       O S1 F2           none (negatives, S1) 430       True    7.8032    0.0005 0.2053  2.2914 0.0333
Starch y1 mono+mix       O S2 F1            sqrt(x + 6.28) (S2) 430       True   14.4977    0.0000 0.0994  4.6063 0.0601
Starch y1 mono+mix       O S2 F2            sqrt(x + 6.28) (S2) 430       True    9.5396    0.0001 0.1478  2.6097 0.0601
Starch y1 mono+mix       O S3 F1 sqrt, 34 negative dropped (S3) 396       True    4.6231    0.0104 0.1614  2.3196 0.1732
Starch y1 mono+mix       O S3 F2 sqrt, 34 negative dropped (S3) 396       True    3.0996    0.0462 0.1523  0.8857 0.1732
Starch y2     mono  pooled S1 F1           none (negatives, S1) 284       True   23.0033    0.0000 0.0515  3.7312 0.0060
Starch y2     mono  pooled S1 F2           none (negatives, S1) 284       True    2.1523    0.1183 0.0257  1.9386 0.0060
Starch y2     mono  pooled S2 F1            sqrt(x + 5.25) (S2) 284       True   16.3573    0.0000 0.0419  3.5300 0.1051
Starch y2     mono  pooled S2 F2            sqrt(x + 5.25) (S2) 284       True    1.6544    0.1932 0.0074  1.2108 0.1051
Starch y2     mono  pooled S3 F1 sqrt, 25 negative dropped (S3) 259       True   26.6489    0.0000 0.7994  2.7343 0.3045
Starch y2     mono  pooled S3 F2 sqrt, 25 negative dropped (S3) 259       True    1.3741    0.2551 0.8862  2.0559 0.3045
Starch y2     mono       B S1 F1           none (negatives, S1) 140       True   34.7892    0.0000 0.7116  0.8722 0.0841
Starch y2     mono       B S1 F2           none (negatives, S1) 140       True   10.3456    0.0001 0.4130  0.7074 0.0841
Starch y2     mono       B S2 F1            sqrt(x + 5.25) (S2) 140       True   26.8655    0.0000 0.3378  1.1632 0.1900
Starch y2     mono       B S2 F2            sqrt(x + 5.25) (S2) 140       True    9.1998    0.0002 0.4596  0.7787 0.1900
Starch y2     mono       B S3 F1 sqrt, 17 negative dropped (S3) 123       True   36.3720    0.0000 0.0582  0.9005 0.1737
Starch y2     mono       B S3 F2 sqrt, 17 negative dropped (S3) 123       True    6.3162    0.0026 0.0270  0.8914 0.1737
Starch y2     mono       O S1 F1           none (negatives, S1) 144       True    0.6941    0.5015 1.7531  6.2657 0.2105
Starch y2     mono       O S1 F2           none (negatives, S1) 144       True    2.3421    0.1005 0.9551  3.4253 0.2105
Starch y2     mono       O S2 F1            sqrt(x + 4.61) (S2) 144       True    0.1105    0.8955 1.1106  6.7884 0.2141
Starch y2     mono       O S2 F2            sqrt(x + 4.61) (S2) 144       True    2.8792    0.0601 0.5122  3.5652 0.2141
Starch y2     mono       O S3 F1  sqrt, 8 negative dropped (S3) 136       True    2.0752    0.1303 2.7961  2.9457 0.5694
Starch y2     mono       O S3 F2  sqrt, 8 negative dropped (S3) 136       True    1.1142    0.3318 1.7356  1.9493 0.5694
Starch y2 mono+mix  pooled S1 F1           none (negatives, S1) 568       True   43.0266    0.0000 0.2757  1.9430 1.7397
Starch y2 mono+mix  pooled S1 F2           none (negatives, S1) 568       True    8.6212    0.0002 0.3570  2.4903 1.7397
Starch y2 mono+mix  pooled S2 F1            sqrt(x + 6.28) (S2) 568       True   30.3599    0.0000 0.4368  2.0815 1.1738
Starch y2 mono+mix  pooled S2 F2            sqrt(x + 6.28) (S2) 568       True    6.4001    0.0018 0.1227  2.2279 1.1738
Starch y2 mono+mix  pooled S3 F1 sqrt, 49 negative dropped (S3) 519       True   65.7379    0.0000 0.0555  2.1233 2.0925
Starch y2 mono+mix  pooled S3 F2 sqrt, 49 negative dropped (S3) 519       True    9.6570    0.0001 1.1206  2.5103 2.0925
Starch y2 mono+mix       B S1 F1           none (negatives, S1) 282       True   69.0826    0.0000 0.8843  3.6813 1.9814
Starch y2 mono+mix       B S1 F2           none (negatives, S1) 282       True   22.1589    0.0000 0.1321  1.4542 1.9814
Starch y2 mono+mix       B S2 F1            sqrt(x + 5.25) (S2) 282       True   55.4913    0.0000 1.1037  4.1099 0.9008
Starch y2 mono+mix       B S2 F2            sqrt(x + 5.25) (S2) 282       True   20.8167    0.0000 0.0231  1.6599 0.9008
Starch y2 mono+mix       B S3 F1 sqrt, 27 negative dropped (S3) 255       True   93.5623    0.0000 0.1498  1.4390 1.8659
Starch y2 mono+mix       B S3 F2 sqrt, 27 negative dropped (S3) 255       True   22.0117    0.0000 0.4719  1.0989 1.8659
Starch y2 mono+mix       O S1 F1           none (negatives, S1) 286       True    1.1021    0.3337 0.1407  4.3641 0.2807
Starch y2 mono+mix       O S1 F2           none (negatives, S1) 286       True    1.2944    0.2758 0.3591  3.3151 0.2807
Starch y2 mono+mix       O S2 F1            sqrt(x + 6.28) (S2) 286       True    0.1367    0.8723 0.0936  4.2477 0.3851
Starch y2 mono+mix       O S2 F2            sqrt(x + 6.28) (S2) 286       True    1.8407    0.1607 0.3218  3.4050 0.3851
Starch y2 mono+mix       O S3 F1 sqrt, 22 negative dropped (S3) 264       True    4.5200    0.0118 0.4301  3.1101 0.6301
Starch y2 mono+mix       O S3 F2 sqrt, 22 negative dropped (S3) 264       True    0.3701    0.6911 0.7743  2.4092 0.6301
 Sugar y1     mono  pooled S1 F1           none (negatives, S1) 427       True   18.2564    0.0000 0.8399  3.9603 3.3689
 Sugar y1     mono  pooled S1 F2           none (negatives, S1) 427       True    0.4398    0.6445 0.4729  7.3180 3.3689
 Sugar y1     mono  pooled S2 F1            sqrt(x + 4.06) (S2) 427       True   16.3715    0.0000 0.4902  2.6141 3.2550
 Sugar y1     mono  pooled S2 F2            sqrt(x + 4.06) (S2) 427       True    0.4480    0.6392 0.6346  5.7938 3.2550
 Sugar y1     mono  pooled S3 F1  sqrt, 2 negative dropped (S3) 425       True   16.9363    0.0000 1.0643  6.4262 3.8997
 Sugar y1     mono  pooled S3 F2  sqrt, 2 negative dropped (S3) 425       True    0.1322    0.8762 0.4938 10.1249 3.8997
 Sugar y1     mono       B S1 F1           none (negatives, S1) 211       True    5.8565    0.0034 1.8400  2.9840 4.4986
 Sugar y1     mono       B S1 F2           none (negatives, S1) 211       True    0.1030    0.9021 0.9336  6.8867 4.4986
 Sugar y1     mono       B S2 F1            sqrt(x + 4.06) (S2) 211       True    5.0581    0.0073 1.1216  1.8699 4.4807
 Sugar y1     mono       B S2 F2            sqrt(x + 4.06) (S2) 211       True    0.0702    0.9322 1.6517  5.1573 4.4807
 Sugar y1     mono       B S3 F1  sqrt, 1 negative dropped (S3) 210       True    5.3068    0.0057 2.4951  4.2897 4.1232
 Sugar y1     mono       B S3 F2  sqrt, 1 negative dropped (S3) 210       True    0.1018    0.9033 0.3484  8.2272 4.1232
 Sugar y1     mono       O S1 F1           none (negatives, S1) 216       True   15.3138    0.0000 0.6997  1.6724 0.6718
 Sugar y1     mono       O S1 F2           none (negatives, S1) 216       True    1.5617    0.2124 1.2263  1.4279 0.6718
 Sugar y1     mono       O S2 F1            sqrt(x + 1.86) (S2) 216       True   13.5688    0.0000 0.8338  0.8854 0.5997
 Sugar y1     mono       O S2 F2            sqrt(x + 1.86) (S2) 216       True    2.5834    0.0781 1.3069  0.7223 0.5997
 Sugar y1     mono       O S3 F1  sqrt, 1 negative dropped (S3) 215       True   14.6597    0.0000 0.3534  2.9794 0.7590
 Sugar y1     mono       O S3 F2  sqrt, 1 negative dropped (S3) 215       True    0.4511    0.6376 0.9150  2.6782 0.7590
 Sugar y1 mono+mix  pooled S1 F1           none (negatives, S1) 852       True   27.6295    0.0000 0.4955  4.1080 1.4683
 Sugar y1 mono+mix  pooled S1 F2           none (negatives, S1) 852       True    1.1714    0.3104 0.7550  5.2174 1.4683
 Sugar y1 mono+mix  pooled S2 F1            sqrt(x + 4.06) (S2) 852       True   25.4780    0.0000 0.2830  3.3050 1.5286
 Sugar y1 mono+mix  pooled S2 F2            sqrt(x + 4.06) (S2) 852       True    1.0995    0.3335 0.7367  4.5209 1.5286
 Sugar y1 mono+mix  pooled S3 F1  sqrt, 3 negative dropped (S3) 849       True   24.5686    0.0000 0.7793  5.2553 1.5316
 Sugar y1 mono+mix  pooled S3 F2  sqrt, 3 negative dropped (S3) 849       True    0.6598    0.5173 0.6518  6.1785 1.5316
 Sugar y1 mono+mix       B S1 F1           none (negatives, S1) 422       True    3.2112    0.0414 0.5138  4.4254 1.4341
 Sugar y1 mono+mix       B S1 F2           none (negatives, S1) 422       True    0.3789    0.6849 0.4347  5.1147 1.4341
 Sugar y1 mono+mix       B S2 F1            sqrt(x + 4.06) (S2) 422       True    2.8111    0.0613 0.1975  3.3231 1.5966
 Sugar y1 mono+mix       B S2 F2            sqrt(x + 4.06) (S2) 422       True    0.3300    0.7191 0.5711  4.1822 1.5966
 Sugar y1 mono+mix       B S3 F1  sqrt, 2 negative dropped (S3) 420       True    2.3037    0.1012 1.3236  4.7868 1.0399
 Sugar y1 mono+mix       B S3 F2  sqrt, 2 negative dropped (S3) 420       True    0.3764    0.6866 0.2965  4.8769 1.0399
 Sugar y1 mono+mix       O S1 F1           none (negatives, S1) 430       True   37.9211    0.0000 0.1077  0.7251 0.3516
 Sugar y1 mono+mix       O S1 F2           none (negatives, S1) 430       True    5.5644    0.0041 0.3824  0.8375 0.3516
 Sugar y1 mono+mix       O S2 F1            sqrt(x + 1.86) (S2) 430       True   35.3287    0.0000 0.1365  0.4006 0.2553
 Sugar y1 mono+mix       O S2 F2            sqrt(x + 1.86) (S2) 430       True    6.2225    0.0022 0.3098  0.4962 0.2553
 Sugar y1 mono+mix       O S3 F1  sqrt, 1 negative dropped (S3) 429       True   37.5623    0.0000 0.0994  1.2184 0.5930
 Sugar y1 mono+mix       O S3 F2  sqrt, 1 negative dropped (S3) 429       True    4.1592    0.0163 0.5958  1.6493 0.5930
 Sugar y2     mono  pooled S1 F1           none (negatives, S1) 284       True   17.0985    0.0000 0.7733  2.7260 0.7107
 Sugar y2     mono  pooled S1 F2           none (negatives, S1) 284       True    1.7606    0.1740 0.0505  2.7622 0.7107
 Sugar y2     mono  pooled S2 F1            sqrt(x + 4.06) (S2) 284       True   14.4535    0.0000 0.3637  1.3884 0.8034
 Sugar y2     mono  pooled S2 F2            sqrt(x + 4.06) (S2) 284       True    1.3691    0.2562 0.0508  2.0758 0.8034
 Sugar y2     mono  pooled S3 F1  sqrt, 2 negative dropped (S3) 282       True   15.6638    0.0000 1.0085  6.3396 0.9317
 Sugar y2     mono  pooled S3 F2  sqrt, 2 negative dropped (S3) 282       True    1.1374    0.3223 0.0453  5.4911 0.9317
 Sugar y2     mono       B S1 F1           none (negatives, S1) 140       True    8.3374    0.0004 1.4260  0.4130 1.5196
 Sugar y2     mono       B S1 F2           none (negatives, S1) 140       True    1.2265    0.2971 0.3343  1.7547 1.5196
 Sugar y2     mono       B S2 F1            sqrt(x + 4.06) (S2) 140       True    6.9421    0.0014 0.6733  0.0834 2.0403
 Sugar y2     mono       B S2 F2            sqrt(x + 4.06) (S2) 140       True    0.6730    0.5122 0.9163  1.4566 2.0403
 Sugar y2     mono       B S3 F1  sqrt, 1 negative dropped (S3) 139       True    7.6494    0.0008 2.2701  1.9376 1.2672
 Sugar y2     mono       B S3 F2  sqrt, 1 negative dropped (S3) 139       True    1.0352    0.3584 0.1614  3.1286 1.2672
 Sugar y2     mono       O S1 F1           none (negatives, S1) 144       True   10.0349    0.0001 0.2478  3.1328 0.7696
 Sugar y2     mono       O S1 F2           none (negatives, S1) 144       True    0.6577    0.5199 0.9454  1.2027 0.7696
 Sugar y2     mono       O S2 F1            sqrt(x + 1.86) (S2) 144       True    8.5205    0.0003 0.4486  1.5333 1.0243
 Sugar y2     mono       O S2 F2            sqrt(x + 1.86) (S2) 144       True    1.5133    0.2243 1.4073  0.5208 1.0243
 Sugar y2     mono       O S3 F1  sqrt, 1 negative dropped (S3) 143       True    9.5181    0.0001 0.0926  5.0069 0.5077
 Sugar y2     mono       O S3 F2  sqrt, 1 negative dropped (S3) 143       True    0.3514    0.7044 0.4940  2.4923 0.5077
 Sugar y2 mono+mix  pooled S1 F1           none (negatives, S1) 568       True   25.0684    0.0000 0.4430  4.2976 0.1995
 Sugar y2 mono+mix  pooled S1 F2           none (negatives, S1) 568       True    2.2646    0.1048 0.1901  3.0191 0.1995
 Sugar y2 mono+mix  pooled S2 F1            sqrt(x + 4.06) (S2) 568       True   21.8452    0.0000 0.2343  2.9111 0.2918
 Sugar y2 mono+mix  pooled S2 F2            sqrt(x + 4.06) (S2) 568       True    1.8893    0.1522 0.0897  2.5128 0.2918
 Sugar y2 mono+mix  pooled S3 F1  sqrt, 3 negative dropped (S3) 565       True   21.3660    0.0000 0.9847  6.9446 0.2678
 Sugar y2 mono+mix  pooled S3 F2  sqrt, 3 negative dropped (S3) 565       True    1.5269    0.2181 0.2072  4.9690 0.2678
 Sugar y2 mono+mix       B S1 F1           none (negatives, S1) 282       True    6.8275    0.0013 0.6512  1.5598 0.2818
 Sugar y2 mono+mix       B S1 F2           none (negatives, S1) 282       True    0.6475    0.5242 0.0756  1.5193 0.2818
 Sugar y2 mono+mix       B S2 F1            sqrt(x + 4.06) (S2) 282       True    6.1914    0.0024 0.2351  0.8931 0.6232
 Sugar y2 mono+mix       B S2 F2            sqrt(x + 4.06) (S2) 282       True    0.4009    0.6701 0.0850  1.3076 0.6232
 Sugar y2 mono+mix       B S3 F1  sqrt, 2 negative dropped (S3) 280       True    5.8378    0.0033 1.9705  2.7842 0.3982
 Sugar y2 mono+mix       B S3 F2  sqrt, 2 negative dropped (S3) 280       True    0.4411    0.6438 0.2972  2.4295 0.3982
 Sugar y2 mono+mix       O S1 F1           none (negatives, S1) 286       True   24.6045    0.0000 0.0215  3.5465 0.2674
 Sugar y2 mono+mix       O S1 F2           none (negatives, S1) 286       True    3.3924    0.0351 0.1066  1.6063 0.2674
 Sugar y2 mono+mix       O S2 F1            sqrt(x + 1.86) (S2) 286       True   21.4761    0.0000 0.1276  2.1840 0.4174
 Sugar y2 mono+mix       O S2 F2            sqrt(x + 1.86) (S2) 286       True    3.4498    0.0332 0.3598  0.7846 0.4174
 Sugar y2 mono+mix       O S3 F1  sqrt, 1 negative dropped (S3) 285       True   24.0892    0.0000 0.0476  5.0507 0.3108
 Sugar y2 mono+mix       O S3 F2  sqrt, 1 negative dropped (S3) 285       True    3.1329    0.0452 0.1412  3.0423 0.3108
 Photo y1     mono  pooled S1 F1           none (negatives, S1) 430       True   11.3948    0.0000 0.4256  2.1782 0.1660
 Photo y1     mono  pooled S1 F2           none (negatives, S1) 430       True    4.6471    0.0101 0.1160  0.9298 0.1660
 Photo y1     mono  pooled S2 F1          sqrt(x + 0.0597) (S2) 430       True   11.2360    0.0000 0.6552  1.3957 0.5653
 Photo y1     mono  pooled S2 F2          sqrt(x + 0.0597) (S2) 430       True    4.2332    0.0152 0.1046  1.1070 0.5653
 Photo y1     mono  pooled S3 F1  sqrt, 1 negative dropped (S3) 429       True   12.0585    0.0000 0.4853  1.1512 0.5134
 Photo y1     mono  pooled S3 F2  sqrt, 1 negative dropped (S3) 429       True    4.2818    0.0144 0.1107  0.8386 0.5134
 Photo y1     mono       B S1 F1                           sqrt 215       True    8.4229    0.0003 0.8460  1.6788 0.4319
 Photo y1     mono       B S1 F2                           sqrt 215       True    3.4200    0.0347 0.0481  1.0204 0.4319
 Photo y1     mono       B S2 F1                           sqrt 215       True    8.4229    0.0003 0.8460  1.6788 0.4319
 Photo y1     mono       B S2 F2                           sqrt 215       True    3.4200    0.0347 0.0481  1.0204 0.4319
 Photo y1     mono       B S3 F1                           sqrt 215       True    8.4229    0.0003 0.8460  1.6788 0.4319
 Photo y1     mono       B S3 F2                           sqrt 215       True    3.4200    0.0347 0.0481  1.0204 0.4319
 Photo y1     mono       O S1 F1           none (negatives, S1) 215       True    8.4647    0.0003 0.1754  1.4756 0.1894
 Photo y1     mono       O S1 F2           none (negatives, S1) 215       True    3.7542    0.0252 0.0294  0.6989 0.1894
 Photo y1     mono       O S2 F1          sqrt(x + 0.0597) (S2) 215       True    7.6733    0.0006 0.2234  0.9719 0.4254
 Photo y1     mono       O S2 F2          sqrt(x + 0.0597) (S2) 215       True    3.2958    0.0392 0.1290  0.9983 0.4254
 Photo y1     mono       O S3 F1  sqrt, 1 negative dropped (S3) 214       True    9.2492    0.0001 0.0541  0.5697 0.3742
 Photo y1     mono       O S3 F2  sqrt, 1 negative dropped (S3) 214       True    3.4413    0.0340 0.1442  0.5486 0.3742
 Photo y1 mono+mix  pooled S1 F1           none (negatives, S1) 858       True   20.3848    0.0000 0.8568  3.9942 0.1620
 Photo y1 mono+mix  pooled S1 F2           none (negatives, S1) 858       True    9.1143    0.0001 0.1518  2.3676 0.1620
 Photo y1 mono+mix  pooled S2 F1           sqrt(x + 0.289) (S2) 858       True   20.6779    0.0000 0.6226  3.0637 0.3301
 Photo y1 mono+mix  pooled S2 F2           sqrt(x + 0.289) (S2) 858       True    8.9171    0.0001 0.0524  2.2653 0.3301
 Photo y1 mono+mix  pooled S3 F1  sqrt, 5 negative dropped (S3) 853       True   20.3268    0.0000 0.7587  3.1091 0.3279
 Photo y1 mono+mix  pooled S3 F2  sqrt, 5 negative dropped (S3) 853       True    8.7776    0.0002 0.0607  2.4131 0.3279
 Photo y1 mono+mix       B S1 F1           none (negatives, S1) 427       True   16.9319    0.0000 0.5928  4.1252 0.3128
 Photo y1 mono+mix       B S1 F2           none (negatives, S1) 427       True    9.0069    0.0001 0.8402  2.1612 0.3128
 Photo y1 mono+mix       B S2 F1           sqrt(x + 0.289) (S2) 427       True   18.5973    0.0000 0.4752  2.9795 0.1155
 Photo y1 mono+mix       B S2 F2           sqrt(x + 0.289) (S2) 427       True    8.6678    0.0002 0.4358  1.7087 0.1155
 Photo y1 mono+mix       B S3 F1  sqrt, 3 negative dropped (S3) 424       True   17.4276    0.0000 0.6695  3.3633 0.1357
 Photo y1 mono+mix       B S3 F2  sqrt, 3 negative dropped (S3) 424       True    8.4408    0.0003 0.3304  2.2725 0.1357
 Photo y1 mono+mix       O S1 F1           none (negatives, S1) 431       True   19.2708    0.0000 0.7615  2.5486 0.6930
 Photo y1 mono+mix       O S1 F2           none (negatives, S1) 431       True    8.1385    0.0003 0.0518  2.2161 0.6930
 Photo y1 mono+mix       O S2 F1           sqrt(x + 0.165) (S2) 431       True   18.6294    0.0000 0.4871  1.9458 1.1723
 Photo y1 mono+mix       O S2 F2           sqrt(x + 0.165) (S2) 431       True    8.5576    0.0002 0.2158  2.5900 1.1723
 Photo y1 mono+mix       O S3 F1  sqrt, 2 negative dropped (S3) 429       True   19.6526    0.0000 0.4602  1.3708 0.7746
 Photo y1 mono+mix       O S3 F2  sqrt, 2 negative dropped (S3) 429       True    7.6525    0.0005 0.1066  1.6351 0.7746
 Photo y2     mono  pooled S1 F1           none (negatives, S1) 288       True    5.5482    0.0044 0.6692  2.6879 0.0299
 Photo y2     mono  pooled S1 F2           none (negatives, S1) 288       True    2.6798    0.0704 0.4680  1.0854 0.0299
 Photo y2     mono  pooled S2 F1          sqrt(x + 0.0597) (S2) 288       True    5.4320    0.0049 0.8047  1.6964 0.1331
 Photo y2     mono  pooled S2 F2          sqrt(x + 0.0597) (S2) 288       True    2.1680    0.1164 0.2365  1.1060 0.1331
 Photo y2     mono  pooled S3 F1  sqrt, 1 negative dropped (S3) 287       True    5.8885    0.0031 0.6168  1.4177 0.0969
 Photo y2     mono  pooled S3 F2  sqrt, 1 negative dropped (S3) 287       True    2.1447    0.1191 0.2362  0.8331 0.0969
 Photo y2     mono       B S1 F1                           sqrt 144       True    5.8993    0.0036 0.2631  2.8891 0.3576
 Photo y2     mono       B S1 F2                           sqrt 144       True    3.5771    0.0310 0.0958  1.7781 0.3576
 Photo y2     mono       B S2 F1                           sqrt 144       True    5.8993    0.0036 0.2631  2.8891 0.3576
 Photo y2     mono       B S2 F2                           sqrt 144       True    3.5771    0.0310 0.0958  1.7781 0.3576
 Photo y2     mono       B S3 F1                           sqrt 144       True    5.8993    0.0036 0.2631  2.8891 0.3576
 Photo y2     mono       B S3 F2                           sqrt 144       True    3.5771    0.0310 0.0958  1.7781 0.3576
 Photo y2     mono       O S1 F1           none (negatives, S1) 144       True    4.3881    0.0145 0.6644  1.5382 0.0217
 Photo y2     mono       O S1 F2           none (negatives, S1) 144       True    1.8179    0.1668 0.4586  0.7150 0.0217
 Photo y2     mono       O S2 F1          sqrt(x + 0.0597) (S2) 144       True    3.2358    0.0428 1.0709  0.5345 0.0503
 Photo y2     mono       O S2 F2          sqrt(x + 0.0597) (S2) 144       True    0.7606    0.4696 0.3323  0.4354 0.0503
 Photo y2     mono       O S3 F1  sqrt, 1 negative dropped (S3) 143       True    4.1763    0.0177 0.6004  0.2686 0.0028
 Photo y2     mono       O S3 F2  sqrt, 1 negative dropped (S3) 143       True    0.7516    0.4738 0.3315  0.1314 0.0028
 Photo y2 mono+mix  pooled S1 F1           none (negatives, S1) 574       True    9.5037    0.0001 1.1846  3.5862 0.0068
 Photo y2 mono+mix  pooled S1 F2           none (negatives, S1) 574       True    4.6740    0.0097 0.5161  1.7974 0.0068
 Photo y2 mono+mix  pooled S2 F1           sqrt(x + 0.289) (S2) 574       True    9.2928    0.0001 0.7113  2.4584 0.0776
 Photo y2 mono+mix  pooled S2 F2           sqrt(x + 0.289) (S2) 574       True    3.9717    0.0194 0.2104  1.4110 0.0776
 Photo y2 mono+mix  pooled S3 F1  sqrt, 5 negative dropped (S3) 569       True    9.2843    0.0001 0.8909  2.5517 0.0805
 Photo y2 mono+mix  pooled S3 F2  sqrt, 5 negative dropped (S3) 569       True    4.0772    0.0175 0.2315  1.6157 0.0805
 Photo y2 mono+mix       B S1 F1           none (negatives, S1) 286       True   11.8931    0.0000 0.4469  5.6439 0.6587
 Photo y2 mono+mix       B S1 F2           none (negatives, S1) 286       True    7.1236    0.0010 1.0743  1.9825 0.6587
 Photo y2 mono+mix       B S2 F1           sqrt(x + 0.289) (S2) 286       True   13.8590    0.0000 0.1558  4.0105 0.2456
 Photo y2 mono+mix       B S2 F2           sqrt(x + 0.289) (S2) 286       True    6.5063    0.0017 0.3785  1.2531 0.2456
 Photo y2 mono+mix       B S3 F1  sqrt, 3 negative dropped (S3) 283       True   13.3314    0.0000 0.2859  4.2796 0.0542
 Photo y2 mono+mix       B S3 F2  sqrt, 3 negative dropped (S3) 283       True    6.2009    0.0023 0.2833  1.6541 0.0542
 Photo y2 mono+mix       O S1 F1           none (negatives, S1) 288       True    8.5170    0.0003 1.7108  2.0592 0.3057
 Photo y2 mono+mix       O S1 F2           none (negatives, S1) 288       True    3.2538    0.0402 0.2965  1.5344 0.3057
 Photo y2 mono+mix       O S2 F1           sqrt(x + 0.165) (S2) 288       True    6.5922    0.0016 1.2633  1.0769 0.6284
 Photo y2 mono+mix       O S2 F2           sqrt(x + 0.165) (S2) 288       True    2.4251    0.0904 0.1456  1.3943 0.6284
 Photo y2 mono+mix       O S3 F1  sqrt, 2 negative dropped (S3) 286       True    7.6247    0.0006 1.1945  0.7588 0.2361
 Photo y2 mono+mix       O S3 F2  sqrt, 2 negative dropped (S3) 286       True    2.1796    0.1151 0.2065  0.6916 0.2361

Season term p > 0.05 for all three traits, per group:
F                          F1     F2
Y  trees    species S               
y1 mono     B       S1  False  False
                    S2  False  False
                    S3  False  False
            O       S1  False  False
                    S2  False  False
                    S3  False  False
            pooled  S1  False  False
                    S2  False  False
                    S3  False  False
   mono+mix B       S1  False  False
                    S2  False  False
                    S3  False  False
            O       S1  False  False
                    S2  False  False
                    S3  False  False
            pooled  S1  False  False
                    S2  False  False
                    S3  False  False
y2 mono     B       S1  False  False
                    S2  False  False
                    S3  False  False
            O       S1  False   True
                    S2  False   True
                    S3  False   True
            pooled  S1  False   True
                    S2  False   True
                    S3  False   True
   mono+mix B       S1  False  False
                    S2  False  False
                    S3  False  False
            O       S1  False  False
                    S2  False  False
                    S3  False  False
            pooled  S1  False  False
                    S2  False  False
                    S3  False  False

Readings of the criterion (a or b, y1 or y2, trees, S1 to S3, F1 or F2):
         species  Y    trees  S  F  absence_holds
      a (pooled) y1     mono S1 F1          False
b (each species) y1     mono S1 F1          False
      a (pooled) y1     mono S1 F2          False
b (each species) y1     mono S1 F2          False
      a (pooled) y1     mono S2 F1          False
b (each species) y1     mono S2 F1          False
      a (pooled) y1     mono S2 F2          False
b (each species) y1     mono S2 F2          False
      a (pooled) y1     mono S3 F1          False
b (each species) y1     mono S3 F1          False
      a (pooled) y1     mono S3 F2          False
b (each species) y1     mono S3 F2          False
      a (pooled) y1 mono+mix S1 F1          False
b (each species) y1 mono+mix S1 F1          False
      a (pooled) y1 mono+mix S1 F2          False
b (each species) y1 mono+mix S1 F2          False
      a (pooled) y1 mono+mix S2 F1          False
b (each species) y1 mono+mix S2 F1          False
      a (pooled) y1 mono+mix S2 F2          False
b (each species) y1 mono+mix S2 F2          False
      a (pooled) y1 mono+mix S3 F1          False
b (each species) y1 mono+mix S3 F1          False
      a (pooled) y1 mono+mix S3 F2          False
b (each species) y1 mono+mix S3 F2          False
      a (pooled) y2     mono S1 F1          False
b (each species) y2     mono S1 F1          False
      a (pooled) y2     mono S1 F2           True
b (each species) y2     mono S1 F2          False
      a (pooled) y2     mono S2 F1          False
b (each species) y2     mono S2 F1          False
      a (pooled) y2     mono S2 F2           True
b (each species) y2     mono S2 F2          False
      a (pooled) y2     mono S3 F1          False
b (each species) y2     mono S3 F1          False
      a (pooled) y2     mono S3 F2           True
b (each species) y2     mono S3 F2          False
      a (pooled) y2 mono+mix S1 F1          False
b (each species) y2 mono+mix S1 F1          False
      a (pooled) y2 mono+mix S1 F2          False
b (each species) y2 mono+mix S1 F2          False
      a (pooled) y2 mono+mix S2 F1          False
b (each species) y2 mono+mix S2 F1          False
      a (pooled) y2 mono+mix S2 F2          False
b (each species) y2 mono+mix S2 F2          False
      a (pooled) y2 mono+mix S3 F1          False
b (each species) y2 mono+mix S3 F1          False
      a (pooled) y2 mono+mix S3 F2          False
b (each species) y2 mono+mix S3 F2          False
Readings where the absence holds: 3 of 48
    sum  count
F             
F1    0     24
F2    3     24

Range of the season term p per trait and kind of F test, over all readings:
              min     max
trait  F                 
Photo  F1  0.0000  0.0428
       F2  0.0001  0.4738
Starch F1  0.0000  0.8955
       F2  0.0000  0.9887
Sugar  F1  0.0000  0.1012
       F2  0.0022  0.9322

Campaign means (monocultures and mixtures, all years):
        Starch  Sugar  Photo
season                      
1        5.759  6.016  5.357
2        4.710  4.952  7.095
3        3.993  5.135  5.065

The four season terms against Table S6, per trait and group: the 10 closest of 216 fits
 trait  Y    trees species  S  F  season_F  WS_F  MS_F  WMS_F  maxdiff
 Photo y2     mono  pooled S3 F2     2.145 0.236 0.833  0.097    0.115
 Photo y2 mono+mix       O S3 F2     2.180 0.206 0.692  0.236    0.150
 Photo y2     mono       O S1 F2     1.818 0.459 0.715  0.022    0.239
 Sugar y2     mono  pooled S2 F2     1.369 0.051 2.076  0.803    0.314
 Photo y2     mono  pooled S2 F2     2.168 0.237 1.106  0.133    0.316
Starch y1     mono       O S3 F2     2.987 0.206 0.694  0.065    0.347
 Sugar y2 mono+mix  pooled S2 F2     1.889 0.090 2.513  0.292    0.348
 Sugar y2     mono  pooled S1 F2     1.761 0.051 2.762  0.711    0.372
Starch y1 mono+mix       O S3 F2     3.100 0.152 0.886  0.173    0.460
 Photo y2 mono+mix       O S2 F2     2.425 0.146 1.394  0.628    0.604

Largest difference in F over all three traits and four terms, per reading (the 10 closest of 72 ):
Y   trees     species  S   F 
y2  mono      pooled   S2  F2    0.986
                       S1  F2    1.009
y1  mono      O        S3  F2    1.411
y2  mono      O        S3  F2    1.686
    mono+mix  O        S3  F2    2.270
                       S1  F2    2.385
                       S2  F2    2.475
    mono      O        S1  F2    2.495
                       S2  F2    2.635
              pooled   S3  F2    3.101
Table S6: {'Starch': [2.64, 0.05, 0.93, 0.24], 'Sugar': [1.56, 0.04, 2.39, 0.64], 'Photo': [2.03, 0.22, 0.79, 0.09]}

Result: blocked (methods underspecified). With sequential tests (F1), at least one of starch, sugar and Asat has a season term with p <= 0.05 under all 24 readings (Asat p <= 0.043 under every one). With marginal tests (F2), all three have p > 0.05 under 3 of the 24 readings, 2020 and 2021 (y2) on monocultures with both species pooled, under S1, S2 and S3 (starch p 0.12 to 0.26, sugar 0.17 to 0.32, Asat 0.070 to 0.12). The criterion now names F1 and F2 as readings, and they differ; the first run, which read the tests as sequential, found the claim not reproduced. Set against the paper's F values for the four season terms, the closest readings are y2 on monocultures with both species pooled and marginal tests, under S2 and S1 (largest difference over the 12 F values 0.99 and 1.01), the readings under which the absence holds; no reading matches exactly, and with S3 the same reading differs by up to 3.1. This points to the reading but does not settle it, so the claim stays blocked.

Interaction tests and biodiversity effects (Supplemental Tables S2 and S3, Figure 5)¶

Interaction test of the claims file: per species, monoculture and mixture trees, square root, lme(trait ~ (W + MR + year + I)^3, random = ~1|Chamber), and the mixture minus monoculture contrast within each treatment and year (I1) or within each treatment averaged over 2020 and 2021 (I2), a single contrast each (Wald z). The claims file does not say over which family these contrasts are adjusted (asked in questions/dryad-4j0zpc8hz.yaml); both are run as readings: A1, each contrast alone (unadjusted), and A2, single-step over the model's eight treatment and year contrasts (I1) or its four treatment contrasts (I2), as the treatment test adjusts over the six pairs of a year. Years: Y1 (bud swelling and development duration on 2020 and 2021, the other traits on 2019 to 2021), which the criteria use, and Y2 (2020 and 2021 for all traits), reported as a variant. S1, S2 and S3 where values are negative, L1 and L2 for starch, sugar and Asat. In the tables, raw_mix_minus_mono is the difference of the raw means of the rows the model uses (under S3, without the dropped rows), and raw_all the same over all rows of the trait.

Biodiversity effects: NBE, complementarity (CE) and selection (SE) effects per mixture tree by the claims file's Eqs. 2 to 4, against the mean of the monoculture trees of the species, treatment and year (B1) or of the monoculture tree or trees of the species in the tree's own chamber (B2; every chamber has one or two, and two are averaged), on yearly tree means (L1) or per campaign (L2), each tested against zero by a one-sample t-test per species, treatment and year. With Eq. 3 as printed, CE = 2 x NBE for every tree, so its t-test is the NBE's. Under B1 the reference is the same for every tree of a group, so SE sums to zero and its mean is 0 (t = 0, p = 1) by construction. The legends' Tukey's HSD against zero is not run: it is not defined for a comparison of one group with zero.

In [31]:
PHENO = ["Flush_S1", "Dev_time", "Senes_10", "Senes_time", "Growth_length"]
# Years of the interaction model (claims file, opening comment): Y1, bud swelling and development duration on
# 2020 and 2021 and the other traits on 2019 to 2021, used by the criteria; Y2, 2020 and 2021 for all (variant).
IYEARS = {"Y1": lambda trait: [2020, 2021] if trait in ("Flush_S1", "Dev_time") else [2019, 2020, 2021],
          "Y2": lambda trait: [2020, 2021]}

# Adjustment of the mixture against monoculture contrasts, not stated in the claims file: A1 each contrast
# alone, A2 single-step over the model's eight treatment and year contrasts (I1) or four treatment contrasts (I2).
AA = ("A1", "A2")

def ireadings(trait):
    Ls = ("L1", "L2") if trait in LEAF_C else ("L1",)
    return [(Y, S, L, A) for Y in IYEARS for S in SS for L in Ls for A in AA]

IT = {}
t0 = time.time()
for sp in "BO":
    for trait in PHENO + LEAF_C + GROWTH:
        for Y, years_of in IYEARS.items():
            for L, data in (("L1", ty), ("L2", ca)):
                if L == "L2" and trait not in LEAF_C:
                    continue
                for S in SS:
                    r = o.interaction_test(data, sp, trait, years_of(trait), S)
                    IT[(sp, trait, Y, S, L)] = r
print(f"{len(IT)} interaction fits in {time.time() - t0:.0f} s; not converged:", sum(not r["converged"] for r in IT.values()))
print("Rows per fit, Y1 and Y2, S1 (S3 drops the negative values):")
print(pd.DataFrame([{"species": k[0], "trait": k[1], "Y": k[2], "S": k[3], "L": k[4], "n": r["n"], "transform": r["transform"]}
                    for k, r in IT.items() if k[3] in ("S1", "S3")]).pivot_table(index=["species", "trait", "L"], columns=["Y", "S"], values="n").to_string())

def itable(sp, traits, treat, years=("2020", "2021", "2020-21")):
    rows = []
    for trait in traits:
        for reading in ireadings(trait):
            fit = IT[(sp, trait, *reading[:3])]
            c = fit["contrasts"]
            for _, r in c[(c.treat == treat) & c.year.isin(years)].iterrows():
                rows.append({"species": sp, "trait": trait, "reading": "/".join(reading), "Y": reading[0], "A": reading[3], "treat": treat,
                             "I": "I2" if r.year == "2020-21" else "I1", "year": r.year, "transform": fit["transform"],
                             "raw_mix_minus_mono": r.raw_mix_minus_mono, "raw_all": r.raw_all, "estimate": r.estimate, "z": r.z,
                             "p": r.p if reading[3] == "A1" else r.p_family})
    return pd.DataFrame(rows)

BE = {}
for trait in PHENO + LEAF_C + GROWTH:
    for B in ("B1", "B2"):
        for L, data in (("L1", ty), ("L2", ca)):
            if L == "L2" and trait not in LEAF_C:
                continue
            eff = o.biodiversity_effects(data[data.Year.isin([2020, 2021])], trait, B, by_campaign=(L == "L2"))
            BE[(trait, B, L)] = o.t_tests(eff)

def absence_combos(sp, treat, nbe_years):
    """Per reading (Y, S, L, I, B): significant mixture-monoculture contrasts and NBEs in the years judged."""
    t = itable(sp, LEAF_C + GROWTH, treat)
    rows = []
    b_all = btable(sp, LEAF_C + GROWTH, treat, years=nbe_years, effects=("NBE",))
    for Y in IYEARS:
        for S in SS:
            for L in ("L1", "L2"):
                for A in AA:
                    for I in ("I1", "I2"):
                        g = t[(t.I == I) & t.apply(lambda r: r.reading == (f"{Y}/{S}/{L}/{A}" if r.trait in LEAF_C else f"{Y}/{S}/L1/{A}"), axis=1)]
                        nc = int((g.p < 0.05).sum())
                        for B in ("B1", "B2"):
                            b = b_all[(b_all.B == B) & ((b_all.L == L) | ~b_all.trait.isin(LEAF_C))]
                            nb_ = int((b.p < 0.05).sum())
                            rows.append({"Y": Y, "S": S, "L": L, "A": A, "I": I, "B": B, "contrasts_tested": len(g), "contrasts_significant": nc,
                                         "NBE_tested": len(b), "NBE_significant": nb_, "absence_holds": nc == 0 and nb_ == 0})
    return pd.DataFrame(rows)

def btable(sp, traits, treat, years=(2020, 2021), effects=("NBE", "CE", "SE")):
    rows = []
    for trait in traits:
        for B in ("B1", "B2"):
            for L in (("L1", "L2") if trait in LEAF_C else ("L1",)):
                t = BE[(trait, B, L)]
                t = t[(t.Species == sp) & (t.treat == treat) & t.Year.isin(years) & t.effect.isin(effects)]
                rows.append(t.assign(trait=trait, B=B, L=L))
    return pd.concat(rows)[["Species", "trait", "treat", "Year", "B", "L", "effect", "n", "mean", "t", "p"]]
168 interaction fits in 88 s; not converged: 0
Rows per fit, Y1 and Y2, S1 (S3 drops the negative values):
Y                              Y1            Y2       
S                              S1     S3     S1     S3
species trait           L                             
B       AGB_growth      L1  142.0  142.0   95.0   95.0
        Dev_time        L1   96.0   96.0   96.0   96.0
        Diameter_growth L1  142.0  121.0   95.0   75.0
        Flush_S1        L1   96.0   96.0   96.0   96.0
        Growth_length   L1  133.0  133.0   95.0   95.0
        Height_growth   L1  143.0  137.0   96.0   90.0
        Photo           L1  144.0  144.0   96.0   96.0
                        L2  427.0  424.0  286.0  283.0
        Senes_10        L1  142.0  142.0   95.0   95.0
        Senes_time      L1  142.0  142.0   95.0   95.0
        Starch          L1  144.0  143.0   96.0   95.0
                        L2  422.0  379.0  282.0  255.0
        Sugar           L1  144.0  144.0   96.0   96.0
                        L2  422.0  420.0  282.0  280.0
O       AGB_growth      L1  144.0  144.0   96.0   96.0
        Dev_time        L1   96.0   96.0   96.0   96.0
        Diameter_growth L1  144.0  135.0   96.0   88.0
        Flush_S1        L1   96.0   96.0   96.0   96.0
        Growth_length   L1  138.0  138.0   96.0   96.0
        Height_growth   L1  144.0  140.0   96.0   92.0
        Photo           L1  144.0  144.0   96.0   96.0
                        L2  431.0  429.0  288.0  286.0
        Senes_10        L1  144.0  144.0   96.0   96.0
        Senes_time      L1  144.0  144.0   96.0   96.0
        Starch          L1  144.0  141.0   96.0   93.0
                        L2  430.0  396.0  286.0  264.0
        Sugar           L1  144.0  144.0   96.0   96.0
                        L2  430.0  429.0  286.0  285.0

tables2-phenology-no-interaction¶

Species mixture did not change phenology in either species, except a development duration about 2 days shorter in oak mixtures than monocultures under lower moisture, whose net biodiversity effect was not significant.

In [32]:
t = pd.concat([itable(sp, PHENO, tr) for sp in "BO" for tr in o.TREATMENTS])
print("Phenology contrasts, mixture minus monoculture; significant ones:")
print(t[t.p < 0.05].round(4).to_string(index=False))
print("\nOak development duration under MR, every reading:")
print(t[(t.species == "O") & (t.trait == "Dev_time") & (t.treat == "MR")].round(4).to_string(index=False))
rows = []
for reading in ireadings("Dev_time"):
    for I in ("I1", "I2"):
        g = t[(t.reading == "/".join(reading)) & (t.I == I) & t.year.isin(["2020", "2021"] if I == "I1" else ["2020-21"])]
        s = g[g.p < 0.05]
        target = s[(s.species == "O") & (s.trait == "Dev_time") & (s.treat == "MR")]
        ok_target = bool(len(target) and (target.raw_mix_minus_mono < 0).all() and
                         target.raw_mix_minus_mono.map(lambda v: within(-v, 2, 0.2)).any())
        others = len(s) - len(target)
        rows.append({"reading": "/".join(reading), "Y": reading[0], "A": reading[3], "I": I, "significant": len(s), "oak Dev_time MR target holds": ok_target,
                     "other significant": others,
                     "contrast_outcome": "reproduced" if ok_target and others == 0 else "partially_reproduced" if ok_target and others == 1 else "not_reproduced"})
r2 = pd.DataFrame(rows)
print(r2.to_string(index=False))
print("\nContrast outcomes per Y and A (Y1 decides, Y2 variant):")
print(r2.groupby(["Y", "A", "I"]).agg(significant=("significant", lambda s: f"{s.min()} to {s.max()}"), outcomes=("contrast_outcome", lambda s: sorted(set(s)))).to_string())
print("\nNBE of oak development duration under MR (t-test against zero):")
print(btable("O", ["Dev_time"], "MR", effects=("NBE",)).round(4).to_string(index=False))
Phenology contrasts, mixture minus monoculture; significant ones:
species         trait     reading  Y  A treat  I    year transform  raw_mix_minus_mono  raw_all  estimate       z      p
      B    Senes_time Y2/S1/L1/A1 Y2 A1    MR I2 2020-21      sqrt            -10.5000 -10.5000   -0.8603 -1.9768 0.0481
      B    Senes_time Y2/S2/L1/A1 Y2 A1    MR I2 2020-21      sqrt            -10.5000 -10.5000   -0.8603 -1.9768 0.0481
      B    Senes_time Y2/S3/L1/A1 Y2 A1    MR I2 2020-21      sqrt            -10.5000 -10.5000   -0.8603 -1.9768 0.0481
      B      Senes_10 Y1/S1/L1/A1 Y1 A1   WMR I1    2020      sqrt              7.0000   7.0000    0.2347  2.2328 0.0256
      B      Senes_10 Y1/S2/L1/A1 Y1 A1   WMR I1    2020      sqrt              7.0000   7.0000    0.2347  2.2328 0.0256
      B      Senes_10 Y1/S3/L1/A1 Y1 A1   WMR I1    2020      sqrt              7.0000   7.0000    0.2347  2.2328 0.0256
      O      Flush_S1 Y1/S1/L1/A1 Y1 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Flush_S1 Y1/S2/L1/A1 Y1 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Flush_S1 Y1/S3/L1/A1 Y1 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Flush_S1 Y2/S1/L1/A1 Y2 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Flush_S1 Y2/S2/L1/A1 Y2 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Flush_S1 Y2/S3/L1/A1 Y2 A1     C I1    2021      sqrt             -7.6667  -7.6667   -0.3599 -2.1869 0.0287
      O      Dev_time Y1/S1/L1/A1 Y1 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y1/S1/L1/A2 Y1 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Dev_time Y1/S2/L1/A1 Y1 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y1/S2/L1/A2 Y1 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Dev_time Y1/S3/L1/A1 Y1 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y1/S3/L1/A2 Y1 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Dev_time Y2/S1/L1/A1 Y2 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y2/S1/L1/A2 Y2 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Dev_time Y2/S2/L1/A1 Y2 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y2/S2/L1/A2 Y2 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Dev_time Y2/S3/L1/A1 Y2 A1     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0018
      O      Dev_time Y2/S3/L1/A2 Y2 A2     C I1    2021      sqrt              5.5000   5.5000    0.9081  3.1226 0.0142
      O      Senes_10 Y1/S1/L1/A1 Y1 A1     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0008
      O      Senes_10 Y1/S1/L1/A1 Y1 A1     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0083
      O      Senes_10 Y1/S1/L1/A2 Y1 A2     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0061
      O      Senes_10 Y1/S1/L1/A2 Y1 A2     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0328
      O      Senes_10 Y1/S2/L1/A1 Y1 A1     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0008
      O      Senes_10 Y1/S2/L1/A1 Y1 A1     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0083
      O      Senes_10 Y1/S2/L1/A2 Y1 A2     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0061
      O      Senes_10 Y1/S2/L1/A2 Y1 A2     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0328
      O      Senes_10 Y1/S3/L1/A1 Y1 A1     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0008
      O      Senes_10 Y1/S3/L1/A1 Y1 A1     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0083
      O      Senes_10 Y1/S3/L1/A2 Y1 A2     W I1    2020      sqrt             18.8333  18.8333    0.5341  3.3575 0.0061
      O      Senes_10 Y1/S3/L1/A2 Y1 A2     W I2 2020-21      sqrt              8.6667   8.6667    0.3137  2.6386 0.0328
      O      Senes_10 Y2/S1/L1/A1 Y2 A1     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0063
      O      Senes_10 Y2/S1/L1/A2 Y2 A2     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0487
      O      Senes_10 Y2/S2/L1/A1 Y2 A1     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0063
      O      Senes_10 Y2/S2/L1/A2 Y2 A2     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0487
      O      Senes_10 Y2/S3/L1/A1 Y2 A1     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0063
      O      Senes_10 Y2/S3/L1/A2 Y2 A2     W I1    2020      sqrt             18.8333  18.8333    0.4709  2.7296 0.0487
      O Growth_length Y1/S1/L1/A1 Y1 A1     W I1    2020      sqrt             18.6667  18.6667    0.4889  2.1576 0.0310
      O Growth_length Y1/S1/L1/A1 Y1 A1     W I1    2021      sqrt             13.0000  13.0000    0.4676  2.0636 0.0391
      O Growth_length Y1/S1/L1/A1 Y1 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0049
      O Growth_length Y1/S1/L1/A2 Y1 A2     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0195
      O Growth_length Y1/S2/L1/A1 Y1 A1     W I1    2020      sqrt             18.6667  18.6667    0.4889  2.1576 0.0310
      O Growth_length Y1/S2/L1/A1 Y1 A1     W I1    2021      sqrt             13.0000  13.0000    0.4676  2.0636 0.0391
      O Growth_length Y1/S2/L1/A1 Y1 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0049
      O Growth_length Y1/S2/L1/A2 Y1 A2     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0195
      O Growth_length Y1/S3/L1/A1 Y1 A1     W I1    2020      sqrt             18.6667  18.6667    0.4889  2.1576 0.0310
      O Growth_length Y1/S3/L1/A1 Y1 A1     W I1    2021      sqrt             13.0000  13.0000    0.4676  2.0636 0.0391
      O Growth_length Y1/S3/L1/A1 Y1 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0049
      O Growth_length Y1/S3/L1/A2 Y1 A2     W I2 2020-21      sqrt             15.8333  15.8333    0.4782  2.8118 0.0195
      O Growth_length Y2/S1/L1/A1 Y2 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4432  2.3177 0.0205
      O Growth_length Y2/S2/L1/A1 Y2 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4432  2.3177 0.0205
      O Growth_length Y2/S3/L1/A1 Y2 A1     W I2 2020-21      sqrt             15.8333  15.8333    0.4432  2.3177 0.0205

Oak development duration under MR, every reading:
species    trait     reading  Y  A treat  I    year transform  raw_mix_minus_mono  raw_all  estimate       z      p
      O Dev_time Y1/S1/L1/A1 Y1 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y1/S1/L1/A1 Y1 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y1/S1/L1/A1 Y1 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y1/S1/L1/A2 Y1 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y1/S1/L1/A2 Y1 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y1/S1/L1/A2 Y1 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
      O Dev_time Y1/S2/L1/A1 Y1 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y1/S2/L1/A1 Y1 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y1/S2/L1/A1 Y1 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y1/S2/L1/A2 Y1 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y1/S2/L1/A2 Y1 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y1/S2/L1/A2 Y1 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
      O Dev_time Y1/S3/L1/A1 Y1 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y1/S3/L1/A1 Y1 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y1/S3/L1/A1 Y1 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y1/S3/L1/A2 Y1 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y1/S3/L1/A2 Y1 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y1/S3/L1/A2 Y1 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
      O Dev_time Y2/S1/L1/A1 Y2 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y2/S1/L1/A1 Y2 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y2/S1/L1/A1 Y2 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y2/S1/L1/A2 Y2 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y2/S1/L1/A2 Y2 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y2/S1/L1/A2 Y2 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
      O Dev_time Y2/S2/L1/A1 Y2 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y2/S2/L1/A1 Y2 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y2/S2/L1/A1 Y2 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y2/S2/L1/A2 Y2 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y2/S2/L1/A2 Y2 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y2/S2/L1/A2 Y2 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
      O Dev_time Y2/S3/L1/A1 Y2 A1    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.6703
      O Dev_time Y2/S3/L1/A1 Y2 A1    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.1439
      O Dev_time Y2/S3/L1/A1 Y2 A1    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.2175
      O Dev_time Y2/S3/L1/A2 Y2 A2    MR I1    2020      sqrt             -0.8333  -0.8333   -0.1238 -0.4257 0.9996
      O Dev_time Y2/S3/L1/A2 Y2 A2    MR I1    2021      sqrt             -1.6667  -1.6667   -0.4249 -1.4613 0.6851
      O Dev_time Y2/S3/L1/A2 Y2 A2    MR I2 2020-21      sqrt             -1.2500  -1.2500   -0.2744 -1.2331 0.6252
    reading  Y  A  I  significant  oak Dev_time MR target holds  other significant contrast_outcome
Y1/S1/L1/A1 Y1 A1 I1            6                         False                  6   not_reproduced
Y1/S1/L1/A1 Y1 A1 I2            2                         False                  2   not_reproduced
Y1/S1/L1/A2 Y1 A2 I1            2                         False                  2   not_reproduced
Y1/S1/L1/A2 Y1 A2 I2            2                         False                  2   not_reproduced
Y1/S2/L1/A1 Y1 A1 I1            6                         False                  6   not_reproduced
Y1/S2/L1/A1 Y1 A1 I2            2                         False                  2   not_reproduced
Y1/S2/L1/A2 Y1 A2 I1            2                         False                  2   not_reproduced
Y1/S2/L1/A2 Y1 A2 I2            2                         False                  2   not_reproduced
Y1/S3/L1/A1 Y1 A1 I1            6                         False                  6   not_reproduced
Y1/S3/L1/A1 Y1 A1 I2            2                         False                  2   not_reproduced
Y1/S3/L1/A2 Y1 A2 I1            2                         False                  2   not_reproduced
Y1/S3/L1/A2 Y1 A2 I2            2                         False                  2   not_reproduced
Y2/S1/L1/A1 Y2 A1 I1            3                         False                  3   not_reproduced
Y2/S1/L1/A1 Y2 A1 I2            2                         False                  2   not_reproduced
Y2/S1/L1/A2 Y2 A2 I1            2                         False                  2   not_reproduced
Y2/S1/L1/A2 Y2 A2 I2            0                         False                  0   not_reproduced
Y2/S2/L1/A1 Y2 A1 I1            3                         False                  3   not_reproduced
Y2/S2/L1/A1 Y2 A1 I2            2                         False                  2   not_reproduced
Y2/S2/L1/A2 Y2 A2 I1            2                         False                  2   not_reproduced
Y2/S2/L1/A2 Y2 A2 I2            0                         False                  0   not_reproduced
Y2/S3/L1/A1 Y2 A1 I1            3                         False                  3   not_reproduced
Y2/S3/L1/A1 Y2 A1 I2            2                         False                  2   not_reproduced
Y2/S3/L1/A2 Y2 A2 I1            2                         False                  2   not_reproduced
Y2/S3/L1/A2 Y2 A2 I2            0                         False                  0   not_reproduced

Contrast outcomes per Y and A (Y1 decides, Y2 variant):
         significant          outcomes
Y  A  I                               
Y1 A1 I1      6 to 6  [not_reproduced]
      I2      2 to 2  [not_reproduced]
   A2 I1      2 to 2  [not_reproduced]
      I2      2 to 2  [not_reproduced]
Y2 A1 I1      3 to 3  [not_reproduced]
      I2      2 to 2  [not_reproduced]
   A2 I1      2 to 2  [not_reproduced]
      I2      0 to 0  [not_reproduced]

NBE of oak development duration under MR (t-test against zero):
Species    trait treat  Year  B  L effect  n      mean       t      p
      O Dev_time    MR  2020 B1 L1    NBE  6  -41.6667 -2.5000 0.0545
      O Dev_time    MR  2021 B1 L1    NBE  6  -83.3333 -0.6855 0.5235
      O Dev_time    MR  2020 B2 L1    NBE  6  -37.5000 -1.5667 0.1780
      O Dev_time    MR  2021 B2 L1    NBE  6 -162.5000 -1.4123 0.2170

Result: not reproduced. Under Y1, the oak development duration contrast under MR is not significant (raw mixture minus monoculture -0.83 days in 2020, -1.67 in 2021, -1.25 over both years, p 0.14 to 0.67 each alone (A1), 0.63 to 1.0 adjusted over the model's contrasts (A2)), and other phenology contrasts are: under A1, 6 per reading under I1 and 2 under I2, and under A2, 2 under I1 and 2 under I2 (for example oak development duration under C in 2021, +5.5 days, p 0.0018, and oak onset of senescence under W in 2020, +18.8 days, p 0.0008). The Y2 variant gives the same outcome under A1 and A2. The NBE of oak development duration under MR does not differ from zero (p 0.055 to 0.52), as the claim says.

tables3-beech-warming-no-interaction¶

Under warming, species mixture did not change beech leaf-level carbon relations or growth in 2020 and 2021, and beech showed no net biodiversity effect on these traits in 2021.

In [33]:
t = itable("B", LEAF_C + GROWTH, "W")
print("Beech under W, mixture minus monoculture; significant contrasts:", int((t.p < 0.05).sum()), "of", len(t))
print(t[t.p < 0.05].round(4).to_string(index=False))
print("Significant per reading and I:"); print(t.groupby(["reading", "I"]).apply(lambda g: int((g.p < 0.05).sum())).to_string())
b = btable("B", LEAF_C + GROWTH, "W", years=(2020, 2021), effects=("NBE",))
print("\nNBE, beech under W:")
print(b.round(4).to_string(index=False))
print("2021 NBEs with p < 0.05:", int(((b.Year == 2021) & (b.p < 0.05)).sum()), "; 2020 (reported, not judged):", int(((b.Year == 2020) & (b.p < 0.05)).sum()))
combos = absence_combos("B", "W", (2021,))
print("\nPer reading (contrasts 2020 and 2021, NBE 2021):")
print(combos.to_string(index=False))
print("Readings where the absence holds:", int(combos.absence_holds.sum()), "of", len(combos))
print(combos.groupby(["Y", "A"]).absence_holds.agg(["sum", "count"]).to_string())
Beech under W, mixture minus monoculture; significant contrasts: 8 of 324
species  trait     reading  Y  A treat  I    year                     transform  raw_mix_minus_mono  raw_all  estimate      z      p
      B Starch Y1/S1/L1/A1 Y1 A1     W I1    2020          none (negatives, S1)              3.5992   3.5992    2.8099 2.2360 0.0253
      B Starch Y1/S2/L1/A1 Y1 A1     W I1    2020          sqrt(x + 0.256) (S2)              3.5992   3.5992    0.5844 2.0326 0.0421
      B Starch Y1/S2/L2/A1 Y1 A1     W I1    2020           sqrt(x + 5.25) (S2)              3.5077   3.5077    0.4646 2.0017 0.0453
      B Starch Y1/S3/L1/A1 Y1 A1     W I1    2020 sqrt, 1 negative dropped (S3)              3.5992   3.5992    0.6608 2.3650 0.0180
      B Starch Y2/S1/L1/A1 Y2 A1     W I1    2020          none (negatives, S1)              3.5992   3.5992    3.0603 2.0238 0.0430
      B Starch Y2/S2/L1/A1 Y2 A1     W I1    2020          sqrt(x + 0.256) (S2)              3.5992   3.5992    0.6803 2.0325 0.0421
      B Starch Y2/S3/L1/A1 Y2 A1     W I1    2020 sqrt, 1 negative dropped (S3)              3.5992   3.5992    0.7451 2.3224 0.0202
      B Starch Y2/S3/L1/A1 Y2 A1     W I2 2020-21 sqrt, 1 negative dropped (S3)              2.0295   2.0295    0.4857 1.9956 0.0460
Significant per reading and I:
reading      I 
Y1/S1/L1/A1  I1    1
             I2    0
Y1/S1/L1/A2  I1    0
             I2    0
Y1/S1/L2/A1  I1    0
             I2    0
Y1/S1/L2/A2  I1    0
             I2    0
Y1/S2/L1/A1  I1    1
             I2    0
Y1/S2/L1/A2  I1    0
             I2    0
Y1/S2/L2/A1  I1    1
             I2    0
Y1/S2/L2/A2  I1    0
             I2    0
Y1/S3/L1/A1  I1    1
             I2    0
Y1/S3/L1/A2  I1    0
             I2    0
Y1/S3/L2/A1  I1    0
             I2    0
Y1/S3/L2/A2  I1    0
             I2    0
Y2/S1/L1/A1  I1    1
             I2    0
Y2/S1/L1/A2  I1    0
             I2    0
Y2/S1/L2/A1  I1    0
             I2    0
Y2/S1/L2/A2  I1    0
             I2    0
Y2/S2/L1/A1  I1    1
             I2    0
Y2/S2/L1/A2  I1    0
             I2    0
Y2/S2/L2/A1  I1    0
             I2    0
Y2/S2/L2/A2  I1    0
             I2    0
Y2/S3/L1/A1  I1    1
             I2    1
Y2/S3/L1/A2  I1    0
             I2    0
Y2/S3/L2/A1  I1    0
             I2    0
Y2/S3/L2/A2  I1    0
             I2    0

NBE, beech under W:
Species           trait treat  Year  B  L effect  n     mean       t      p
      B          Starch     W  2020 B1 L1    NBE  6 179.9619  2.0114 0.1005
      B          Starch     W  2021 B1 L1    NBE  6  22.9871  0.6152 0.5653
      B          Starch     W  2020 B1 L2    NBE 18 173.8932  2.5545 0.0205
      B          Starch     W  2021 B1 L2    NBE 18  46.6675  0.7702 0.4517
      B          Starch     W  2020 B2 L1    NBE  6 175.6674  1.8687 0.1206
      B          Starch     W  2021 B2 L1    NBE  6  26.0823  0.3025 0.7745
      B          Starch     W  2020 B2 L2    NBE 18 182.6880  2.7835 0.0127
      B          Starch     W  2021 B2 L2    NBE 18  46.1131  0.6722 0.5105
      B           Sugar     W  2020 B1 L1    NBE  6 -26.7648 -0.7126 0.5080
      B           Sugar     W  2021 B1 L1    NBE  6  -0.7013 -0.0489 0.9629
      B           Sugar     W  2020 B1 L2    NBE 18 -35.5984 -1.5068 0.1502
      B           Sugar     W  2021 B1 L2    NBE 18   6.8874  0.2838 0.7800
      B           Sugar     W  2020 B2 L1    NBE  6 -25.2558 -0.6027 0.5730
      B           Sugar     W  2021 B2 L1    NBE  6 -11.6051 -0.5429 0.6105
      B           Sugar     W  2020 B2 L2    NBE 18 -37.1289 -1.3095 0.2078
      B           Sugar     W  2021 B2 L2    NBE 18  -6.5731 -0.2783 0.7842
      B           Photo     W  2020 B1 L1    NBE  6  23.1071  0.4076 0.7004
      B           Photo     W  2021 B1 L1    NBE  6 -59.9265 -3.4243 0.0188
      B           Photo     W  2020 B1 L2    NBE 18  23.1071  0.4723 0.6427
      B           Photo     W  2021 B1 L2    NBE 18 -59.9265 -4.6387 0.0002
      B           Photo     W  2020 B2 L1    NBE  6   8.1958  0.1298 0.9018
      B           Photo     W  2021 B2 L1    NBE  6 -67.1564 -2.2087 0.0782
      B           Photo     W  2020 B2 L2    NBE 18   8.1958  0.1670 0.8693
      B           Photo     W  2021 B2 L2    NBE 18 -67.1564 -3.0385 0.0074
      B   Height_growth     W  2020 B1 L1    NBE  6 137.5000  1.4899 0.1964
      B   Height_growth     W  2021 B1 L1    NBE  6 -79.1667 -0.5193 0.6257
      B   Height_growth     W  2020 B2 L1    NBE  6 129.1667  1.1303 0.3096
      B   Height_growth     W  2021 B2 L1    NBE  6 -83.3333 -0.4091 0.6994
      B Diameter_growth     W  2020 B1 L1    NBE  6  -5.7500 -0.4112 0.6980
      B Diameter_growth     W  2021 B1 L1    NBE  6 -46.5000 -2.0227 0.0990
      B Diameter_growth     W  2020 B2 L1    NBE  6 -25.8750 -0.8079 0.4558
      B Diameter_growth     W  2021 B2 L1    NBE  6 -46.7083 -1.6193 0.1663
      B      AGB_growth     W  2020 B1 L1    NBE  6  16.5167  0.3094 0.7695
      B      AGB_growth     W  2021 B1 L1    NBE  6  47.4963  0.1940 0.8538
      B      AGB_growth     W  2020 B2 L1    NBE  6 -12.4113 -0.1664 0.8744
      B      AGB_growth     W  2021 B2 L1    NBE  6  50.5321  0.1746 0.8682
2021 NBEs with p < 0.05: 3 ; 2020 (reported, not judged): 2

Per reading (contrasts 2020 and 2021, NBE 2021):
 Y  S  L  A  I  B  contrasts_tested  contrasts_significant  NBE_tested  NBE_significant  absence_holds
Y1 S1 L1 A1 I1 B1                12                      1           6                1          False
Y1 S1 L1 A1 I1 B2                12                      1           6                0          False
Y1 S1 L1 A1 I2 B1                 6                      0           6                1          False
Y1 S1 L1 A1 I2 B2                 6                      0           6                0           True
Y1 S1 L1 A2 I1 B1                12                      0           6                1          False
Y1 S1 L1 A2 I1 B2                12                      0           6                0           True
Y1 S1 L1 A2 I2 B1                 6                      0           6                1          False
Y1 S1 L1 A2 I2 B2                 6                      0           6                0           True
Y1 S1 L2 A1 I1 B1                12                      0           6                1          False
Y1 S1 L2 A1 I1 B2                12                      0           6                1          False
Y1 S1 L2 A1 I2 B1                 6                      0           6                1          False
Y1 S1 L2 A1 I2 B2                 6                      0           6                1          False
Y1 S1 L2 A2 I1 B1                12                      0           6                1          False
Y1 S1 L2 A2 I1 B2                12                      0           6                1          False
Y1 S1 L2 A2 I2 B1                 6                      0           6                1          False
Y1 S1 L2 A2 I2 B2                 6                      0           6                1          False
Y1 S2 L1 A1 I1 B1                12                      1           6                1          False
Y1 S2 L1 A1 I1 B2                12                      1           6                0          False
Y1 S2 L1 A1 I2 B1                 6                      0           6                1          False
Y1 S2 L1 A1 I2 B2                 6                      0           6                0           True
Y1 S2 L1 A2 I1 B1                12                      0           6                1          False
Y1 S2 L1 A2 I1 B2                12                      0           6                0           True
Y1 S2 L1 A2 I2 B1                 6                      0           6                1          False
Y1 S2 L1 A2 I2 B2                 6                      0           6                0           True
Y1 S2 L2 A1 I1 B1                12                      1           6                1          False
Y1 S2 L2 A1 I1 B2                12                      1           6                1          False
Y1 S2 L2 A1 I2 B1                 6                      0           6                1          False
Y1 S2 L2 A1 I2 B2                 6                      0           6                1          False
Y1 S2 L2 A2 I1 B1                12                      0           6                1          False
Y1 S2 L2 A2 I1 B2                12                      0           6                1          False
Y1 S2 L2 A2 I2 B1                 6                      0           6                1          False
Y1 S2 L2 A2 I2 B2                 6                      0           6                1          False
Y1 S3 L1 A1 I1 B1                12                      1           6                1          False
Y1 S3 L1 A1 I1 B2                12                      1           6                0          False
Y1 S3 L1 A1 I2 B1                 6                      0           6                1          False
Y1 S3 L1 A1 I2 B2                 6                      0           6                0           True
Y1 S3 L1 A2 I1 B1                12                      0           6                1          False
Y1 S3 L1 A2 I1 B2                12                      0           6                0           True
Y1 S3 L1 A2 I2 B1                 6                      0           6                1          False
Y1 S3 L1 A2 I2 B2                 6                      0           6                0           True
Y1 S3 L2 A1 I1 B1                12                      0           6                1          False
Y1 S3 L2 A1 I1 B2                12                      0           6                1          False
Y1 S3 L2 A1 I2 B1                 6                      0           6                1          False
Y1 S3 L2 A1 I2 B2                 6                      0           6                1          False
Y1 S3 L2 A2 I1 B1                12                      0           6                1          False
Y1 S3 L2 A2 I1 B2                12                      0           6                1          False
Y1 S3 L2 A2 I2 B1                 6                      0           6                1          False
Y1 S3 L2 A2 I2 B2                 6                      0           6                1          False
Y2 S1 L1 A1 I1 B1                12                      1           6                1          False
Y2 S1 L1 A1 I1 B2                12                      1           6                0          False
Y2 S1 L1 A1 I2 B1                 6                      0           6                1          False
Y2 S1 L1 A1 I2 B2                 6                      0           6                0           True
Y2 S1 L1 A2 I1 B1                12                      0           6                1          False
Y2 S1 L1 A2 I1 B2                12                      0           6                0           True
Y2 S1 L1 A2 I2 B1                 6                      0           6                1          False
Y2 S1 L1 A2 I2 B2                 6                      0           6                0           True
Y2 S1 L2 A1 I1 B1                12                      0           6                1          False
Y2 S1 L2 A1 I1 B2                12                      0           6                1          False
Y2 S1 L2 A1 I2 B1                 6                      0           6                1          False
Y2 S1 L2 A1 I2 B2                 6                      0           6                1          False
Y2 S1 L2 A2 I1 B1                12                      0           6                1          False
Y2 S1 L2 A2 I1 B2                12                      0           6                1          False
Y2 S1 L2 A2 I2 B1                 6                      0           6                1          False
Y2 S1 L2 A2 I2 B2                 6                      0           6                1          False
Y2 S2 L1 A1 I1 B1                12                      1           6                1          False
Y2 S2 L1 A1 I1 B2                12                      1           6                0          False
Y2 S2 L1 A1 I2 B1                 6                      0           6                1          False
Y2 S2 L1 A1 I2 B2                 6                      0           6                0           True
Y2 S2 L1 A2 I1 B1                12                      0           6                1          False
Y2 S2 L1 A2 I1 B2                12                      0           6                0           True
Y2 S2 L1 A2 I2 B1                 6                      0           6                1          False
Y2 S2 L1 A2 I2 B2                 6                      0           6                0           True
Y2 S2 L2 A1 I1 B1                12                      0           6                1          False
Y2 S2 L2 A1 I1 B2                12                      0           6                1          False
Y2 S2 L2 A1 I2 B1                 6                      0           6                1          False
Y2 S2 L2 A1 I2 B2                 6                      0           6                1          False
Y2 S2 L2 A2 I1 B1                12                      0           6                1          False
Y2 S2 L2 A2 I1 B2                12                      0           6                1          False
Y2 S2 L2 A2 I2 B1                 6                      0           6                1          False
Y2 S2 L2 A2 I2 B2                 6                      0           6                1          False
Y2 S3 L1 A1 I1 B1                12                      1           6                1          False
Y2 S3 L1 A1 I1 B2                12                      1           6                0          False
Y2 S3 L1 A1 I2 B1                 6                      1           6                1          False
Y2 S3 L1 A1 I2 B2                 6                      1           6                0          False
Y2 S3 L1 A2 I1 B1                12                      0           6                1          False
Y2 S3 L1 A2 I1 B2                12                      0           6                0           True
Y2 S3 L1 A2 I2 B1                 6                      0           6                1          False
Y2 S3 L1 A2 I2 B2                 6                      0           6                0           True
Y2 S3 L2 A1 I1 B1                12                      0           6                1          False
Y2 S3 L2 A1 I1 B2                12                      0           6                1          False
Y2 S3 L2 A1 I2 B1                 6                      0           6                1          False
Y2 S3 L2 A1 I2 B2                 6                      0           6                1          False
Y2 S3 L2 A2 I1 B1                12                      0           6                1          False
Y2 S3 L2 A2 I1 B2                12                      0           6                1          False
Y2 S3 L2 A2 I2 B1                 6                      0           6                1          False
Y2 S3 L2 A2 I2 B2                 6                      0           6                1          False
Readings where the absence holds: 17 of 96
       sum  count
Y  A             
Y1 A1    3     24
   A2    6     24
Y2 A1    2     24
   A2    6     24

Result: blocked (methods underspecified). Under Y1 the absence holds under 3 of 24 readings with each contrast alone (A1: I2 with B2 on yearly means, under S1, S2 and S3) and 6 of 24 with contrasts adjusted over the model's contrasts (A2: B2 on yearly means, I1 or I2); under the others a mixture against monoculture contrast is significant (beech starch in 2020, mixtures higher by 3.6 %, p 0.018 to 0.045 under I1 and A1, none under A2), or a 2021 NBE differs from zero (Asat, -60 to -67, p 0.0002 to 0.019, except B2 on yearly means, p 0.078). The Y2 variant gives 2 (A1) and 6 (A2) of 24.

figs2-beech-asat-selection-warming¶

Under warming, beech Asat showed a positive selection effect, too weak to change the net biodiversity effect.

In [34]:
b = btable("B", ["Photo"], "W")
print(b.round(4).to_string(index=False))
rows = []
for (B, L), g in b.groupby(["B", "L"]):
    hold = []
    for yr in (2020, 2021):
        se = g[(g.Year == yr) & (g.effect == "SE")].iloc[0]
        nbe = g[(g.Year == yr) & (g.effect == "NBE")].iloc[0]
        hold.append(bool(se["mean"] > 0 and se.p < 0.05 and not nbe.p < 0.05))
    rows.append({"B": B, "L": L, "holds_2020": hold[0], "holds_2021": hold[1], "reproduced": any(hold)})
print(pd.DataFrame(rows).to_string(index=False))
Species trait treat  Year  B  L effect  n      mean       t      p
      B Photo     W  2020 B1 L1    NBE  6   23.1071  0.4076 0.7004
      B Photo     W  2020 B1 L1     CE  6   46.2142  0.4076 0.7004
      B Photo     W  2020 B1 L1     SE  6    0.0000  0.0000 1.0000
      B Photo     W  2021 B1 L1    NBE  6  -59.9265 -3.4243 0.0188
      B Photo     W  2021 B1 L1     CE  6 -119.8531 -3.4243 0.0188
      B Photo     W  2021 B1 L1     SE  6   -0.0000 -0.0000 1.0000
      B Photo     W  2020 B1 L2    NBE 18   23.1071  0.4723 0.6427
      B Photo     W  2020 B1 L2     CE 18   46.2142  0.4723 0.6427
      B Photo     W  2020 B1 L2     SE 18   11.6113  0.2380 0.8147
      B Photo     W  2021 B1 L2    NBE 18  -59.9265 -4.6387 0.0002
      B Photo     W  2021 B1 L2     CE 18 -119.8531 -4.6387 0.0002
      B Photo     W  2021 B1 L2     SE 18    3.2558  0.2472 0.8077
      B Photo     W  2020 B2 L1    NBE  6    8.1958  0.1298 0.9018
      B Photo     W  2020 B2 L1     CE  6   16.3916  0.1298 0.9018
      B Photo     W  2020 B2 L1     SE  6  -14.9857 -0.2334 0.8247
      B Photo     W  2021 B2 L1    NBE  6  -67.1564 -2.2087 0.0782
      B Photo     W  2021 B2 L1     CE  6 -134.3129 -2.2087 0.0782
      B Photo     W  2021 B2 L1     SE  6  -18.3386 -0.7079 0.5106
      B Photo     W  2020 B2 L2    NBE 18    8.1958  0.1670 0.8693
      B Photo     W  2020 B2 L2     CE 18   16.3916  0.1670 0.8693
      B Photo     W  2020 B2 L2     SE 18   -0.2606 -0.0053 0.9958
      B Photo     W  2021 B2 L2    NBE 18  -67.1564 -3.0385 0.0074
      B Photo     W  2021 B2 L2     CE 18 -134.3129 -3.0385 0.0074
      B Photo     W  2021 B2 L2     SE 18  -19.1880 -1.0138 0.3249
 B  L  holds_2020  holds_2021  reproduced
B1 L1       False       False       False
B1 L2       False       False       False
B2 L1       False       False       False
B2 L2       False       False       False

Result: not reproduced. Under no reading and in neither year is the selection effect on beech Asat under W positive and significant: its mean is 0 under B1 on yearly means (by construction), 11.6 and 3.3 (p 0.81 and 0.81) under B1 on campaigns, and -0.3 to -19 (p 0.32 to 1.0) under B2. Under B1 on yearly means the SE is 0 by construction with the claims file's reading of Eq. 4, so that reading cannot show a selection effect; a question asks about it.

tables3-oak-warming-diameter¶

Under warming, oak in mixtures had a diameter increment about 0.3 cm per year lower than in monocultures, and no other difference between mixtures and monocultures.

In [35]:
t = itable("O", LEAF_C + GROWTH, "W")
print("Oak under W, diameter increment:")
print(t[t.trait == "Diameter_growth"].round(4).to_string(index=False))
print("\nOther oak traits under W with p < 0.05:")
print(t[(t.trait != "Diameter_growth") & (t.p < 0.05)].round(4).to_string(index=False))
rows = []
for reading in ireadings("Diameter_growth"):
    for I in ("I1", "I2"):
        g = t[(t.reading == "/".join(reading)) & (t.I == I)]
        dia = g[g.trait == "Diameter_growth"]
        hits = dia[(dia.p < 0.05) & (dia.raw_mix_minus_mono < 0)]
        u1 = bool(hits.raw_mix_minus_mono.map(lambda v: within(-v, 0.3, 0.03)).any())
        u2 = bool(hits.raw_mix_minus_mono.map(lambda v: within(-v, 0.03, 0.003)).any())
        others = int((g[g.trait != "Diameter_growth"].p < 0.05).sum())
        rows.append({"reading": "/".join(reading), "Y": reading[0], "I": I, "diameter lower and significant": len(hits) > 0,
                     "within 0.3 (u1)": u1, "within 0.03 (u2, mm in cm)": u2, "other significant": others})
print(pd.DataFrame(rows).to_string(index=False))
Oak under W, diameter increment:
species           trait     reading  Y  A treat  I    year                     transform  raw_mix_minus_mono  raw_all  estimate       z      p
      O Diameter_growth Y1/S1/L1/A1 Y1 A1     W I1    2020          none (negatives, S1)             -0.2217  -0.2217   -0.4534 -1.2601 0.2076
      O Diameter_growth Y1/S1/L1/A1 Y1 A1     W I1    2021          none (negatives, S1)              0.3433   0.3433    0.7566  2.1024 0.0355
      O Diameter_growth Y1/S1/L1/A1 Y1 A1     W I2 2020-21          none (negatives, S1)              0.0608   0.0608    0.1516  0.5652 0.5720
      O Diameter_growth Y1/S1/L1/A2 Y1 A2     W I1    2020          none (negatives, S1)             -0.2217  -0.2217   -0.4534 -1.2601 0.8187
      O Diameter_growth Y1/S1/L1/A2 Y1 A2     W I1    2021          none (negatives, S1)              0.3433   0.3433    0.7566  2.1024 0.2418
      O Diameter_growth Y1/S1/L1/A2 Y1 A2     W I2 2020-21          none (negatives, S1)              0.0608   0.0608    0.1516  0.5652 0.9657
      O Diameter_growth Y1/S2/L1/A1 Y1 A1     W I1    2020           sqrt(x + 0.68) (S2)             -0.2217  -0.2217   -0.1701 -1.2090 0.2267
      O Diameter_growth Y1/S2/L1/A1 Y1 A1     W I1    2021           sqrt(x + 0.68) (S2)              0.3433   0.3433    0.2652  1.8847 0.0595
      O Diameter_growth Y1/S2/L1/A1 Y1 A1     W I2 2020-21           sqrt(x + 0.68) (S2)              0.0608   0.0608    0.0475  0.4542 0.6497
      O Diameter_growth Y1/S2/L1/A2 Y1 A2     W I1    2020           sqrt(x + 0.68) (S2)             -0.2217  -0.2217   -0.1701 -1.2090 0.8474
      O Diameter_growth Y1/S2/L1/A2 Y1 A2     W I1    2021           sqrt(x + 0.68) (S2)              0.3433   0.3433    0.2652  1.8847 0.3711
      O Diameter_growth Y1/S2/L1/A2 Y1 A2     W I2 2020-21           sqrt(x + 0.68) (S2)              0.0608   0.0608    0.0475  0.4542 0.9846
      O Diameter_growth Y1/S3/L1/A1 Y1 A1     W I1    2020 sqrt, 9 negative dropped (S3)             -0.2217  -0.2217   -0.1558 -0.9056 0.3651
      O Diameter_growth Y1/S3/L1/A1 Y1 A1     W I1    2021 sqrt, 9 negative dropped (S3)              0.6820   0.3433    0.3924  2.1626 0.0306
      O Diameter_growth Y1/S3/L1/A1 Y1 A1     W I2 2020-21 sqrt, 9 negative dropped (S3)              0.1759   0.0608    0.1183  0.9075 0.3641
      O Diameter_growth Y1/S3/L1/A2 Y1 A2     W I1    2020 sqrt, 9 negative dropped (S3)             -0.2217  -0.2217   -0.1558 -0.9056 0.9623
      O Diameter_growth Y1/S3/L1/A2 Y1 A2     W I1    2021 sqrt, 9 negative dropped (S3)              0.6820   0.3433    0.3924  2.1626 0.2115
      O Diameter_growth Y1/S3/L1/A2 Y1 A2     W I2 2020-21 sqrt, 9 negative dropped (S3)              0.1759   0.0608    0.1183  0.9075 0.8333
      O Diameter_growth Y2/S1/L1/A1 Y2 A1     W I1    2020          none (negatives, S1)             -0.2217  -0.2217   -0.5442 -1.2828 0.1996
      O Diameter_growth Y2/S1/L1/A1 Y2 A1     W I1    2021          none (negatives, S1)              0.3433   0.3433    0.6658  1.5697 0.1165
      O Diameter_growth Y2/S1/L1/A1 Y2 A1     W I2 2020-21          none (negatives, S1)              0.0608   0.0608    0.0608  0.1897 0.8495
      O Diameter_growth Y2/S1/L1/A2 Y2 A2     W I1    2020          none (negatives, S1)             -0.2217  -0.2217   -0.5442 -1.2828 0.8067
      O Diameter_growth Y2/S1/L1/A2 Y2 A2     W I1    2021          none (negatives, S1)              0.3433   0.3433    0.6658  1.5697 0.6042
      O Diameter_growth Y2/S1/L1/A2 Y2 A2     W I2 2020-21          none (negatives, S1)              0.0608   0.0608    0.0608  0.1897 0.9995
      O Diameter_growth Y2/S2/L1/A1 Y2 A1     W I1    2020           sqrt(x + 0.68) (S2)             -0.2217  -0.2217   -0.2082 -1.2718 0.2034
      O Diameter_growth Y2/S2/L1/A1 Y2 A1     W I1    2021           sqrt(x + 0.68) (S2)              0.3433   0.3433    0.2271  1.3870 0.1655
      O Diameter_growth Y2/S2/L1/A1 Y2 A1     W I2 2020-21           sqrt(x + 0.68) (S2)              0.0608   0.0608    0.0094  0.0761 0.9393
      O Diameter_growth Y2/S2/L1/A2 Y2 A2     W I1    2020           sqrt(x + 0.68) (S2)             -0.2217  -0.2217   -0.2082 -1.2718 0.8134
      O Diameter_growth Y2/S2/L1/A2 Y2 A2     W I1    2021           sqrt(x + 0.68) (S2)              0.3433   0.3433    0.2271  1.3870 0.7388
      O Diameter_growth Y2/S2/L1/A2 Y2 A2     W I2 2020-21           sqrt(x + 0.68) (S2)              0.0608   0.0608    0.0094  0.0761 1.0000
      O Diameter_growth Y2/S3/L1/A1 Y2 A1     W I1    2020 sqrt, 8 negative dropped (S3)             -0.2217  -0.2217   -0.1488 -0.7628 0.4456
      O Diameter_growth Y2/S3/L1/A1 Y2 A1     W I1    2021 sqrt, 8 negative dropped (S3)              0.6820   0.3433    0.3994  1.9632 0.0496
      O Diameter_growth Y2/S3/L1/A1 Y2 A1     W I2 2020-21 sqrt, 8 negative dropped (S3)              0.1759   0.0608    0.1253  0.8381 0.4020
      O Diameter_growth Y2/S3/L1/A2 Y2 A2     W I1    2020 sqrt, 8 negative dropped (S3)             -0.2217  -0.2217   -0.1488 -0.7628 0.9859
      O Diameter_growth Y2/S3/L1/A2 Y2 A2     W I1    2021 sqrt, 8 negative dropped (S3)              0.6820   0.3433    0.3994  1.9632 0.3219
      O Diameter_growth Y2/S3/L1/A2 Y2 A2     W I2 2020-21 sqrt, 8 negative dropped (S3)              0.1759   0.0608    0.1253  0.8381 0.8721

Other oak traits under W with p < 0.05:
species         trait     reading  Y  A treat  I    year            transform  raw_mix_minus_mono  raw_all  estimate       z      p
      O Height_growth Y1/S1/L1/A1 Y1 A1     W I1    2021 none (negatives, S1)             13.1667  13.1667   12.6390  2.1241 0.0337
      O    AGB_growth Y1/S1/L1/A1 Y1 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2501 -2.5020 0.0123
      O    AGB_growth Y1/S1/L1/A1 Y1 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0099
      O    AGB_growth Y1/S1/L1/A2 Y1 A2     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0390
      O    AGB_growth Y1/S2/L1/A1 Y1 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2501 -2.5020 0.0123
      O    AGB_growth Y1/S2/L1/A1 Y1 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0099
      O    AGB_growth Y1/S2/L1/A2 Y1 A2     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0390
      O    AGB_growth Y1/S3/L1/A1 Y1 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2501 -2.5020 0.0123
      O    AGB_growth Y1/S3/L1/A1 Y1 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0099
      O    AGB_growth Y1/S3/L1/A2 Y1 A2     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7221 -2.5778 0.0390
      O    AGB_growth Y2/S1/L1/A1 Y2 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2478 -2.3661 0.0180
      O    AGB_growth Y2/S1/L1/A1 Y2 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7198 -2.3789 0.0174
      O    AGB_growth Y2/S2/L1/A1 Y2 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2478 -2.3661 0.0180
      O    AGB_growth Y2/S2/L1/A1 Y2 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7198 -2.3789 0.0174
      O    AGB_growth Y2/S3/L1/A1 Y2 A1     W I1    2020                 sqrt             -8.9292  -8.9292   -2.2478 -2.3661 0.0180
      O    AGB_growth Y2/S3/L1/A1 Y2 A1     W I2 2020-21                 sqrt             -8.2750  -8.2750   -1.7198 -2.3789 0.0174
    reading  Y  I  diameter lower and significant  within 0.3 (u1)  within 0.03 (u2, mm in cm)  other significant
Y1/S1/L1/A1 Y1 I1                           False            False                       False                  2
Y1/S1/L1/A1 Y1 I2                           False            False                       False                  1
Y1/S1/L1/A2 Y1 I1                           False            False                       False                  0
Y1/S1/L1/A2 Y1 I2                           False            False                       False                  1
Y1/S2/L1/A1 Y1 I1                           False            False                       False                  1
Y1/S2/L1/A1 Y1 I2                           False            False                       False                  1
Y1/S2/L1/A2 Y1 I1                           False            False                       False                  0
Y1/S2/L1/A2 Y1 I2                           False            False                       False                  1
Y1/S3/L1/A1 Y1 I1                           False            False                       False                  1
Y1/S3/L1/A1 Y1 I2                           False            False                       False                  1
Y1/S3/L1/A2 Y1 I1                           False            False                       False                  0
Y1/S3/L1/A2 Y1 I2                           False            False                       False                  1
Y2/S1/L1/A1 Y2 I1                           False            False                       False                  1
Y2/S1/L1/A1 Y2 I2                           False            False                       False                  1
Y2/S1/L1/A2 Y2 I1                           False            False                       False                  0
Y2/S1/L1/A2 Y2 I2                           False            False                       False                  0
Y2/S2/L1/A1 Y2 I1                           False            False                       False                  1
Y2/S2/L1/A1 Y2 I2                           False            False                       False                  1
Y2/S2/L1/A2 Y2 I1                           False            False                       False                  0
Y2/S2/L1/A2 Y2 I2                           False            False                       False                  0
Y2/S3/L1/A1 Y2 I1                           False            False                       False                  1
Y2/S3/L1/A1 Y2 I2                           False            False                       False                  1
Y2/S3/L1/A2 Y2 I1                           False            False                       False                  0
Y2/S3/L1/A2 Y2 I2                           False            False                       False                  0

Result: not reproduced. Under W, oak diameter increment in mixtures is not significantly lower than in monocultures under any reading, with contrasts alone (A1) or adjusted (A2) (raw mixture minus monoculture -0.22 in 2020, p 0.20 to 0.45; +0.34 in 2021, +0.68 on the rows S3 keeps; +0.06 over both years), and other oak contrasts are significant (AGWB increment, -8.9 g in 2020, p 0.012 under Y1 and A1; over both years -8.3 g, p 0.039 under Y1 and A2).

fig5-oak-agwb-nbe-warming-2020¶

Under warming in 2020, oak showed a negative net biodiversity effect on AGWB increment, explained by a negative complementarity effect.

In [36]:
b = btable("O", ["AGB_growth"], "W", years=(2020, 2021))
print(b.round(4).to_string(index=False))
for B in ("B1", "B2"):
    g = b[(b.B == B) & (b.Year == 2020)].set_index("effect")
    print(B, "2020: NBE negative and p < 0.05:", bool(g.loc["NBE", "mean"] < 0 and g.loc["NBE", "p"] < 0.05),
          "; CE negative and p < 0.05:", bool(g.loc["CE", "mean"] < 0 and g.loc["CE", "p"] < 0.05))
Species      trait treat  Year  B  L effect  n      mean       t      p
      O AGB_growth     W  2020 B1 L1    NBE  6 -446.4613 -6.1566 0.0016
      O AGB_growth     W  2020 B1 L1     CE  6 -892.9226 -6.1566 0.0016
      O AGB_growth     W  2020 B1 L1     SE  6    0.0000  0.0000 1.0000
      O AGB_growth     W  2021 B1 L1    NBE  6 -381.0386 -1.6640 0.1570
      O AGB_growth     W  2021 B1 L1     CE  6 -762.0771 -1.6640 0.1570
      O AGB_growth     W  2021 B1 L1     SE  6   -0.0000 -0.0000 1.0000
      O AGB_growth     W  2020 B2 L1    NBE  6 -315.8994 -2.3487 0.0657
      O AGB_growth     W  2020 B2 L1     CE  6 -631.7988 -2.3487 0.0657
      O AGB_growth     W  2020 B2 L1     SE  6   -3.6410 -0.0464 0.9648
      O AGB_growth     W  2021 B2 L1    NBE  6 -179.8168 -1.1154 0.3154
      O AGB_growth     W  2021 B2 L1     CE  6 -359.6336 -1.1154 0.3154
      O AGB_growth     W  2021 B2 L1     SE  6 -234.5896 -1.3711 0.2287
B1 2020: NBE negative and p < 0.05: True ; CE negative and p < 0.05: True
B2 2020: NBE negative and p < 0.05: False ; CE negative and p < 0.05: False

Result: blocked (methods underspecified). For oak AGWB increment under W in 2020, NBE and CE are negative and significant against the monoculture mean (B1, NBE -446, p 0.0016) but not against the tree's own chamber (B2, -316, p 0.066). The two readings differ.

tables3-beech-mr-diameter¶

Under lower soil moisture, beech in mixtures had a smaller diameter increment than in monocultures.

In [37]:
t = itable("B", ["Diameter_growth"], "MR")
t["lower_and_significant"] = (t.p < 0.05) & (t.estimate < 0)
print(t.round(4).to_string(index=False))
print(t.groupby("reading").lower_and_significant.any().to_string())
species           trait     reading  Y  A treat  I    year                      transform  raw_mix_minus_mono  raw_all  estimate       z      p  lower_and_significant
      B Diameter_growth Y1/S1/L1/A1 Y1 A1    MR I1    2020           none (negatives, S1)             -0.1950  -0.1950   -0.3265 -0.7371 0.4611                  False
      B Diameter_growth Y1/S1/L1/A1 Y1 A1    MR I1    2021           none (negatives, S1)              0.6700   0.6700    0.8629  2.0255 0.0428                  False
      B Diameter_growth Y1/S1/L1/A1 Y1 A1    MR I2 2020-21           none (negatives, S1)              0.2163   0.2163    0.2682  0.8304 0.4063                  False
      B Diameter_growth Y1/S1/L1/A2 Y1 A2    MR I1    2020           none (negatives, S1)             -0.1950  -0.1950   -0.3265 -0.7371 0.9882                  False
      B Diameter_growth Y1/S1/L1/A2 Y1 A2    MR I1    2021           none (negatives, S1)              0.6700   0.6700    0.8629  2.0255 0.2837                  False
      B Diameter_growth Y1/S1/L1/A2 Y1 A2    MR I2 2020-21           none (negatives, S1)              0.2163   0.2163    0.2682  0.8304 0.8736                  False
      B Diameter_growth Y1/S2/L1/A1 Y1 A1    MR I1    2020            sqrt(x + 2.29) (S2)             -0.1950  -0.1950   -0.0967 -0.6897 0.4904                  False
      B Diameter_growth Y1/S2/L1/A1 Y1 A1    MR I1    2021            sqrt(x + 2.29) (S2)              0.6700   0.6700    0.3174  2.3552 0.0185                  False
      B Diameter_growth Y1/S2/L1/A1 Y1 A1    MR I2 2020-21            sqrt(x + 2.29) (S2)              0.2163   0.2163    0.1104  1.0803 0.2800                  False
      B Diameter_growth Y1/S2/L1/A2 Y1 A2    MR I1    2020            sqrt(x + 2.29) (S2)             -0.1950  -0.1950   -0.0967 -0.6897 0.9920                  False
      B Diameter_growth Y1/S2/L1/A2 Y1 A2    MR I1    2021            sqrt(x + 2.29) (S2)              0.6700   0.6700    0.3174  2.3552 0.1346                  False
      B Diameter_growth Y1/S2/L1/A2 Y1 A2    MR I2 2020-21            sqrt(x + 2.29) (S2)              0.2163   0.2163    0.1104  1.0803 0.7280                  False
      B Diameter_growth Y1/S3/L1/A1 Y1 A1    MR I1    2020 sqrt, 21 negative dropped (S3)             -0.1950  -0.1950   -0.1282 -0.5607 0.5750                  False
      B Diameter_growth Y1/S3/L1/A1 Y1 A1    MR I1    2021 sqrt, 21 negative dropped (S3)             -0.1650   0.6700    0.1680  0.4545 0.6495                  False
      B Diameter_growth Y1/S3/L1/A1 Y1 A1    MR I2 2020-21 sqrt, 21 negative dropped (S3)             -0.2194   0.2163    0.0199  0.0869 0.9307                  False
      B Diameter_growth Y1/S3/L1/A2 Y1 A2    MR I1    2020 sqrt, 21 negative dropped (S3)             -0.1950  -0.1950   -0.1282 -0.5607 0.9977                  False
      B Diameter_growth Y1/S3/L1/A2 Y1 A2    MR I1    2021 sqrt, 21 negative dropped (S3)             -0.1650   0.6700    0.1680  0.4545 0.9994                  False
      B Diameter_growth Y1/S3/L1/A2 Y1 A2    MR I2 2020-21 sqrt, 21 negative dropped (S3)             -0.2194   0.2163    0.0199  0.0869 1.0000                  False
      B Diameter_growth Y2/S1/L1/A1 Y2 A1    MR I1    2020           none (negatives, S1)             -0.1950  -0.1950   -0.3663 -0.7421 0.4580                  False
      B Diameter_growth Y2/S1/L1/A1 Y2 A1    MR I1    2021           none (negatives, S1)              0.6700   0.6700    0.8258  1.7419 0.0815                  False
      B Diameter_growth Y2/S1/L1/A1 Y2 A1    MR I2 2020-21           none (negatives, S1)              0.2163   0.2163    0.2297  0.6263 0.5311                  False
      B Diameter_growth Y2/S1/L1/A2 Y2 A2    MR I1    2020           none (negatives, S1)             -0.1950  -0.1950   -0.3663 -0.7421 0.9880                  False
      B Diameter_growth Y2/S1/L1/A2 Y2 A2    MR I1    2021           none (negatives, S1)              0.6700   0.6700    0.8258  1.7419 0.4739                  False
      B Diameter_growth Y2/S1/L1/A2 Y2 A2    MR I2 2020-21           none (negatives, S1)              0.2163   0.2163    0.2297  0.6263 0.9517                  False
      B Diameter_growth Y2/S2/L1/A1 Y2 A1    MR I1    2020            sqrt(x + 2.29) (S2)             -0.1950  -0.1950   -0.1096 -0.6816 0.4955                  False
      B Diameter_growth Y2/S2/L1/A1 Y2 A1    MR I1    2021            sqrt(x + 2.29) (S2)              0.6700   0.6700    0.3054  1.9791 0.0478                  False
      B Diameter_growth Y2/S2/L1/A1 Y2 A1    MR I2 2020-21            sqrt(x + 2.29) (S2)              0.2163   0.2163    0.0979  0.8203 0.4121                  False
      B Diameter_growth Y2/S2/L1/A2 Y2 A2    MR I1    2020            sqrt(x + 2.29) (S2)             -0.1950  -0.1950   -0.1096 -0.6816 0.9927                  False
      B Diameter_growth Y2/S2/L1/A2 Y2 A2    MR I1    2021            sqrt(x + 2.29) (S2)              0.6700   0.6700    0.3054  1.9791 0.3122                  False
      B Diameter_growth Y2/S2/L1/A2 Y2 A2    MR I2 2020-21            sqrt(x + 2.29) (S2)              0.2163   0.2163    0.0979  0.8203 0.8805                  False
      B Diameter_growth Y2/S3/L1/A1 Y2 A1    MR I1    2020 sqrt, 20 negative dropped (S3)             -0.1950  -0.1950   -0.1706 -0.7049 0.4808                  False
      B Diameter_growth Y2/S3/L1/A1 Y2 A1    MR I1    2021 sqrt, 20 negative dropped (S3)             -0.1650   0.6700    0.0894  0.2266 0.8208                  False
      B Diameter_growth Y2/S3/L1/A1 Y2 A1    MR I2 2020-21 sqrt, 20 negative dropped (S3)             -0.2194   0.2163   -0.0406 -0.1618 0.8714                  False
      B Diameter_growth Y2/S3/L1/A2 Y2 A2    MR I1    2020 sqrt, 20 negative dropped (S3)             -0.1950  -0.1950   -0.1706 -0.7049 0.9911                  False
      B Diameter_growth Y2/S3/L1/A2 Y2 A2    MR I1    2021 sqrt, 20 negative dropped (S3)             -0.1650   0.6700    0.0894  0.2266 1.0000                  False
      B Diameter_growth Y2/S3/L1/A2 Y2 A2    MR I2 2020-21 sqrt, 20 negative dropped (S3)             -0.2194   0.2163   -0.0406 -0.1618 0.9997                  False
reading
Y1/S1/L1/A1    False
Y1/S1/L1/A2    False
Y1/S2/L1/A1    False
Y1/S2/L1/A2    False
Y1/S3/L1/A1    False
Y1/S3/L1/A2    False
Y2/S1/L1/A1    False
Y2/S1/L1/A2    False
Y2/S2/L1/A1    False
Y2/S2/L1/A2    False
Y2/S3/L1/A1    False
Y2/S3/L1/A2    False

Result: not reproduced. Under MR, beech diameter increment is not significantly lower in mixtures under any reading, A1 or A2: the 2020 difference is -0.20 (p 0.46 to 0.58 under A1); in 2021 mixtures grow more under S1 and S2 (+0.67, p 0.018 to 0.082 under A1, 0.13 to 0.47 under A2), and on the rows S3 keeps the difference is -0.17 (p 0.65 and 0.82 under A1); over both years it is +0.22 (S1, S2, p 0.28 to 0.53 under A1) or -0.22 (S3, p 0.87 and 0.93 under A1).

fig5-beech-sugar-nbe-mr¶

Under low soil moisture, beech showed a negative net biodiversity effect on sugar concentration, driven by a negative complementarity effect.

In [38]:
b = btable("B", ["Sugar"], "MR")
print(b.round(4).to_string(index=False))
rows = []
for (B, L), g in b.groupby(["B", "L"]):
    for yr in (2020, 2021):
        h = g[g.Year == yr].set_index("effect")
        rows.append({"B": B, "L": L, "year": yr,
                     "NBE<0 sig": bool(h.loc["NBE", "mean"] < 0 and h.loc["NBE", "p"] < 0.05),
                     "CE<0 sig": bool(h.loc["CE", "mean"] < 0 and h.loc["CE", "p"] < 0.05)})
r = pd.DataFrame(rows); r["both"] = r["NBE<0 sig"] & r["CE<0 sig"]
print(r.to_string(index=False))
print(r.groupby(["B", "L"]).both.any().rename("reproduced (2020 or 2021)").to_string())
Species trait treat  Year  B  L effect  n      mean       t      p
      B Sugar    MR  2020 B1 L1    NBE  6  -95.4458 -4.3752 0.0072
      B Sugar    MR  2020 B1 L1     CE  6 -190.8916 -4.3752 0.0072
      B Sugar    MR  2020 B1 L1     SE  6    0.0000  0.0000 1.0000
      B Sugar    MR  2021 B1 L1    NBE  6    1.2752  0.0447 0.9661
      B Sugar    MR  2021 B1 L1     CE  6    2.5503  0.0447 0.9661
      B Sugar    MR  2021 B1 L1     SE  6    0.0000  0.0000 1.0000
      B Sugar    MR  2020 B1 L2    NBE 18  -95.4458 -2.4778 0.0240
      B Sugar    MR  2020 B1 L2     CE 18 -190.8916 -2.4778 0.0240
      B Sugar    MR  2020 B1 L2     SE 18  -19.7660 -0.5682 0.5774
      B Sugar    MR  2021 B1 L2    NBE 18    1.2752  0.0561 0.9559
      B Sugar    MR  2021 B1 L2     CE 18    2.5503  0.0561 0.9559
      B Sugar    MR  2021 B1 L2     SE 18   -5.4492 -0.2391 0.8139
      B Sugar    MR  2020 B2 L1    NBE  6  -94.4480 -5.6046 0.0025
      B Sugar    MR  2020 B2 L1     CE  6 -188.8960 -5.6046 0.0025
      B Sugar    MR  2020 B2 L1     SE  6    1.5091  0.0840 0.9363
      B Sugar    MR  2021 B2 L1    NBE  6   10.8790  0.2928 0.7814
      B Sugar    MR  2021 B2 L1     CE  6   21.7579  0.2928 0.7814
      B Sugar    MR  2021 B2 L1     SE  6   -8.2948 -0.2176 0.8364
      B Sugar    MR  2020 B2 L2    NBE 18  -94.4480 -2.2846 0.0355
      B Sugar    MR  2020 B2 L2     CE 18 -188.8960 -2.2846 0.0355
      B Sugar    MR  2020 B2 L2     SE 18  -40.1961 -1.0726 0.2984
      B Sugar    MR  2021 B2 L2    NBE 18   10.8790  0.3728 0.7139
      B Sugar    MR  2021 B2 L2     CE 18   21.7579  0.3728 0.7139
      B Sugar    MR  2021 B2 L2     SE 18  -55.8801 -1.6780 0.1116
 B  L  year  NBE<0 sig  CE<0 sig  both
B1 L1  2020       True      True  True
B1 L1  2021      False     False False
B1 L2  2020       True      True  True
B1 L2  2021      False     False False
B2 L1  2020       True      True  True
B2 L1  2021      False     False False
B2 L2  2020       True      True  True
B2 L2  2021      False     False False
B   L 
B1  L1    True
    L2    True
B2  L1    True
    L2    True

Result: reproduced. In 2020, the NBE on beech sugar under MR is negative and differs from zero under all four readings (-94 to -95, p 0.0025 to 0.036), and so does the complementarity effect, which is twice the NBE (Eq. 3 as printed). In 2021 it is near zero (p >= 0.71). The year found is 2020, as the Discussion says; the sign of CE is negative, as the Results say. With Eq. 3 read as in the claims file, CE is twice the NBE for every tree, so the complementarity part is not tested apart from the NBE; a question asks whether this is the paper's computation.

oak-mr-no-interaction¶

Under low soil moisture alone, oak showed no effect of species interactions and no net biodiversity effect.

In [39]:
t = itable("O", LEAF_C + GROWTH, "MR")
print("Oak under MR, mixture minus monoculture; significant:", int((t.p < 0.05).sum()), "of", len(t))
print(t[t.p < 0.05].round(4).to_string(index=False))
print("Significant per reading and I:"); print(t.groupby(["reading", "I"]).apply(lambda g: int((g.p < 0.05).sum())).to_string())
b = btable("O", LEAF_C + GROWTH, "MR", effects=("NBE",))
print("\nNBE of oak under MR:"); print(b.round(4).to_string(index=False))
print("NBEs with p < 0.05:", int((b.p < 0.05).sum()), "of", len(b))
combos = absence_combos("O", "MR", (2020, 2021))
print("\nPer reading (contrasts and NBE, 2020 and 2021):")
print(combos.to_string(index=False))
print("Readings where the absence holds:", int(combos.absence_holds.sum()), "of", len(combos))
print(combos.groupby(["Y", "A"]).absence_holds.agg(["sum", "count"]).to_string())
Oak under MR, mixture minus monoculture; significant: 22 of 324
species trait     reading  Y  A treat  I    year                     transform  raw_mix_minus_mono  raw_all  estimate      z      p
      O Photo Y1/S1/L1/A1 Y1 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0122
      O Photo Y1/S1/L1/A2 Y1 A2    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0479
      O Photo Y1/S1/L2/A1 Y1 A1    MR I2 2020-21          none (negatives, S1)              2.1777   2.1777    2.2349 2.4471 0.0144
      O Photo Y1/S2/L1/A1 Y1 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0122
      O Photo Y1/S2/L1/A2 Y1 A2    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0479
      O Photo Y1/S2/L2/A1 Y1 A1    MR I1    2020          sqrt(x + 0.165) (S2)              2.0797   2.0797    0.4702 2.0710 0.0384
      O Photo Y1/S2/L2/A1 Y1 A1    MR I1    2021          sqrt(x + 0.165) (S2)              2.2756   2.2756    0.4864 2.1425 0.0322
      O Photo Y1/S2/L2/A1 Y1 A1    MR I2 2020-21          sqrt(x + 0.165) (S2)              2.1777   2.1777    0.4783 2.8292 0.0047
      O Photo Y1/S2/L2/A2 Y1 A2    MR I2 2020-21          sqrt(x + 0.165) (S2)              2.1777   2.1777    0.4783 2.8292 0.0185
      O Photo Y1/S3/L1/A1 Y1 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0122
      O Photo Y1/S3/L1/A2 Y1 A2    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4585 2.5049 0.0479
      O Photo Y1/S3/L2/A1 Y1 A1    MR I1    2020 sqrt, 2 negative dropped (S3)              2.0797   2.0797    0.4481 1.9947 0.0461
      O Photo Y1/S3/L2/A1 Y1 A1    MR I2 2020-21 sqrt, 2 negative dropped (S3)              1.9873   2.1777    0.4280 2.5380 0.0111
      O Photo Y1/S3/L2/A2 Y1 A2    MR I2 2020-21 sqrt, 2 negative dropped (S3)              1.9873   2.1777    0.4280 2.5380 0.0437
      O Photo Y2/S1/L1/A1 Y2 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4390 2.1228 0.0338
      O Photo Y2/S1/L2/A1 Y2 A1    MR I2 2020-21          none (negatives, S1)              2.1777   2.1777    2.1352 2.1027 0.0355
      O Photo Y2/S2/L1/A1 Y2 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4390 2.1228 0.0338
      O Photo Y2/S2/L2/A1 Y2 A1    MR I1    2021          sqrt(x + 0.165) (S2)              2.2756   2.2756    0.4758 1.9607 0.0499
      O Photo Y2/S2/L2/A1 Y2 A1    MR I2 2020-21          sqrt(x + 0.165) (S2)              2.1777   2.1777    0.4677 2.5329 0.0113
      O Photo Y2/S2/L2/A2 Y2 A2    MR I2 2020-21          sqrt(x + 0.165) (S2)              2.1777   2.1777    0.4677 2.5329 0.0445
      O Photo Y2/S3/L1/A1 Y2 A1    MR I2 2020-21                          sqrt              2.1777   2.1777    0.4390 2.1228 0.0338
      O Photo Y2/S3/L2/A1 Y2 A1    MR I2 2020-21 sqrt, 2 negative dropped (S3)              1.9873   2.1777    0.3958 2.1661 0.0303
Significant per reading and I:
reading      I 
Y1/S1/L1/A1  I1    0
             I2    1
Y1/S1/L1/A2  I1    0
             I2    1
Y1/S1/L2/A1  I1    0
             I2    1
Y1/S1/L2/A2  I1    0
             I2    0
Y1/S2/L1/A1  I1    0
             I2    1
Y1/S2/L1/A2  I1    0
             I2    1
Y1/S2/L2/A1  I1    2
             I2    1
Y1/S2/L2/A2  I1    0
             I2    1
Y1/S3/L1/A1  I1    0
             I2    1
Y1/S3/L1/A2  I1    0
             I2    1
Y1/S3/L2/A1  I1    1
             I2    1
Y1/S3/L2/A2  I1    0
             I2    1
Y2/S1/L1/A1  I1    0
             I2    1
Y2/S1/L1/A2  I1    0
             I2    0
Y2/S1/L2/A1  I1    0
             I2    1
Y2/S1/L2/A2  I1    0
             I2    0
Y2/S2/L1/A1  I1    0
             I2    1
Y2/S2/L1/A2  I1    0
             I2    0
Y2/S2/L2/A1  I1    1
             I2    1
Y2/S2/L2/A2  I1    0
             I2    1
Y2/S3/L1/A1  I1    0
             I2    1
Y2/S3/L1/A2  I1    0
             I2    0
Y2/S3/L2/A1  I1    0
             I2    1
Y2/S3/L2/A2  I1    0
             I2    0
NBE of oak under MR:
Species           trait treat  Year  B  L effect  n      mean       t      p
      O          Starch    MR  2020 B1 L1    NBE  6   16.7509  0.8251 0.4469
      O          Starch    MR  2021 B1 L1    NBE  6   65.4210  1.7226 0.1456
      O          Starch    MR  2020 B1 L2    NBE 18   16.7509  0.3715 0.7149
      O          Starch    MR  2021 B1 L2    NBE 18   65.4210  1.5234 0.1460
      O          Starch    MR  2020 B2 L1    NBE  6   18.7884  1.0587 0.3382
      O          Starch    MR  2021 B2 L1    NBE  6   69.7953  1.9682 0.1062
      O          Starch    MR  2020 B2 L2    NBE 18   18.7884  0.5417 0.5951
      O          Starch    MR  2021 B2 L2    NBE 18   69.7953  1.6661 0.1140
      O           Sugar    MR  2020 B1 L1    NBE  6  -28.0413 -2.9901 0.0304
      O           Sugar    MR  2021 B1 L1    NBE  6  -14.2557 -1.2400 0.2700
      O           Sugar    MR  2020 B1 L2    NBE 18  -28.0413 -1.6178 0.1241
      O           Sugar    MR  2021 B1 L2    NBE 18  -14.2557 -1.0259 0.3193
      O           Sugar    MR  2020 B2 L1    NBE  6   -5.2817 -0.2755 0.7939
      O           Sugar    MR  2021 B2 L1    NBE  6  -45.1703 -1.3493 0.2351
      O           Sugar    MR  2020 B2 L2    NBE 18   -5.2817 -0.2184 0.8297
      O           Sugar    MR  2021 B2 L2    NBE 18  -45.1703 -1.8648 0.0796
      O           Photo    MR  2020 B1 L1    NBE  6  103.9858  1.4939 0.1954
      O           Photo    MR  2021 B1 L1    NBE  6  113.7805  2.9852 0.0306
      O           Photo    MR  2020 B1 L2    NBE 18  103.9858  2.4863 0.0236
      O           Photo    MR  2021 B1 L2    NBE 18  113.7805  2.7620 0.0133
      O           Photo    MR  2020 B2 L1    NBE  6  178.1586  1.5869 0.1734
      O           Photo    MR  2021 B2 L1    NBE  6  100.5503  1.0693 0.3338
      O           Photo    MR  2020 B2 L2    NBE 18  178.1586  2.7768 0.0129
      O           Photo    MR  2021 B2 L2    NBE 18  100.5503  1.5427 0.1413
      O   Height_growth    MR  2020 B1 L1    NBE  6    8.3333  0.0713 0.9459
      O   Height_growth    MR  2021 B1 L1    NBE  6  -45.8333 -0.3451 0.7441
      O   Height_growth    MR  2020 B2 L1    NBE  6 -104.1667 -0.7456 0.4894
      O   Height_growth    MR  2021 B2 L1    NBE  6  -70.8333 -0.5070 0.6337
      O Diameter_growth    MR  2020 B1 L1    NBE  6    0.4167  0.0746 0.9434
      O Diameter_growth    MR  2021 B1 L1    NBE  6    0.8333  0.0536 0.9593
      O Diameter_growth    MR  2020 B2 L1    NBE  6    2.0417  0.4149 0.6954
      O Diameter_growth    MR  2021 B2 L1    NBE  6    8.0833  0.4883 0.6460
      O      AGB_growth    MR  2020 B1 L1    NBE  6  222.6476  1.1743 0.2931
      O      AGB_growth    MR  2021 B1 L1    NBE  6   69.9253  1.0648 0.3356
      O      AGB_growth    MR  2020 B2 L1    NBE  6  246.9369  1.3820 0.2255
      O      AGB_growth    MR  2021 B2 L1    NBE  6   44.6750  0.5462 0.6084
NBEs with p < 0.05: 5 of 36
Per reading (contrasts and NBE, 2020 and 2021):
 Y  S  L  A  I  B  contrasts_tested  contrasts_significant  NBE_tested  NBE_significant  absence_holds
Y1 S1 L1 A1 I1 B1                12                      0          12                2          False
Y1 S1 L1 A1 I1 B2                12                      0          12                0           True
Y1 S1 L1 A1 I2 B1                 6                      1          12                2          False
Y1 S1 L1 A1 I2 B2                 6                      1          12                0          False
Y1 S1 L1 A2 I1 B1                12                      0          12                2          False
Y1 S1 L1 A2 I1 B2                12                      0          12                0           True
Y1 S1 L1 A2 I2 B1                 6                      1          12                2          False
Y1 S1 L1 A2 I2 B2                 6                      1          12                0          False
Y1 S1 L2 A1 I1 B1                12                      0          12                2          False
Y1 S1 L2 A1 I1 B2                12                      0          12                1          False
Y1 S1 L2 A1 I2 B1                 6                      1          12                2          False
Y1 S1 L2 A1 I2 B2                 6                      1          12                1          False
Y1 S1 L2 A2 I1 B1                12                      0          12                2          False
Y1 S1 L2 A2 I1 B2                12                      0          12                1          False
Y1 S1 L2 A2 I2 B1                 6                      0          12                2          False
Y1 S1 L2 A2 I2 B2                 6                      0          12                1          False
Y1 S2 L1 A1 I1 B1                12                      0          12                2          False
Y1 S2 L1 A1 I1 B2                12                      0          12                0           True
Y1 S2 L1 A1 I2 B1                 6                      1          12                2          False
Y1 S2 L1 A1 I2 B2                 6                      1          12                0          False
Y1 S2 L1 A2 I1 B1                12                      0          12                2          False
Y1 S2 L1 A2 I1 B2                12                      0          12                0           True
Y1 S2 L1 A2 I2 B1                 6                      1          12                2          False
Y1 S2 L1 A2 I2 B2                 6                      1          12                0          False
Y1 S2 L2 A1 I1 B1                12                      2          12                2          False
Y1 S2 L2 A1 I1 B2                12                      2          12                1          False
Y1 S2 L2 A1 I2 B1                 6                      1          12                2          False
Y1 S2 L2 A1 I2 B2                 6                      1          12                1          False
Y1 S2 L2 A2 I1 B1                12                      0          12                2          False
Y1 S2 L2 A2 I1 B2                12                      0          12                1          False
Y1 S2 L2 A2 I2 B1                 6                      1          12                2          False
Y1 S2 L2 A2 I2 B2                 6                      1          12                1          False
Y1 S3 L1 A1 I1 B1                12                      0          12                2          False
Y1 S3 L1 A1 I1 B2                12                      0          12                0           True
Y1 S3 L1 A1 I2 B1                 6                      1          12                2          False
Y1 S3 L1 A1 I2 B2                 6                      1          12                0          False
Y1 S3 L1 A2 I1 B1                12                      0          12                2          False
Y1 S3 L1 A2 I1 B2                12                      0          12                0           True
Y1 S3 L1 A2 I2 B1                 6                      1          12                2          False
Y1 S3 L1 A2 I2 B2                 6                      1          12                0          False
Y1 S3 L2 A1 I1 B1                12                      1          12                2          False
Y1 S3 L2 A1 I1 B2                12                      1          12                1          False
Y1 S3 L2 A1 I2 B1                 6                      1          12                2          False
Y1 S3 L2 A1 I2 B2                 6                      1          12                1          False
Y1 S3 L2 A2 I1 B1                12                      0          12                2          False
Y1 S3 L2 A2 I1 B2                12                      0          12                1          False
Y1 S3 L2 A2 I2 B1                 6                      1          12                2          False
Y1 S3 L2 A2 I2 B2                 6                      1          12                1          False
Y2 S1 L1 A1 I1 B1                12                      0          12                2          False
Y2 S1 L1 A1 I1 B2                12                      0          12                0           True
Y2 S1 L1 A1 I2 B1                 6                      1          12                2          False
Y2 S1 L1 A1 I2 B2                 6                      1          12                0          False
Y2 S1 L1 A2 I1 B1                12                      0          12                2          False
Y2 S1 L1 A2 I1 B2                12                      0          12                0           True
Y2 S1 L1 A2 I2 B1                 6                      0          12                2          False
Y2 S1 L1 A2 I2 B2                 6                      0          12                0           True
Y2 S1 L2 A1 I1 B1                12                      0          12                2          False
Y2 S1 L2 A1 I1 B2                12                      0          12                1          False
Y2 S1 L2 A1 I2 B1                 6                      1          12                2          False
Y2 S1 L2 A1 I2 B2                 6                      1          12                1          False
Y2 S1 L2 A2 I1 B1                12                      0          12                2          False
Y2 S1 L2 A2 I1 B2                12                      0          12                1          False
Y2 S1 L2 A2 I2 B1                 6                      0          12                2          False
Y2 S1 L2 A2 I2 B2                 6                      0          12                1          False
Y2 S2 L1 A1 I1 B1                12                      0          12                2          False
Y2 S2 L1 A1 I1 B2                12                      0          12                0           True
Y2 S2 L1 A1 I2 B1                 6                      1          12                2          False
Y2 S2 L1 A1 I2 B2                 6                      1          12                0          False
Y2 S2 L1 A2 I1 B1                12                      0          12                2          False
Y2 S2 L1 A2 I1 B2                12                      0          12                0           True
Y2 S2 L1 A2 I2 B1                 6                      0          12                2          False
Y2 S2 L1 A2 I2 B2                 6                      0          12                0           True
Y2 S2 L2 A1 I1 B1                12                      1          12                2          False
Y2 S2 L2 A1 I1 B2                12                      1          12                1          False
Y2 S2 L2 A1 I2 B1                 6                      1          12                2          False
Y2 S2 L2 A1 I2 B2                 6                      1          12                1          False
Y2 S2 L2 A2 I1 B1                12                      0          12                2          False
Y2 S2 L2 A2 I1 B2                12                      0          12                1          False
Y2 S2 L2 A2 I2 B1                 6                      1          12                2          False
Y2 S2 L2 A2 I2 B2                 6                      1          12                1          False
Y2 S3 L1 A1 I1 B1                12                      0          12                2          False
Y2 S3 L1 A1 I1 B2                12                      0          12                0           True
Y2 S3 L1 A1 I2 B1                 6                      1          12                2          False
Y2 S3 L1 A1 I2 B2                 6                      1          12                0          False
Y2 S3 L1 A2 I1 B1                12                      0          12                2          False
Y2 S3 L1 A2 I1 B2                12                      0          12                0           True
Y2 S3 L1 A2 I2 B1                 6                      0          12                2          False
Y2 S3 L1 A2 I2 B2                 6                      0          12                0           True
Y2 S3 L2 A1 I1 B1                12                      0          12                2          False
Y2 S3 L2 A1 I1 B2                12                      0          12                1          False
Y2 S3 L2 A1 I2 B1                 6                      1          12                2          False
Y2 S3 L2 A1 I2 B2                 6                      1          12                1          False
Y2 S3 L2 A2 I1 B1                12                      0          12                2          False
Y2 S3 L2 A2 I1 B2                12                      0          12                1          False
Y2 S3 L2 A2 I2 B1                 6                      0          12                2          False
Y2 S3 L2 A2 I2 B2                 6                      0          12                1          False
Readings where the absence holds: 15 of 96
       sum  count
Y  A             
Y1 A1    3     24
   A2    3     24
Y2 A1    3     24
   A2    6     24

Result: blocked (methods underspecified). Under Y1 the absence holds under 3 of 24 readings with contrasts alone (A1) and 3 of 24 with adjusted contrasts (A2), in both cases contrasts per year (I1) with B2 on yearly means, under S1, S2 and S3. Over 2020 and 2021 (I2), oak Asat is higher in mixtures under MR (+2.18, p 0.0047 to 0.036 under every reading with A1, and p 0.019 to 0.048 under A2 on yearly means or under S2 and S3 on campaigns), and NBEs on Asat or sugar differ from zero under B1 or on campaign values (for example Asat 2021, +114, p 0.031 under B1). The Y2 variant gives 3 (A1) and 6 (A2) of 24.

tables3-beech-wmr-height¶

Under combined warming and lower moisture, beech height increment was about 2 cm per year larger in monocultures than in mixtures.

In [40]:
t = itable("B", ["Height_growth"], "WMR")
t["mono_minus_mix"] = -t.raw_mix_minus_mono
t["holds"] = (t.p < 0.05) & (t.estimate < 0) & t.mono_minus_mix.map(lambda v: within(v, 2, 0.2))
print(t.round(4).to_string(index=False))
print(t.groupby("reading").holds.any().to_string())
species         trait     reading  Y  A treat  I    year                     transform  raw_mix_minus_mono  raw_all  estimate       z      p  mono_minus_mix  holds
      B Height_growth Y1/S1/L1/A1 Y1 A1   WMR I1    2020          none (negatives, S1)             -0.9167  -0.9167   -2.1120 -0.6970 0.4858          0.9167  False
      B Height_growth Y1/S1/L1/A1 Y1 A1   WMR I1    2021          none (negatives, S1)             -3.0833  -3.0833   -2.4453 -0.8070 0.4197          3.0833  False
      B Height_growth Y1/S1/L1/A1 Y1 A1   WMR I2 2020-21          none (negatives, S1)             -2.0000  -2.0000   -2.2787 -1.0126 0.3113          2.0000  False
      B Height_growth Y1/S1/L1/A2 Y1 A2   WMR I1    2020          none (negatives, S1)             -0.9167  -0.9167   -2.1120 -0.6970 0.9915          0.9167  False
      B Height_growth Y1/S1/L1/A2 Y1 A2   WMR I1    2021          none (negatives, S1)             -3.0833  -3.0833   -2.4453 -0.8070 0.9801          3.0833  False
      B Height_growth Y1/S1/L1/A2 Y1 A2   WMR I2 2020-21          none (negatives, S1)             -2.0000  -2.0000   -2.2787 -1.0126 0.7721          2.0000  False
      B Height_growth Y1/S2/L1/A1 Y1 A1   WMR I1    2020              sqrt(x + 8) (S2)             -0.9167  -0.9167   -0.3379 -0.8674 0.3857          0.9167  False
      B Height_growth Y1/S2/L1/A1 Y1 A1   WMR I1    2021              sqrt(x + 8) (S2)             -3.0833  -3.0833   -0.3544 -0.9097 0.3630          3.0833  False
      B Height_growth Y1/S2/L1/A1 Y1 A1   WMR I2 2020-21              sqrt(x + 8) (S2)             -2.0000  -2.0000   -0.3461 -1.1954 0.2319          2.0000  False
      B Height_growth Y1/S2/L1/A2 Y1 A2   WMR I1    2020              sqrt(x + 8) (S2)             -0.9167  -0.9167   -0.3379 -0.8674 0.9703          0.9167  False
      B Height_growth Y1/S2/L1/A2 Y1 A2   WMR I1    2021              sqrt(x + 8) (S2)             -3.0833  -3.0833   -0.3544 -0.9097 0.9616          3.0833  False
      B Height_growth Y1/S2/L1/A2 Y1 A2   WMR I2 2020-21              sqrt(x + 8) (S2)             -2.0000  -2.0000   -0.3461 -1.1954 0.6487          2.0000  False
      B Height_growth Y1/S3/L1/A1 Y1 A1   WMR I1    2020 sqrt, 6 negative dropped (S3)             -0.9167  -0.9167   -0.4731 -0.8573 0.3913          0.9167  False
      B Height_growth Y1/S3/L1/A1 Y1 A1   WMR I1    2021 sqrt, 6 negative dropped (S3)             -1.4167  -3.0833   -0.4364 -0.7183 0.4726          1.4167  False
      B Height_growth Y1/S3/L1/A1 Y1 A1   WMR I2 2020-21 sqrt, 6 negative dropped (S3)             -0.3500  -2.0000   -0.4547 -1.0555 0.2912          0.3500  False
      B Height_growth Y1/S3/L1/A2 Y1 A2   WMR I1    2020 sqrt, 6 negative dropped (S3)             -0.9167  -0.9167   -0.4731 -0.8573 0.9721          0.9167  False
      B Height_growth Y1/S3/L1/A2 Y1 A2   WMR I1    2021 sqrt, 6 negative dropped (S3)             -1.4167  -3.0833   -0.4364 -0.7183 0.9898          1.4167  False
      B Height_growth Y1/S3/L1/A2 Y1 A2   WMR I2 2020-21 sqrt, 6 negative dropped (S3)             -0.3500  -2.0000   -0.4547 -1.0555 0.7441          0.3500  False
      B Height_growth Y2/S1/L1/A1 Y2 A1   WMR I1    2020          none (negatives, S1)             -0.9167  -0.9167   -1.7556 -0.5510 0.5816          0.9167  False
      B Height_growth Y2/S1/L1/A1 Y2 A1   WMR I1    2021          none (negatives, S1)             -3.0833  -3.0833   -2.0890 -0.6557 0.5120          3.0833  False
      B Height_growth Y2/S1/L1/A1 Y2 A1   WMR I2 2020-21          none (negatives, S1)             -2.0000  -2.0000   -1.9223 -0.7955 0.4263          2.0000  False
      B Height_growth Y2/S1/L1/A2 Y2 A2   WMR I1    2020          none (negatives, S1)             -0.9167  -0.9167   -1.7556 -0.5510 0.9981          0.9167  False
      B Height_growth Y2/S1/L1/A2 Y2 A2   WMR I1    2021          none (negatives, S1)             -3.0833  -3.0833   -2.0890 -0.6557 0.9943          3.0833  False
      B Height_growth Y2/S1/L1/A2 Y2 A2   WMR I2 2020-21          none (negatives, S1)             -2.0000  -2.0000   -1.9223 -0.7955 0.8917          2.0000  False
      B Height_growth Y2/S2/L1/A1 Y2 A1   WMR I1    2020              sqrt(x + 8) (S2)             -0.9167  -0.9167   -0.3119 -0.7495 0.4535          0.9167  False
      B Height_growth Y2/S2/L1/A1 Y2 A1   WMR I1    2021              sqrt(x + 8) (S2)             -3.0833  -3.0833   -0.3284 -0.7891 0.4301          3.0833  False
      B Height_growth Y2/S2/L1/A1 Y2 A1   WMR I2 2020-21              sqrt(x + 8) (S2)             -2.0000  -2.0000   -0.3202 -1.0137 0.3107          2.0000  False
      B Height_growth Y2/S2/L1/A2 Y2 A2   WMR I1    2020              sqrt(x + 8) (S2)             -0.9167  -0.9167   -0.3119 -0.7495 0.9872          0.9167  False
      B Height_growth Y2/S2/L1/A2 Y2 A2   WMR I1    2021              sqrt(x + 8) (S2)             -3.0833  -3.0833   -0.3284 -0.7891 0.9828          3.0833  False
      B Height_growth Y2/S2/L1/A2 Y2 A2   WMR I2 2020-21              sqrt(x + 8) (S2)             -2.0000  -2.0000   -0.3202 -1.0137 0.7743          2.0000  False
      B Height_growth Y2/S3/L1/A1 Y2 A1   WMR I1    2020 sqrt, 6 negative dropped (S3)             -0.9167  -0.9167   -0.3587 -0.6438 0.5197          0.9167  False
      B Height_growth Y2/S3/L1/A1 Y2 A1   WMR I1    2021 sqrt, 6 negative dropped (S3)             -1.4167  -3.0833   -0.3129 -0.5101 0.6100          1.4167  False
      B Height_growth Y2/S3/L1/A1 Y2 A1   WMR I2 2020-21 sqrt, 6 negative dropped (S3)             -0.3500  -2.0000   -0.3358 -0.7559 0.4497          0.3500  False
      B Height_growth Y2/S3/L1/A2 Y2 A2   WMR I1    2020 sqrt, 6 negative dropped (S3)             -0.9167  -0.9167   -0.3587 -0.6438 0.9949          0.9167  False
      B Height_growth Y2/S3/L1/A2 Y2 A2   WMR I1    2021 sqrt, 6 negative dropped (S3)             -1.4167  -3.0833   -0.3129 -0.5101 0.9988          1.4167  False
      B Height_growth Y2/S3/L1/A2 Y2 A2   WMR I2 2020-21 sqrt, 6 negative dropped (S3)             -0.3500  -2.0000   -0.3358 -0.7559 0.9083          0.3500  False
reading
Y1/S1/L1/A1    False
Y1/S1/L1/A2    False
Y1/S2/L1/A1    False
Y1/S2/L1/A2    False
Y1/S3/L1/A1    False
Y1/S3/L1/A2    False
Y2/S1/L1/A1    False
Y2/S1/L1/A2    False
Y2/S2/L1/A1    False
Y2/S2/L1/A2    False
Y2/S3/L1/A1    False
Y2/S3/L1/A2    False

Result: not reproduced. Under WMR, beech height increment is 2.0 cm larger in monocultures over both years (0.35 cm on the rows S3 keeps) and 0.9 and 3.1 cm in 2020 and 2021, but no contrast is significant under any reading (p 0.23 to 0.61 each alone, higher when adjusted).

tables3-oak-wmr-diameter¶

Under combined warming and lower moisture, oak diameter increment was 1.4 cm larger in mixtures than in monocultures.

In [41]:
t = itable("O", ["Diameter_growth"], "WMR")
t["sig_larger"] = (t.p < 0.05) & (t.estimate > 0)
t["u1_within_1.4"] = t.raw_mix_minus_mono.map(lambda v: within(v, 1.4, 0.14))
t["u2_within_0.14"] = t.raw_mix_minus_mono.map(lambda v: within(v, 0.14, 0.014))
t["all_u1_within"] = t.raw_all.map(lambda v: within(v, 1.4, 0.14))
t["all_u2_within"] = t.raw_all.map(lambda v: within(v, 0.14, 0.014))
t["holds"] = t.sig_larger & (t["u1_within_1.4"] | t["u2_within_0.14"])
t["holds_on_all_rows"] = t.sig_larger & (t.all_u1_within | t.all_u2_within)
print(t.round(4).to_string(index=False))
print(t.groupby(["reading"])[["holds", "holds_on_all_rows"]].any().to_string())
species           trait     reading  Y  A treat  I    year                     transform  raw_mix_minus_mono  raw_all  estimate      z      p  sig_larger  u1_within_1.4  u2_within_0.14  all_u1_within  all_u2_within  holds  holds_on_all_rows
      O Diameter_growth Y1/S1/L1/A1 Y1 A1   WMR I1    2020          none (negatives, S1)             -0.0267  -0.0267    0.2154 0.5985 0.5495       False          False           False          False          False  False              False
      O Diameter_growth Y1/S1/L1/A1 Y1 A1   WMR I1    2021          none (negatives, S1)              1.6933   1.6933    1.2904 3.5858 0.0003        True          False           False          False          False  False              False
      O Diameter_growth Y1/S1/L1/A1 Y1 A1   WMR I2 2020-21          none (negatives, S1)              0.8333   0.8333    0.7529 2.8074 0.0050        True          False           False          False          False  False              False
      O Diameter_growth Y1/S1/L1/A2 Y1 A2   WMR I1    2020          none (negatives, S1)             -0.0267  -0.0267    0.2154 0.5985 0.9967       False          False           False          False          False  False              False
      O Diameter_growth Y1/S1/L1/A2 Y1 A2   WMR I1    2021          none (negatives, S1)              1.6933   1.6933    1.2904 3.5858 0.0027        True          False           False          False          False  False              False
      O Diameter_growth Y1/S1/L1/A2 Y1 A2   WMR I2 2020-21          none (negatives, S1)              0.8333   0.8333    0.7529 2.8074 0.0198        True          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A1 Y1 A1   WMR I1    2020           sqrt(x + 0.68) (S2)             -0.0267  -0.0267    0.0866 0.6156 0.5382       False          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A1 Y1 A1   WMR I1    2021           sqrt(x + 0.68) (S2)              1.6933   1.6933    0.5187 3.6866 0.0002        True          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A1 Y1 A1   WMR I2 2020-21           sqrt(x + 0.68) (S2)              0.8333   0.8333    0.3027 2.8916 0.0038        True          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A2 Y1 A2   WMR I1    2020           sqrt(x + 0.68) (S2)             -0.0267  -0.0267    0.0866 0.6156 0.9960       False          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A2 Y1 A2   WMR I1    2021           sqrt(x + 0.68) (S2)              1.6933   1.6933    0.5187 3.6866 0.0017        True          False           False          False          False  False              False
      O Diameter_growth Y1/S2/L1/A2 Y1 A2   WMR I2 2020-21           sqrt(x + 0.68) (S2)              0.8333   0.8333    0.3027 2.8916 0.0152        True          False           False          False          False  False              False
      O Diameter_growth Y1/S3/L1/A1 Y1 A1   WMR I1    2020 sqrt, 9 negative dropped (S3)             -0.0267  -0.0267    0.0120 0.0695 0.9446       False          False           False          False          False  False              False
      O Diameter_growth Y1/S3/L1/A1 Y1 A1   WMR I1    2021 sqrt, 9 negative dropped (S3)              1.3800   1.6933    0.5181 2.2795 0.0226        True           True           False          False          False   True              False
      O Diameter_growth Y1/S3/L1/A1 Y1 A1   WMR I2 2020-21 sqrt, 9 negative dropped (S3)              0.6413   0.8333    0.2650 1.7543 0.0794       False          False           False          False          False  False              False
      O Diameter_growth Y1/S3/L1/A2 Y1 A2   WMR I1    2020 sqrt, 9 negative dropped (S3)             -0.0267  -0.0267    0.0120 0.0695 1.0000       False          False           False          False          False  False              False
      O Diameter_growth Y1/S3/L1/A2 Y1 A2   WMR I1    2021 sqrt, 9 negative dropped (S3)              1.3800   1.6933    0.5181 2.2795 0.1620       False           True           False          False          False  False              False
      O Diameter_growth Y1/S3/L1/A2 Y1 A2   WMR I2 2020-21 sqrt, 9 negative dropped (S3)              0.6413   0.8333    0.2650 1.7543 0.2792       False          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A1 Y2 A1   WMR I1    2020          none (negatives, S1)             -0.0267  -0.0267    0.2958 0.6974 0.4855       False          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A1 Y2 A1   WMR I1    2021          none (negatives, S1)              1.6933   1.6933    1.3708 3.2316 0.0012        True          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A1 Y2 A1   WMR I2 2020-21          none (negatives, S1)              0.8333   0.8333    0.8333 2.5988 0.0094        True          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A2 Y2 A2   WMR I1    2020          none (negatives, S1)             -0.0267  -0.0267    0.2958 0.6974 0.9917       False          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A2 Y2 A2   WMR I1    2021          none (negatives, S1)              1.6933   1.6933    1.3708 3.2316 0.0096        True          False           False          False          False  False              False
      O Diameter_growth Y2/S1/L1/A2 Y2 A2   WMR I2 2020-21          none (negatives, S1)              0.8333   0.8333    0.8333 2.5988 0.0369        True          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A1 Y2 A1   WMR I1    2020           sqrt(x + 0.68) (S2)             -0.0267  -0.0267    0.1204 0.7354 0.4621       False          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A1 Y2 A1   WMR I1    2021           sqrt(x + 0.68) (S2)              1.6933   1.6933    0.5525 3.3747 0.0007        True          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A1 Y2 A1   WMR I2 2020-21           sqrt(x + 0.68) (S2)              0.8333   0.8333    0.3365 2.7185 0.0066        True          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A2 Y2 A2   WMR I1    2020           sqrt(x + 0.68) (S2)             -0.0267  -0.0267    0.1204 0.7354 0.9886       False          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A2 Y2 A2   WMR I1    2021           sqrt(x + 0.68) (S2)              1.6933   1.6933    0.5525 3.3747 0.0059        True          False           False          False          False  False              False
      O Diameter_growth Y2/S2/L1/A2 Y2 A2   WMR I2 2020-21           sqrt(x + 0.68) (S2)              0.8333   0.8333    0.3365 2.7185 0.0260        True          False           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A1 Y2 A1   WMR I1    2020 sqrt, 8 negative dropped (S3)             -0.0267  -0.0267    0.0051 0.0262 0.9791       False          False           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A1 Y2 A1   WMR I1    2021 sqrt, 8 negative dropped (S3)              1.3800   1.6933    0.5062 1.9535 0.0508       False           True           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A1 Y2 A1   WMR I2 2020-21 sqrt, 8 negative dropped (S3)              0.6413   0.8333    0.2556 1.4565 0.1453       False          False           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A2 Y2 A2   WMR I1    2020 sqrt, 8 negative dropped (S3)             -0.0267  -0.0267    0.0051 0.0262 1.0000       False          False           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A2 Y2 A2   WMR I1    2021 sqrt, 8 negative dropped (S3)              1.3800   1.6933    0.5062 1.9535 0.3277       False           True           False          False          False  False              False
      O Diameter_growth Y2/S3/L1/A2 Y2 A2   WMR I2 2020-21 sqrt, 8 negative dropped (S3)              0.6413   0.8333    0.2556 1.4565 0.4663       False          False           False          False          False  False              False
             holds  holds_on_all_rows
reading                              
Y1/S1/L1/A1  False              False
Y1/S1/L1/A2  False              False
Y1/S2/L1/A1  False              False
Y1/S2/L1/A2  False              False
Y1/S3/L1/A1   True              False
Y1/S3/L1/A2  False              False
Y2/S1/L1/A1  False              False
Y2/S1/L1/A2  False              False
Y2/S2/L1/A1  False              False
Y2/S2/L1/A2  False              False
Y2/S3/L1/A1  False              False
Y2/S3/L1/A2  False              False

Result: blocked (methods underspecified). Under WMR, oak diameter increment is significantly larger in mixtures under every Y1 reading in 2021 when each contrast is taken alone (A1), but the difference is within 1.4 +- 0.14 only under Y1 with S3, and only on the tree-years the S3 model keeps (+1.38, p 0.023). Over all trees the 2021 difference is +1.69 under every reading, outside tolerance under both unit readings. Adjusted over the model's eight treatment and year contrasts (A2), the same S3 contrast has p 0.16, while under S1 and S2 the 2021 contrast stays significant (p 0.0017 to 0.0096) at +1.69. Under the Y2 variant with S3 the 2021 difference of 1.38 has p 0.051 (A1). The claim holds only for one choice of two details the claims file does not fix (the family of the contrasts, and the rows over which the difference is taken under S3), so it is blocked until the question on them is answered.

fig5-oak-asat-nbe-wmr-2021¶

Under combined warming and drier soils in 2021, oak showed a positive net biodiversity effect on Asat, explained by complementarity.

In [42]:
b = btable("O", ["Photo"], "WMR", years=(2020, 2021))
print(b.round(4).to_string(index=False))
rows = []
for (B, L), g in b[b.Year == 2021].groupby(["B", "L"]):
    h = g.set_index("effect")
    nbe = bool(h.loc["NBE", "mean"] > 0 and h.loc["NBE", "p"] < 0.05)
    ce_sig = bool(h.loc["CE", "mean"] > 0 and h.loc["CE", "p"] < 0.05)
    out = "reproduced" if nbe and ce_sig else "partially_reproduced" if nbe and h.loc["CE", "mean"] > 0 else "not_reproduced"
    rows.append({"B": B, "L": L, "NBE>0 sig": nbe, "CE>0 sig": ce_sig, "outcome": out})
print(pd.DataFrame(rows).to_string(index=False))
Species trait treat  Year  B  L effect  n      mean       t      p
      O Photo   WMR  2020 B1 L1    NBE  6  186.3647  2.5702 0.0500
      O Photo   WMR  2020 B1 L1     CE  6  372.7294  2.5702 0.0500
      O Photo   WMR  2020 B1 L1     SE  6    0.0000  0.0000 1.0000
      O Photo   WMR  2021 B1 L1    NBE  6  192.7112  3.0537 0.0283
      O Photo   WMR  2021 B1 L1     CE  6  385.4224  3.0537 0.0283
      O Photo   WMR  2021 B1 L1     SE  6   -0.0000 -0.0000 1.0000
      O Photo   WMR  2020 B1 L2    NBE 18  186.3647  2.7397 0.0140
      O Photo   WMR  2020 B1 L2     CE 18  372.7294  2.7397 0.0140
      O Photo   WMR  2020 B1 L2     SE 18   -0.9619 -0.0141 0.9889
      O Photo   WMR  2021 B1 L2    NBE 18  192.7112  3.6446 0.0020
      O Photo   WMR  2021 B1 L2     CE 18  385.4224  3.6446 0.0020
      O Photo   WMR  2021 B1 L2     SE 18  -10.6359 -0.1954 0.8474
      O Photo   WMR  2020 B2 L1    NBE  6  220.1268  2.8686 0.0351
      O Photo   WMR  2020 B2 L1     CE  6  440.2536  2.8686 0.0351
      O Photo   WMR  2020 B2 L1     SE  6  -42.0993 -0.4356 0.6813
      O Photo   WMR  2021 B2 L1    NBE  6  193.7667  5.7881 0.0022
      O Photo   WMR  2021 B2 L1     CE  6  387.5333  5.7881 0.0022
      O Photo   WMR  2021 B2 L1     SE  6  -46.3672 -0.8251 0.4469
      O Photo   WMR  2020 B2 L2    NBE 18  220.1268  3.1501 0.0058
      O Photo   WMR  2020 B2 L2     CE 18  440.2536  3.1501 0.0058
      O Photo   WMR  2020 B2 L2     SE 18 -633.9127 -4.4948 0.0003
      O Photo   WMR  2021 B2 L2    NBE 18  193.7667  4.4879 0.0003
      O Photo   WMR  2021 B2 L2     CE 18  387.5333  4.4879 0.0003
      O Photo   WMR  2021 B2 L2     SE 18 -275.0846 -3.3400 0.0039
 B  L  NBE>0 sig  CE>0 sig    outcome
B1 L1       True      True reproduced
B1 L2       True      True reproduced
B2 L1       True      True reproduced
B2 L2       True      True reproduced

Result: reproduced. In 2021 the NBE on oak Asat under WMR is positive and differs from zero under all four readings (+193 to +194, p 0.0003 to 0.028), and so does the complementarity effect (twice the NBE). With Eq. 3 read as in the claims file, CE is twice the NBE for every tree, so the complementarity part is not tested apart from the NBE; a question asks whether this is the paper's computation.

Blocked claims: what the dataset holds¶

figs1-phenology-no-moisture, methods-treatment-magnitudes, fig6-soil-moisture-mr-equals-wmr, tables5-annual-climate and tables4-initial-sizes-similar are blocked: the dataset has no soil moisture, no chamber climate records and no initial sizes. The only air temperatures are the treatment means per year and season printed below, from which part of two claims can be compared with the paper; these comparisons decide no outcome.

In [43]:
ann = d[d.Year.isin([2020, 2021])].groupby(["Year", "treat"]).Tannual.first().unstack()
print("Tannual per year and treatment (deg C), the dataset's only air temperature values:")
print(ann.round(2).to_string())
print("\nWarmed minus control, per year:")
print(pd.DataFrame({"W-C": ann.W - ann.C, "WMR-C": ann.WMR - ann.C}).round(2).to_string())
print("Mean of 2020 and 2021: W-C", round(float((ann.W - ann.C).mean()), 2), "; WMR-C", round(float((ann.WMR - ann.C).mean()), 2))
S5 = {(2020, "C"): 11.8, (2020, "MR"): 12.1, (2020, "W"): 17.0, (2020, "WMR"): 16.8,
      (2021, "C"): 10.5, (2021, "MR"): 10.8, (2021, "W"): 15.7, (2021, "WMR"): 15.6}
rows = [{"year": y, "treat": t, "dataset": ann.loc[y, t], "table_S5": v, "within_0.4": within(ann.loc[y, t], v, 0.4)} for (y, t), v in S5.items()]
print("\nAnnual air temperature against Table S5 (8 of the 16 values of tables5-annual-climate; soil moisture is not in the dataset):")
print(pd.DataFrame(rows).round(2).to_string(index=False))
Tannual per year and treatment (deg C), the dataset's only air temperature values:
treat      C     MR      W    WMR
Year                             
2020   11.72  11.99  16.90  16.73
2021   10.47  10.72  15.67  15.50

Warmed minus control, per year:
       W-C  WMR-C
Year             
2020  5.18   5.01
2021  5.20   5.03
Mean of 2020 and 2021: W-C 5.19 ; WMR-C 5.02

Annual air temperature against Table S5 (8 of the 16 values of tables5-annual-climate; soil moisture is not in the dataset):
 year treat  dataset  table_S5  within_0.4
 2020     C    11.72      11.8        True
 2020    MR    11.99      12.1        True
 2020     W    16.90      17.0        True
 2020   WMR    16.73      16.8        True
 2021     C    10.47      10.5        True
 2021    MR    10.72      10.8        True
 2021     W    15.67      15.7        True
 2021   WMR    15.50      15.6        True

Summary¶

Claim Outcome
fig1ab-bud-swelling-advance reproduced
fig1cd-development-duration reproduced
fig1gh-senescence-duration reproduced
fig1ij-growing-season reproduced
fig1-oak-steeper-advance reproduced
fig1ef-onset-senescence-no-temperature reproduced
figs1-phenology-no-moisture blocked (data missing)
fig2-gdd-chilling reproduced
disc-max-chilling-days reproduced
fig3-psi-warming-2020 partially reproduced
fig3-psi-mr-oak-2020 not reproduced
fig3-psi-wmr-2021 reproduced
disc-psi-minimum not reproduced
fig4-beech-warming-none blocked (methods underspecified)
fig4-oak-warming-growth-2021 blocked (methods underspecified)
disc-oak-warming-no-carbon-change reproduced
fig4-beech-mr partially reproduced
fig4-oak-mr partially reproduced
fig4-beech-wmr blocked (methods underspecified)
fig4-oak-wmr reproduced
fig4-wmr-same-as-mr blocked (methods underspecified)
disc-nsc-unchanged-drier-soil reproduced
disc-beech-asat-more-impaired blocked (methods underspecified)
tables6-no-seasonal-variation blocked (methods underspecified)
tables2-phenology-no-interaction not reproduced
tables3-beech-warming-no-interaction blocked (methods underspecified)
figs2-beech-asat-selection-warming not reproduced
tables3-oak-warming-diameter not reproduced
fig5-oak-agwb-nbe-warming-2020 blocked (methods underspecified)
tables3-beech-mr-diameter not reproduced
fig5-beech-sugar-nbe-mr reproduced
oak-mr-no-interaction blocked (methods underspecified)
tables3-beech-wmr-height not reproduced
tables3-oak-wmr-diameter blocked (methods underspecified)
fig5-oak-asat-nbe-wmr-2021 reproduced
methods-treatment-magnitudes blocked (data missing)
fig6-soil-moisture-mr-equals-wmr blocked (data missing)
tables5-annual-climate blocked (data missing)
tables4-initial-sizes-similar blocked (data missing)

A failure to reproduce here may be a failure of this attempt, not of the paper: see the reasoning and the differences from the paper's method.

How the analysis differs from the paper's. The phenology regressions use the treatment's temperature for each tree (the dataset has no chamber value) from an unnamed sensor. GDD and chilling days are the deposited values. The mixed models are fitted in Python (statsmodels, REML), with nlme's tests and multcomp-style single-step contrasts computed here; the paper used R. Exact duplicate rows are counted once and one tree's two different rows for one campaign are averaged. Where the claims file leaves a detail open, every reading is run, and a claim whose readings disagree is blocked. This version follows the answers to the three questions of the first run: S3 (negative values dropped) is a reading for starch, sugar, Asat and the increments, the interaction model uses the years of Y1 (Y2 as a variant), and Table S6 is read under y1 and y2 with sequential and marginal F tests. After the first verification round, the mixture against monoculture contrasts are run both alone (A1) and adjusted over the model's contrasts (A2), as the claims file does not name the family; this, and the rows over which the raw difference is taken under S3, decide tables3-oak-wmr-diameter, which is now blocked. Two variants outside the claims file are shown: P1 with a random intercept per treatment and year, under which fig1cd-development-duration (oak p 0.11) and fig1-oak-steeper-advance (p 0.097) would not hold, and the Table S6 F values against the paper's. Three questions on these points are in questions/dryad-4j0zpc8hz.yaml.

What was found about the dataset. The treatment codes in the data (C, D, H, HD) are not those of the metadata (C, W, MR, WMR); the Warming and Soil moisture reduction columns give the mapping. 35 rows are exact duplicates and one tree has two different rows for one campaign. Starch, sugar and Asat have negative values. Growth_length is not onset of senescence minus bud swelling, as the Methods define it, and neither the workbook nor Metadata.csv defines it. Diameter increments are labelled cm but are consistent with mm. Four compartments hold a monoculture tree of one species and a mixture tree of the other. Soil moisture, the chamber climate records and the initial sizes, on which five claims rest, are not deposited. Refitting the treatment model with marginal F tests reproduces Table S1 exactly for oak AGWB increment only; oak midday water potential, beech AGWB increment and beech Asat are within 0.02, 0.21 and 0.25.