• Read in
  • Simplified data selection
    • GPP
    • Total biomass
    • Aboveground biomass
    • Belowground biomass
    • Woody biomass
    • Foliar biomass
    • Total NPP
    • ANPP
    • Foliage NPP
    • Woody NPP
    • BNPP
    • Soil C
    • Check
  • Meta analysis
  • Couplings
    • GPP - NPP
    • ANPP - NPP
    • BNPP - NPP
    • Woody NPP - NPP
    • cVeg - NPP
    • Aboveground cVeg - cVeg
    • Belowground cVeg - cVeg
    • Woody cVeg - cVeg
    • Foliage cVeg - cVeg

Read in

df <- read_csv("~/data/gcme/data_received_190325/NewData_wide_CORRECTED2.csv") %>%
  
  # something is wrong in columns ambient_Sd, ambient_Se, elevated...
  mutate( ambient_Sd  = as.numeric(ambient_Sd),  ambient_Se  = as.numeric(ambient_Se), 
          elevated_Sd = as.numeric(elevated_Sd), elevated_Se = as.numeric(elevated_Se) )
  
# save experiments names
df_experiments <- df %>% select(exp_nam, prev_name) %>% distinct()

list_exp_gt1yr <- df %>% 
  filter(!is.na(Year)) %>% 
  group_by(exp_nam) %>% 
  summarise(nyears=max(Year)) %>% 
  filter(nyears>1) %>% 
  select(exp_nam) %>% 
  unlist() %>% 
  unname()

df_c <- df %>%
  
  # ## Take this info from experiments below
  # select(-Fumigation_type, -Vegetation_type) %>% 
  
  # ## Add prev_name back
  # left_join( df_experiments, by = "exp_nam") %>% 
  
  ## filter experiments with only manipulated CO2
  ## (no other factors manipulated, strong reduction of data)
  filter(treatment=="c") %>% 
  
  ## More than 1 year data
  filter(exp_nam %in% list_exp_gt1yr) %>% 
  
  ## Combine with experiments meta info
  left_join( 
    read_csv("~/data/gcme/data_received_190325/table_var_exp_names_experiments.csv") %>% 
      select(prev_name, Fumigation_type=my_fumigation_type, Vegetation_type),
    by = c("prev_name")
  ) %>% 
  
  ## Filter only Fumigation_type OTC or FACE
  filter( Fumigation_type %in% c("OTC", "FACE") ) %>%
  
  {.}

Complement based on Kevin’s comments:

  • Experiment ‘MI’: for the year 1997, we can calculate ANPP + BNPP = NPP.
df_c %>% 
  filter(exp_nam == "MI") %>% 
  filter(Data_type %in% c("ANPP", "BNPP"))
## # A tibble: 3 × 53
##   ALIAS exp_nam prev_name factors treatment TT_Nut_Detail co2_a co2_e fert_a
##   <chr> <chr>   <chr>     <chr>   <chr>     <chr>         <dbl> <dbl>  <dbl>
## 1 25213 MI      MI_c      c       c         c               410   760      0
## 2 25214 MI      MI_c      c       c         c               410   760      0
## 3 25215 MI      MI_c      c       c         c               410   760      0
## # … with 44 more variables: fert_e <dbl>, nfert_a <dbl>, nfert_e <dbl>,
## #   nfertQ_a <dbl>, nfertQ_e <dbl>, pfert_a <dbl>, pfert_e <dbl>,
## #   pfertQ_a <dbl>, pfertQ_e <dbl>, kfert_a <dbl>, kfert_e <dbl>,
## #   kfertQ_a <dbl>, kfertQ_e <dbl>, lime_a <dbl>, lime_e <dbl>, foth_a <dbl>,
## #   foth_e <dbl>, warm_a <dbl>, warm_e <dbl>, warmQ_e <dbl>, irr_a <dbl>,
## #   irr_e <dbl>, d_a <dbl>, d_e <dbl>, ozone_a <dbl>, ozone_e <dbl>,
## #   swarm_a <dbl>, swarm_e <dbl>, swarmQ_e <dbl>, Data_type <chr>, …
  • Popface_pooled: probably better leave out
df_c <- df_c %>% 
  filter(exp_nam != "POPFACE_pooled")
  • Durham_DukeFACE = Duke
df_c %>% 
  pull(exp_nam) %>% 
  unique() %>% 
  sort()
##   [1] "Abisko_subarctic"                   
##   [2] "BangorFACE"                         
##   [3] "BioCON"                             
##   [4] "Birmensdorf"                        
##   [5] "Birmensdorf_c"                      
##   [6] "Birmensdorf_cf"                     
##   [7] "Brandbjerg"                         
##   [8] "Chaux-des-Breuleux"                 
##   [9] "Christchurch_nf"                    
##  [10] "Christchurch_pr"                    
##  [11] "DRI"                                
##  [12] "DUKE"                               
##  [13] "DUKE2"                              
##  [14] "Durham_DukeFACE"                    
##  [15] "Dwingeloo"                          
##  [16] "EucFACE"                            
##  [17] "EUROFACE4_pa"                       
##  [18] "EUROFACE4_pe"                       
##  [19] "EUROFACE4_pn"                       
##  [20] "EUROFACE7_pooled"                   
##  [21] "GiFACE"                             
##  [22] "Glendevon_ag"                       
##  [23] "Glendevon_bp"                       
##  [24] "Glendevon_ps"                       
##  [25] "Glendevon2_ag"                      
##  [26] "Glendevon2_psi"                     
##  [27] "Glendevon3_ag"                      
##  [28] "Glendevon3_psi"                     
##  [29] "Headley_fe"                         
##  [30] "Headley_ps"                         
##  [31] "Headley_qp"                         
##  [32] "HohenheimFACE"                      
##  [33] "Jokioinen"                          
##  [34] "JRBP_FACE3"                         
##  [35] "JRBP_OTC"                           
##  [36] "JRBP_OTC2sand"                      
##  [37] "JRBP_OTC2ser"                       
##  [38] "JRBP_OTCsand"                       
##  [39] "JRBP_OTCser"                        
##  [40] "MBS_pe"                             
##  [41] "MBS_pt"                             
##  [42] "MBS_pt2"                            
##  [43] "MBS_pt3"                            
##  [44] "MBS_pt4_as"                         
##  [45] "MBS_pt4_pooled"                     
##  [46] "MBS_pt4_pt"                         
##  [47] "MI"                                 
##  [48] "ORNERP_acer_ar"                     
##  [49] "ORNERP_acer_as"                     
##  [50] "ORNERP_acer_pooled"                 
##  [51] "ORNERP_grassland"                   
##  [52] "ORNERP_liqui"                       
##  [53] "ORNERP_liqui2"                      
##  [54] "ORNERP_liqui3"                      
##  [55] "ORNERP_liriodendron"                
##  [56] "ORNERP_quercus"                     
##  [57] "OzFACE"                             
##  [58] "PHACE"                              
##  [59] "POPFACE_pa"                         
##  [60] "POPFACE_pe"                         
##  [61] "POPFACE_pn"                         
##  [62] "Rhine-aspenFACE"                    
##  [63] "RiceFACE_China_23N_113E_1"          
##  [64] "RiceFACE_China_30N_112E_Or_1"       
##  [65] "RiceFACE_China_32N_120E_Or"         
##  [66] "RiceFACE_China_32N_120E_Or_5"       
##  [67] "RiceFACE_China_32N_120E_Or_7"       
##  [68] "RiceFACE_China_32N_120E_Or_9"       
##  [69] "RiceFACE_China_32N_120E_Or_A"       
##  [70] "RiceFACE_China_32N_120E_Or_Tr"      
##  [71] "RiceFACE_China_32N_120E_Or_Tr_2"    
##  [72] "RiceFACE_China_32N_120E_Or_Tr_4"    
##  [73] "RiceFACE_China_32N_120E_Or_Tr_9"    
##  [74] "RiceFACE_China_32N_120E_Tr_1"       
##  [75] "RiceFACE_China_33N_120E_Or_11"      
##  [76] "RiceFACE_China_33N_120E_Or_3"       
##  [77] "RiceFACE_China_33N_120E_Or_7"       
##  [78] "RiceFACE_China_33N_120E_Or_Tr_1"    
##  [79] "RiceFACE_Japan_A_1998_39,38_140,57" 
##  [80] "RiceFACE_Japan_A_1998_39,40_141"    
##  [81] "RiceFACE_Japan_A_2003_39,38_140,57" 
##  [82] "RiceFACE_Japan_A6_2010_35,38_139,60"
##  [83] "RiceFACE_Japan_Ki_2004_39,38_140,57"
##  [84] "RiceFACE_Japan_Ko_2011_35,58_139,59"
##  [85] "RiceFACE_Japan_L_1999_39,38_140,57" 
##  [86] "RiceFACE_Japan_L_2000_39,38_140,57" 
##  [87] "RiceFACE_Japan_L_2010_35,58_139,60" 
##  [88] "RiceFACE_Japan_L_2011_35,58_139,60" 
##  [89] "Salmisuo"                           
##  [90] "SCA"                                
##  [91] "SCBG"                               
##  [92] "Suonenjoki2_bp4"                    
##  [93] "Suonenjoki2_bp80"                   
##  [94] "SwissFACE_lolium"                   
##  [95] "SwissFACE_lolium2"                  
##  [96] "SwissFACE_medicago"                 
##  [97] "SwissFACE_trifolium"                
##  [98] "SwissFACE_trifolium2"               
##  [99] "TasFACE"                            
## [100] "UA_OTC"                             
## [101] "USDA_citrus"                        
## [102] "Vielsalm"                           
## [103] "webFACE"
df_c <- df_c %>% 
  mutate(exp_nam = ifelse(exp_nam == "Durham_DukeFACE", "DUKE", exp_nam))

Simplified data selection

Look at available variables. They are a bit inconsistently named. Make a sound selection.

all_selvars <- c()
# df_c$Data_type %>% unique()

Test

selvars <- c("belowground_biomass", "belowground_biomass_C", "root_biomass", "root_mass", 
             "root_C", "fine_roots_C", "coarse_root_biomass", "coarse_roots_biomass", 
             "coarse_roots_C")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c %>% 
  filter(Data_type %in% selvars) %>% 
  mutate(varnam = "test")

GPP

selvars <- c("GPP")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c %>% 
  filter(Data_type %in% selvars) %>% 
  mutate(varnam = "gpp")

Total biomass

selvars <- c("total_plant_C", "total_biomass")   # Not: "biomass_C", 
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      filter(!(Unit %in% c("mg_C_"))) %>% 
      mutate(per_plant = ifelse(Unit %in% c("g/plant", "kg/tree"), TRUE, FALSE)) %>% 
      mutate(varnam = "cveg")
  )

Aboveground biomass

Note:

  • Some aboveground_biomass_C is in (g_C/m2), assuming this represents biomass per ground area, not C concentration (per leaf area)
selvars <- c("aboveground_biomass", "Aboveground_biomass", "aboveground_biomass_", "aboveground_biomass_(green)", "aboveground_biomass_C", "total_aboveground_biomass")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      filter(!(Unit %in% c("%"))) %>% 
      mutate(per_plant = ifelse(Unit %in% c("g/plant", "kg/tree", "mg/plant"), TRUE, FALSE)) %>% 
      mutate(varnam = "cveg_ag")
  )

Belowground biomass

  • Some data is in g_C/m2 and is included for further analysis. Filter by Units.
selvars <- c("belowground_biomass", "belowground_biomass_C", "root_biomass", "root_mass", 
             "root_C", "fine_roots_C", "coarse_root_biomass", "coarse_roots_biomass", 
             "coarse_roots_C")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      filter(!(Unit %in% c("%"))) %>% 
      mutate(per_soil = ifelse(Unit %in% c("g/g_soil"), TRUE, FALSE)) %>% 
      mutate(per_plant = ifelse(Unit %in% c("g/tree", "kg/plant", "kg/tree"), TRUE, FALSE)) %>% 
      mutate(varnam = "cveg_bg")
  )

Woody biomass

selvars <- c("wood_C", "wood_biomass", "stem_biomass", "woody_biomass")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "cveg_wood")
  )

Foliar biomass

selvars <- c("leaf_C", "leaf_biomass", "green_leaf_biomass")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "cveg_fol")
  )

Total NPP

selvars <- c("NPP")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "npp")
  )

ANPP

selvars <- c("aboveground_production", "annual_aboveground_biomass_production", "ANPP")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "anpp")
  )

Foliage NPP

selvars <- c("ANPP_foliage")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "npp_fol")
  )

Woody NPP

selvars <- c("NPP_woody", "ANPP_woody")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "npp_wood")
  )

BNPP

selvars <- c("fine_root_production", "BNPP")
all_selvars <- c(all_selvars, selvars)

df_c_sub <- df_c_sub %>% 
  bind_rows(
    df_c %>% 
      filter(Data_type %in% selvars) %>% 
      mutate(varnam = "bnpp")
  )

Soil C

# "soil_C" "soil_organic_C" "soil_organic_carbon" "soil_total_C" "SOM"

Check

Available data.

df_c_sub %>% 
  group_by(varnam) %>% 
  summarise(n_plots = sum(n_plots), n_exp = n()) %>% 
  knitr::kable()
varnam n_plots n_exp
anpp 300 96
bnpp 356 134
cveg 633 182
cveg_ag 860 240
cveg_bg 745 220
cveg_fol 354 85
cveg_wood 198 62
gpp 64 18
npp 400 128
npp_fol 56 14
npp_wood 114 38

All meaningful variables selected?

all_vars <- df_c$Data_type %>% unique()
# all_vars[!(all_vars %in% all_selvars)]

Meta analysis

Aggregate by variable and experiment, pooling multiple years, sampling dates, and plots/replicates and calculate log response ratio

df_c_sub <- df_c_sub %>%         
  
  # get standard deviation for all data
  mutate( 
    my_ambient_sd = ambient_Sd, 
    my_elevated_sd = elevated_Sd 
    ) %>%
  rowwise() %>% 
  mutate( 
    my_ambient_sd = ifelse( is.na(my_ambient_sd),  ambient_Se  * sqrt(n_plots), my_ambient_sd ),
    my_elevated_sd  = ifelse( is.na(my_elevated_sd), elevated_Se * sqrt(n_plots), my_elevated_sd )
    ) %>%

  ## Get logarithm of response ratio and its variance
  metafor::escalc( 
    measure = "ROM", 
    m1i = elevated, sd1i = my_elevated_sd, n1i = n_plots, 
    m2i = ambient,  sd2i = my_ambient_sd,  n2i = n_plots, 
    data=., 
    append = TRUE, var.names = c("logr", "logr_var") ) %>% 
  as_tibble() %>% 
  mutate( logr_se = sqrt(logr_var)/sqrt(n_plots) )
## Warning: Some 'yi' and/or 'vi' values equal to +-Inf. Recoded to NAs.
write_csv(df_c_sub, file = "data/df_c_sub.csv")

Pool all measurements (multiple years, sampling dates and plots) by variable and experiment for meta analysis

df_c_agg <- df_c_sub %>% 
  
  filter(!is.na(logr_var) & !is.na(logr)) %>% 
  mutate( id = paste(exp_nam, varnam, sep = "_XXX_")) %>% 
  
  MAd::agg( id = id, es = logr, var = logr_var, n.1 = n_plots, n.2 = n_plots, cor = 1.0, method = "BHHR", data = . ) %>% 
  
  as_tibble() %>% 
  mutate( id = str_split(id, "_XXX_") ) %>% 
  mutate( exp_nam = purrr::map_chr(id, 1),
          varnam = purrr::map_chr(id, 2) ) %>% 
  select(exp_nam, varnam, es, var) %>% 

  ## add number of plots column and varnam
  left_join( df_c_sub %>% 
               group_by( exp_nam, varnam ) %>%
               summarise( n_plots = sum(n_plots) ) %>% 
               select( exp_nam, varnam, n_plots ),
             by = c("exp_nam", "varnam") ) %>% 
  rename( logr = es, logr_var = var ) %>% 
  mutate( logr_se = sqrt(logr_var)/sqrt(n_plots) ) %>% 
  # left_join( df_varnams, by = "varnam" ) %>% 
  
  ## filter NA for exp_nam due to unidentified experiment name in soil decomposition dataset
  filter(exp_nam!="NA" & !is.na(exp_nam))
## `summarise()` has grouped output by 'exp_nam'. You can override using the `.groups` argument.
write_csv(df_c_agg, file = "data/df_c_agg.csv")

Aggregate by variable, doing a meta-analysis of the log response ratios, with experiment as random factor (method=“DL”)

agg_meta <- function(df, groupvar){
  
  # print(groupvar)
  
  out_meta <- df %>% 
    
    dplyr::filter(varnam == eval(parse_character(groupvar))) %>% 
    
    # main meta analysis function call, adjusted step size (see http://www.metafor-project.org/doku.php/tips:convergence_problems_rma)
    # metafor::rma( logr, logr_var, method = "REML", slab = exp_nam, control = list(stepadj=0.3), data = . )
    metafor::rma.mv( logr, logr_var, method = "REML", random = ~ 1 | exp_nam, slab = exp_nam, control = list(stepadj=0.3), data = . )
  
  # transform back
  out_meta_scaled <- predict( out_meta, transf=exp )
  
  df_box <- tibble(
    varnam = groupvar, 
    middle = out_meta$b[1,1], 
    ymin   = out_meta$ci.lb, 
    ymax   = out_meta$ci.ub,
    
    middle_scaled = out_meta_scaled$pred, 
    ymin_scaled   = out_meta_scaled$ci.lb, 
    ymax_scaled   = out_meta_scaled$ci.ub
  )
  
  # print("... done.")
  return(list(df_box=df_box, out_meta=out_meta))
}

# do meta-analysis on all variables
varlist <- unique(df_c_agg$varnam)

## didn't work
varlist <- varlist[-which(varlist == "npp_fol")]
list_meta  <- purrr::map(as.list(varlist), ~agg_meta(df_c_agg, .))
df_metabox <- purrr::map_dfr(list_meta, "df_box")
  # left_join( df_varnams, by = "varnam" )
names(list_meta) <- varlist
df_c_agg %>%
  # arrange(logr) %>% 
  # mutate( my_lab = factor(my_lab, levels=rev(c("Asat", "Leaf Nmass", "Leaf Narea", "ANPP", "N uptake", "N availability", "root:shoot ratio", "BNPP", "Litter", "Soil decomposition rate")))) %>% 
  ggplot( aes(x = varnam, y = logr)) +
  geom_jitter( color = rgb(0,0,0,0.3), aes( size = 1/logr_se ), position = position_jitter(w = 0.2, h = 0) ) +
  geom_crossbar( data = df_metabox, aes(x = varnam, y = middle, ymin = ymin, ymax = ymax), fill = "grey80", alpha = 0.6, width = 0.5 ) +
  geom_hline( yintercept = 0.0, size = 0.5 ) +
  labs(x = "", y = "Log Response Ratio", size = expression(paste("Error"^{-1}))) +
  coord_flip() +
  ylim(-1,1)
## Warning: Removed 2 rows containing missing values (geom_point).

Couplings

## make a wide table with ANPP and BNPP
df_c_wide <- df_c_agg %>% 
  select(exp_nam, varnam, logr) %>%
  tidyr::spread( varnam, logr )

## add standard error
df_c_wide_se <- df_c_agg %>%
  select(exp_nam, varnam, logr_se) %>%
  tidyr::spread( varnam, logr_se)

write_csv(df_c_wide, file = "data/df_c_wide.csv")
write_csv(df_c_wide_se, file = "data/df_c_wide_se.csv")

df_c_wide %>% 
  knitr::kable()
exp_nam anpp bnpp cveg cveg_ag cveg_bg cveg_fol cveg_wood gpp npp npp_fol npp_wood
BangorFACE NA NA NA 0.1112469 NA NA NA NA NA NA NA
BioCON 0.1335173 NA 0.1188994 0.2475571 0.1362949 NA NA NA NA NA NA
Birmensdorf NA NA NA NA 0.1067524 NA NA NA NA NA NA
Birmensdorf_c NA NA NA NA 0.3779193 NA NA NA NA NA NA
Brandbjerg NA 0.4139760 NA -0.0560495 0.2238915 -0.0054399 NA NA NA NA NA
Christchurch_pr NA 0.0865558 NA NA NA NA NA NA NA NA NA
DRI NA 0.3315263 0.5466786 0.5438703 0.6125276 NA NA NA NA NA NA
DUKE 0.1570184 0.2866832 0.0360633 0.3751406 0.0125839 0.0682708 0.0438558 0.1417322 0.1879209 NA 0.2457437
DUKE2 NA NA NA 0.0057893 0.8708284 NA NA NA 0.2388914 0.1707943 NA
EUROFACE4_pa -0.0138365 NA NA NA 0.2308925 NA NA NA NA NA NA
EUROFACE4_pe -0.0372565 NA NA NA 0.3147427 NA NA NA NA NA NA
EUROFACE4_pn 0.0376497 NA NA NA 0.2304942 -0.0100917 NA NA NA NA NA
EUROFACE7_pooled NA NA 0.1946206 NA 0.1671038 NA -0.1863931 NA NA NA NA
GiFACE 0.0515306 NA NA 0.0591206 0.2056396 NA NA NA NA NA NA
Glendevon_ag NA NA NA NA 0.4372138 -0.1218049 0.4015019 NA NA NA NA
Glendevon_bp NA NA NA NA 0.0123019 0.0055173 0.0782007 NA NA NA NA
Glendevon_ps NA NA NA NA 0.5283702 0.3387736 0.5161074 NA NA NA NA
Glendevon2_ag NA NA NA NA 0.3134647 0.4379501 0.4850694 NA NA NA NA
Glendevon2_psi NA NA NA NA 0.3967778 0.2486040 0.1341206 NA NA NA NA
Glendevon3_ag NA NA NA NA 0.1517137 NA NA NA NA NA NA
Glendevon3_psi NA NA NA NA 0.4665894 0.2510882 0.1833692 NA NA NA NA
Headley_fe NA NA 0.4711651 NA 0.0310906 NA NA NA NA NA NA
Headley_ps NA NA 0.4265274 NA 0.4754237 NA NA NA NA NA NA
Headley_qp NA NA 0.1712619 NA 0.0676586 NA NA NA NA NA NA
JRBP_FACE3 0.0370620 -0.8754687 -0.0507464 0.2316585 -0.1749161 NA NA NA -0.2448323 NA NA
JRBP_OTC2sand NA NA 0.3571689 0.3725737 0.2638466 NA NA NA NA NA NA
JRBP_OTC2ser NA NA 0.3856517 0.2075951 0.4408220 NA NA NA NA NA NA
JRBP_OTCsand NA NA 0.6874530 0.3616584 1.4894786 NA NA NA NA NA NA
JRBP_OTCser NA NA 0.2966576 0.0979042 1.0238522 NA NA NA NA NA NA
MBS_pe NA NA 0.2275603 0.1933713 0.2505749 NA NA NA NA NA NA
MBS_pt NA NA 0.2358460 0.3076428 0.1971356 0.3659343 0.2546422 NA NA NA NA
MI 0.6886090 0.2238135 NA 0.4817802 -0.0109911 NA NA NA NA NA NA
ORNERP_acer_pooled NA 0.6507337 NA 0.6552134 -0.0032279 NA NA NA NA NA NA
ORNERP_grassland NA NA NA 0.1591515 NA NA NA NA NA NA NA
ORNERP_liqui 0.1512726 0.7110731 NA NA 0.9126287 NA NA NA 0.1894697 NA NA
ORNERP_liqui2 0.7968220 0.4652327 NA 0.2820665 NA 0.0520934 -0.0164182 NA 0.1777542 NA NA
ORNERP_liriodendron NA NA 0.1792408 0.1829151 0.1665553 NA NA NA NA NA NA
ORNERP_quercus NA NA 0.8542270 0.8371413 0.8582689 NA NA NA NA NA NA
PHACE NA NA 0.0884977 0.2017004 0.0871224 NA NA 0.1104195 NA NA NA
POPFACE_pa 0.2586932 0.4233322 0.2050547 0.2011534 0.3062610 0.0482133 0.2484391 0.4411407 0.2382158 NA 0.2416961
POPFACE_pe 0.2559145 0.5910167 0.2815354 0.2540387 0.4637270 0.1371860 0.2912897 0.5067051 0.2466410 NA 0.2378633
POPFACE_pn 0.1174660 0.7075088 0.1599663 0.1340787 0.3166201 0.1622885 0.1525943 0.4774717 0.1398347 NA 0.1058362
RiceFACE_China_32N_120E_Or_5 NA NA NA 0.0950925 NA NA NA NA NA NA NA
RiceFACE_China_32N_120E_Or_Tr_9 NA NA 0.0985531 NA NA NA NA NA NA NA NA
RiceFACE_China_33N_120E_Or_3 NA NA NA 0.2006375 NA NA NA NA NA NA NA
RiceFACE_China_33N_120E_Or_Tr_1 NA NA NA 0.1622556 NA NA NA NA NA NA NA
RiceFACE_Japan_A_2003_39,38_140,57 NA NA 0.1006805 NA NA 0.4340585 NA NA NA NA NA
RiceFACE_Japan_Ki_2004_39,38_140,57 NA NA 0.1087863 NA NA NA NA NA NA NA NA
SCA NA NA -0.0710292 0.0419648 -0.1109846 NA NA NA NA NA NA
SCBG NA NA 0.2175267 0.0552447 0.0890281 NA NA NA NA NA NA
Suonenjoki2_bp4 NA NA -0.0233929 NA -0.0501244 -0.0396091 0.0359751 NA NA NA NA
Suonenjoki2_bp80 NA NA 0.3348475 NA 0.3635478 0.3227734 0.3407065 NA NA NA NA
SwissFACE_lolium2 -0.0317718 NA 0.1563991 0.0074219 0.3401834 NA NA NA NA NA NA
SwissFACE_medicago NA NA NA 0.0018506 NA NA NA NA NA NA NA
SwissFACE_trifolium2 0.1541973 NA NA 0.5552928 0.1991340 NA NA NA NA NA NA
TasFACE 0.6020745 NA 0.0063499 0.7103332 -0.3973634 NA NA NA NA NA NA
UA_OTC NA NA 0.5648180 0.4929170 0.8684009 0.1951968 0.4006971 NA NA NA NA
USDA_citrus NA NA 0.4093392 0.4083281 0.3985172 0.2487667 0.3134662 NA NA NA NA

GPP - NPP

tmp <- df_c_wide %>% 
  filter(!is.na(npp) & !is.na(gpp)) %>% 
  mutate(l_npp_gpp = npp / gpp) %>% 
  left_join(
    df_c_wide_se %>% 
      select(exp_nam, npp_se = npp, gpp_se = gpp) %>% 
      filter(!is.na(npp_se) & !is.na(gpp_se)),
    by = "exp_nam"
  ) %>% 
  mutate(certainty = 1/(gpp_se * npp_se))

tmp %>% 
  ggplot(aes(x = gpp, y = npp, label = exp_nam, size = certainty)) +
  geom_point(color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b

tmp %>% 
  ggplot(aes(x = l_npp_gpp, y = exp_nam, size = certainty)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

ANPP - NPP

tmp <- df_c_wide %>% 
  filter(!is.na(anpp) & !is.na(npp)) %>% 
  mutate(l_anpp_npp = anpp / npp)

tmp %>% 
  ggplot(aes(x = npp, y = anpp, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_anpp_npp, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

BNPP - NPP

tmp <- df_c_wide %>% 
  filter(!is.na(bnpp) & !is.na(npp)) %>% 
  mutate(l_bnpp_npp = bnpp / npp)

tmp %>% 
  ggplot(aes(x = npp, y = bnpp, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 3 rows containing missing values (geom_point).
## Warning: Removed 3 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_bnpp_npp, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

Woody NPP - NPP

tmp <- df_c_wide %>% 
  filter(!is.na(npp_wood) & !is.na(npp)) %>% 
  mutate(l_npp_wood_npp = npp_wood / npp)

tmp %>% 
  ggplot(aes(x = npp, y = npp_wood, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b

tmp %>% 
  ggplot(aes(x = l_npp_wood_npp, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

cVeg - NPP

tmp <- df_c_wide %>% 
  filter(!is.na(cveg) & !is.na(npp)) %>% 
  mutate(l_cveg_npp = cveg / npp)

tmp %>% 
  ggplot(aes(x = npp, y = cveg, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_cveg_npp, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

Aboveground cVeg - cVeg

tmp <- df_c_wide %>% 
  filter(!is.na(cveg_ag) & !is.na(cveg)) %>% 
  mutate(l_cveg_ag_cveg = cveg_ag / cveg)

tmp %>% 
  ggplot(aes(x = cveg, y = cveg_ag, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 2 rows containing missing values (geom_point).
## Warning: Removed 2 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_cveg_ag_cveg, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

tmp %>% 
  ggplot(aes(x = l_cveg_ag_cveg, y = ..density..)) +
  geom_density() +
  geom_vline(xintercept = 1, linetype = "dotted") +
  xlim(-1, 3)
## Warning: Removed 3 rows containing non-finite values (stat_density).

Belowground cVeg - cVeg

tmp <- df_c_wide %>% 
  filter(!is.na(cveg_bg) & !is.na(cveg)) %>% 
  mutate(l_cveg_bg_cveg = cveg_bg / cveg)

tmp %>% 
  ggplot(aes(x = cveg, y = cveg_bg, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 7 rows containing missing values (geom_point).
## Warning: Removed 7 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_cveg_bg_cveg, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

tmp %>% 
  ggplot(aes(x = l_cveg_bg_cveg, y = ..density..)) +
  geom_density() +
  geom_vline(xintercept = 1, linetype = "dotted") +
  xlim(-1, 3)
## Warning: Removed 3 rows containing non-finite values (stat_density).

Woody cVeg - cVeg

tmp <- df_c_wide %>% 
  filter(!is.na(cveg_wood) & !is.na(cveg)) %>% 
  mutate(l_cveg_wood_cveg = cveg_wood / cveg)

tmp %>% 
  ggplot(aes(x = cveg, y = cveg_wood, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b
## Warning: Removed 1 rows containing missing values (geom_point).
## Warning: Removed 1 rows containing missing values (geom_text_repel).

tmp %>% 
  ggplot(aes(x = l_cveg_wood_cveg, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")

Foliage cVeg - cVeg

tmp <- df_c_wide %>% 
  filter(!is.na(cveg_fol) & !is.na(cveg)) %>% 
  mutate(l_cveg_fol_cveg = cveg_fol / cveg)

tmp %>% 
  ggplot(aes(x = cveg, y = cveg_fol, label = exp_nam)) +
  geom_point(size = 2, color = "red") +
  xlim(-0.1, 0.7) + ylim(-0.1, 0.7) +
  geom_abline(a = 0, b = 1, linetype = "dotted") +
  coord_equal() +
  theme_classic() +
  geom_text_repel(size = 2, color = "grey30") +
  labs(subtitle = paste("N = ", nrow(tmp)))
## Warning: Ignoring unknown parameters: a, b

tmp %>% 
  ggplot(aes(x = l_cveg_fol_cveg, y = exp_nam)) +
  geom_jitter(position = position_jitter(w = 0.2, h = 0)) +
  geom_vline(xintercept = 1, linetype = "dotted")