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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.