Commit 5ec5b812 authored by Georges Kunstler's avatar Georges Kunstler
Browse files

last commit before turning into a package

parent edf742ae
......@@ -4,29 +4,79 @@ source("R/analysis/lmer.output-fun.R")
source("R/analysis/lmer.run.R")
## LOOP OVER FILES AND NOT SCAN ALL FILES
traits <- c("SLA", "Wood.density","Max.height","Leaf.N","Seed.mass")
traits <- c("SLA", "Wood.density","Max.height")
type.filling <- 'species'
files <- c()
for (trait in traits){
for(model in c(model.files.lmer.Tf.1, model.files.lmer.Tf.2,
model.files.lmer.Tf.3, model.files.lmer.Tf.4,
model.files.lmer.Tf.5,model.files.lmer.Tf.6)){
for(model in c(model.files.lmer.Tf.4b,
model.files.lmer.Tf.3)){
source(model, local = TRUE)
model.obj <- load.model()
pathout <- output.dir('lmer', model.obj$name, trait, 'all.no.log',
type.filling=type.filling)
files <- c(files,file.path(pathout,"results.nolog.all.rds"))
files <- c(files,file.path(pathout,"ecocode.id.results.nolog.all.rds"))
}
}
out <- lapply(files, summarise.lmer.output.all.list)
out <- lapply(files, summarise.lmer.output.all.list, random.name = 'biomes.id')
names(out) <- lapply(lapply(files,files.details.all),
function(x) paste(as.vector(x[names(x) != 'file']),
collapse="_"))
### remove missing
out <- out[!unlist(lapply(out,FUN=function(x) is.null(x$lmer.summary)))]
saveRDS(out,file='output/list.lmer.out.all.no.log.rds')
saveRDS(out,file='output/list.lmer.out.all.ecocode.id.no.log.rds')
## LOOP OVER FILES AND NOT SCAN ALL FILES
traits <- c("SLA", "Wood.density","Max.height")
type.filling <- 'species'
files <- c()
for (trait in traits){
for(model in c(model.files.lmer.Tf.4b,
model.files.lmer.Tf.3)){
source(model, local = TRUE)
model.obj <- load.model()
pathout <- output.dir('lmer', model.obj$name, trait, 'all.no.log',
type.filling=type.filling)
files <- c(files,file.path(pathout,"species.id.results.nolog.all.rds"))
}
}
out <- lapply(files, summarise.lmer.output.all.list, random.name = 'biomes.id')
names(out) <- lapply(lapply(files,files.details.all),
function(x) paste(as.vector(x[names(x) != 'file']),
collapse="_"))
### remove missing
out <- out[!unlist(lapply(out,FUN=function(x) is.null(x$lmer.summary)))]
saveRDS(out,file='output/list.lmer.out.all.species.id.no.log.rds')
## LOOP OVER FILES AND NOT SCAN ALL FILES
traits <- c("SLA", "Wood.density","Max.height")
type.filling <- 'species'
files <- c()
for (trait in traits){
for(model in c(model.files.lmer.Tf.4b,
model.files.lmer.Tf.3)){
source(model, local = TRUE)
model.obj <- load.model()
pathout <- output.dir('lmer', model.obj$name, trait, 'all.no.log',
type.filling=type.filling)
files <- c(files,file.path(pathout,"obs.id.results.nolog.all.rds"))
}
}
out <- lapply(files, summarise.lmer.output.all.list, random.name = 'biomes.id')
names(out) <- lapply(lapply(files,files.details.all),
function(x) paste(as.vector(x[names(x) != 'file']),
collapse="_"))
### remove missing
out <- out[!unlist(lapply(out,FUN=function(x) is.null(x$lmer.summary)))]
saveRDS(out,file='output/list.lmer.out.all.obs.id.no.log.rds')
......@@ -49,11 +49,12 @@ summarise.lmer.output.list <- function(f ){
}
summarise.lmer.output.all.list <- function(f ){
summarise.lmer.output.all.list <- function(f, random.name = 'set.id' ){
output.lmer <- read.lmer.output(f)
if(!is.null(output.lmer)){
res <- list(files.details = files.details.all(f),
lmer.summary = summarise.lmer.all.output( output.lmer),
lmer.summary = summarise.lmer.all.output( output.lmer,
random.name ),
terms = terms(output.lmer),
vcov = vcov(output.lmer))
}else{
......@@ -750,3 +751,53 @@ for (var in var.vec){
## fm.MAT.MAP <- readRDS('output/lmer/all.no.log/Wood.density/species/lmer.LOGLIN.ER.AD.Tf.MAT.MAP/results.nolog.all.rds')
## fun.ci.param.var.climate(fm.MAT.MAP, 'Wood.density', param = 'sumTfBn', var = 'MAT')
### plot with random effect on top
plot.param.BLUP <- function(list.res,
model = 'lmer.LOGLIN.ER.AD.Tf',
traits = c('Wood.density', 'SLA', 'Max.height'),
param.vec = c("logD", "Tf","sumBn", "sumTnBn",
"sumTfBn", "sumTnTfBn.abs"),
col.vec,
pch.vec){
## m <- rbind(c(0.1, 0.5, 0.55, 1), c(0.5, 0.9, 0.55, 1),
## c(0.1, 0.5, 0.1, 0.45), c(0.5, 0.9, 0.1, 0.45),
## c(0.90, 1, 0.1, 1))
## split.screen(m)
m <- matrix(c(1:4,5,5), 2, 3)
layout(m, widths=c(4, 4, 1),
heights=c(4, 4))
for (i in traits){
## screen((1:length(traits))[traits == i])
list.temp <- list.res[[paste("all.no.log_", i ,
"_species_", model,
sep = '')]]$lmer.summary
param.mean <- list.temp$fixed.coeff.E[param.vec]
param.std <- list.temp$fixed.coeff.Std.Error
names(param.std) <- names(list.temp$fixed.coeff.E)
param.std <- param.std[param.vec]
param.BLUP <- list.temp$set.BLUP
plot(param.mean,
xaxt = 'n', ylab = 'std parameters', xlab = NA,
main = i, ylim = c(-0.6, 0.6))
abline(h = 0)
axis(1, 1:length(param.vec), labels = param.vec, las = 3)
fun.plot.error.bar(1:length(param.vec),
param.mean,
param.std)
for (j in 1:length(param.vec)){
points(rep(j,nrow(param.BLUP)), param.BLUP[,param.vec[j]],
pch = pch.vec[rownames(param.BLUP)],
col = col.vec[rownames(param.BLUP)])
}
}
## par(mar=c(0, 0, 0, 0))
plot(1,1,pch = NA, xaxt = 'n', yaxt = 'n')
legend("center",legend = names(col.vec), col = col.vec, pch = pch.vec,
bty = 'n')
}
......@@ -18,7 +18,7 @@ mem <- function() {
run.multiple.model.for.set.one.trait <- function(model.files, fun.model, trait,
type.filling, cat.TF = FALSE,
fname = 'data.all.no.log.csv',
fname = 'data.all.no.log.rds',
...){
for (m in model.files)
(run.model.for.set.one.trait (m, fun.model, trait,
......@@ -49,6 +49,11 @@ model.files.lmer.Tf.3 <-
model.files.lmer.Tf.4 <-
c("R/analysis/model.lmer/model.lmer.LOGLIN.ER.AD.Tf.r.biomes.R")
model.files.lmer.Tf.4b <-
c("R/analysis/model.lmer/model.lmer.LOGLIN.ER.AD.Tf.r.biomes.species.R")
model.files.lmer.Tf.4c <-
c("R/analysis/model.lmer/model.lmer.LOGLIN.ER.AD.Tf.r.ecocode.species.R")
model.files.lmer.Tf.5 <-
c("R/analysis/model.lmer/model.lmer.LOGLIN.ER.AD.Tf.norandom.R")
model.files.lmer.Tf.6 <-
......@@ -62,22 +67,25 @@ model.files.lmer.Tf.CAT.2 <-
model.files.lmer.Tf.CAT.3 <-
c("R/analysis/model.lmer/model.lmer.LOGLIN.ER.AD.Tf.CAT.MAT.MAP.norandom.R")
fun.call.lmer.and.save <- function(formula, df.lmer, path.out){
fun.call.lmer.and.save <- function(formula, df.lmer, path.out,
var.sample){
lmer.output <- lmer(formula = formula, data = df.lmer, REML = FALSE,
control = lmerControl(optCtrl = list(maxfun = 40000) ) )
print(summary(lmer.output))
saveRDS(lmer.output, file = file.path(path.out, "results.nolog.all.rds"))
saveRDS(lmer.output, file = file.path(path.out, paste(var.sample,
"results.nolog.all.rds", sep ='.')))
}
run.lmer <- function (model.file, trait,
min.obs = 10, sample.size = NA,
type.filling, cat.TF, fname = 'data.all.no.log.csv') {
type.filling, cat.TF, fname = 'data.all.no.log.rds',
var.sample = 'ecocode.id') {
require(lme4)
source(model.file, local = TRUE)
model <- load.model()
#= Path for output
if(fname == 'data.all.no.log.csv') dir <- 'all.no.log'
if(fname == 'data.all.csv') dir <- 'all.log'
if(fname == 'data.all.no.log.rds') dir <- 'all.no.log'
if(fname == 'data.all.log.rds') dir <- 'all.log'
path.out <- output.dir('lmer', model$name, trait, dir,
type.filling = type.filling)
print(path.out)
......@@ -86,7 +94,8 @@ run.lmer <- function (model.file, trait,
trait, "\n")
df.lmer <- load.data.for.lmer(trait,fname = fname,
cat.TF = cat.TF,
sample.size = sample.size)
sample.size = sample.size,
var.sample = var.sample)
# return a DF
cat("Ok data with Nobs", nrow(df.lmer),
......@@ -94,7 +103,8 @@ run.lmer <- function (model.file, trait,
print(mem())
#= Run model
fun.call.lmer.and.save(formula = model$lmer.formula.tree.id,
df.lmer, path.out)
df.lmer, path.out = path.out,
var.sample = var.sample)
rm(df.lmer)
gc()
}
......@@ -107,35 +117,40 @@ output.dir <- function (type , model, trait, set, type.filling) {
file.path("output", type, set, trait, type.filling, model)
}
fun.load.data.all <- function(base.dir,fname){
data.all.sample <- read.csv(file = file.path(base.dir, fname),
stringsAsFactors = FALSE, nrows = 2000)
classes <- sapply(data.all.sample, class)
classes[classes=='integer'] <- "numeric"
nrows <- as.numeric(system(paste('wc -l < ',file.path(base.dir, fname)),
intern = TRUE))
data.tree.tot <- read.csv(file = file.path(base.dir, fname),
stringsAsFactors = FALSE,
nrows = nrows,
colClasses = classes)
return(data.tree.tot)
}
#============================================================
# Function to prepare data for lmer
#============================================================
#
## add sample equivalent per ecocode
add.sampling.prob.by.var.sample <- function(df, var.sample){
vec.prob <- 1/table(df[[var.sample]])
return(df)
}
load.data.for.lmer <- function(trait, cat.TF,
fname = 'data.all.no.log.csv',
fname = 'data.all.no.log.rds',
base.dir = "output/processed",
sample.size ){
if (fname == 'data.all.no.log.csv') type <- 'no.log'
if (fname == 'data.all.csv') type <- 'log'
sample.size ,
var.sample = 'ecocode.id'){
if (fname == 'data.all.no.log.rds') type <- 'no.log'
if (fname == 'data.all.log.rds') type <- 'log'
if (cat.TF) cat <- 'cat'
if (!cat.TF) cat <- 'no.cat'
df <- readRDS(file = file.path(base.dir,paste('data', trait, type, cat,'rds',
sep = '.')))
if(!is.na(sample.size)) df <- df[sample(1:nrow(df), size = sample.size), ]
if(!is.na(sample.size)){
df$species.id[is.na(df$species.id)] <- 'missing.sp'
df <- add.sampling.prob.by.var.sample(df, var.sample = var.sample)
df <- df[sample(1:nrow(df), size = sample.size,
prob = df$prob.sample), ]
print(paste('sub-sampled by',var.sample))
}
return( df)
}
......@@ -143,19 +158,15 @@ load.and.save.data.for.lmer <- function(trait,
min.obs= 10, sample.size = NA,
type.filling = species,
cat.TF= FALSE,
fname = 'data.all.no.log.csv',
fname = 'data.all.no.log.rds',
base.dir = "output/processed",
data.table.TF = FALSE){
if(!data.table.TF) data.tree.tot <- fun.load.data.all(base.dir,fname)
if(data.table.TF) {
require(data.table)
data.tree.tot <- fread(file.path(base.dir, fname))
}
data.tree.tot <- readRDS(file.path(base.dir, fname))
df <- fun.data.for.lmer(data.tree.tot, trait,
type.filling = type.filling,
cat.TF = cat.TF)
if (fname == 'data.all.no.log.csv') type <- 'no.log'
if (fname == 'data.all.csv') type <- 'log'
if (fname == 'data.all.no.log.rds') type <- 'no.log'
if (fname == 'data.all.log.rds') type <- 'log'
if (cat.TF) cat <- 'cat'
if (!cat.TF) cat <- 'no.cat'
saveRDS(df,file = file.path(base.dir,paste('data', trait, type, cat,'rds',
......
load.model <- function () {
list(name="glmer.LOGLIN.AD.Tf.MAT.MAP",
glmer.formula=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+log+MAT+MAP+(1+logD|species.id)+(1|plot.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP+(Tf-1|set.id)+(sumBn-1|set.id)+(sumTnTfBn.abs-1|set.id)"))
}
load.model <- function () {
list(name="glmer.LOGLIN.AD.Tf",
glmer.formula=formula("dead~1+offset(logyear)+Tf+logD+(1+logD|species.id)+(1|plot.id)+sumBn+sumTnTfBn.abs+(Tf-1|set.id)+(sumBn-1|set.id)+(sumTnTfBn.abs-1|set.id)"))
}
load.model <- function () {
list(name="glmer.LOGLIN.ER.AD.Tf.MAT.MAP",
glmer.formula=formula("dead~1+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1-logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1-logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP")
glmer.formula=formula("dead~1+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1|species.id)+(logD-1|species.id)+(sumBn-1|species.id)+(MAT-1|species.id)+(MAP-1|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1|species.id)+(logD-1|species.id)+(sumBn-1|species.id)+(MAT-1|species.id)+(MAP-1|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP")
)
}
load.model <- function () {
list(name="glmer.LOGLIN.ER.AD.Tf",
glmer.formula=formula("dead~1+Tf+logD+(1+logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+logD+(1+logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs")
glmer.formula=formula("dead~1+Tf+logD+(1|species.id)+(logD-1|species.id)+(sumBn-1|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+logD+(1|species.id)+(logD-1|species.id)+(sumBn-1|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs")
)
}
load.model <- function () {
list(name="glmer.LOGLIN.ER.Tf.MAT.MAP",
glmer.formula=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1+logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+(Tf-1|set.id)+(sumTfBn-1|set.id)+(sumBn-1|set.id)+(sumTnBn-1|set.id)"))
}
load.model <- function () {
list(name="glmer.LOGLIN.ER.Tf",
glmer.formula=formula("dead~1+offset(logyear)+Tf+logD+(1+logD|species.id)+(1|plot.id)+(1|set.id)+sumBn+sumTfBn+sumTnBn+(Tf-1|set.id)+(sumTfBn-1|set.id)+(sumBn-1|set.id)+(sumTnBn-1|set.id)"))
}
load.model <- function () {
list(name="glmer.LOGLIN.simplecomp.Tf.MAT.MAP",
glmer.formula=formula("dead~1+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1+logD|species.id)+(1|plot.id)+(1|set.id)+(Tf-1|set.id)"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1+logD|species.id)+(1|plot.id)+(1|set.id)+(Tf-1|set.id)")
)
}
load.model <- function () {
list(name="glmer.LOGLIN.simplecomp.Tf.MAT.MAP",
glmer.formula=formula("dead~1+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1+logD|species.id)+(1|set.id)+(1|plot.id)+sumBn+sumBn:MAT+sumBn:MAP+(Tf-1|set.id)+(sumTfBn-1|set.id)"),
glmer.formula.offset=formula("dead~1+offset(logyear)+Tf+Tf:MAT+Tf:MAP+logD+MAT+MAP+(1+logD|species.id)+(1|set.id)+(1|plot.id)+sumBn+sumBn:MAT+sumBn:MAP+(Tf-1|set.id)+(sumTfBn-1|set.id)")
)
}
load.model <- function () {
list(name="lmer.LOGLIN.ER.Tf.MAT.MAP",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|species.id)+(1|plot.id)+Tf+Tf:MAT+Tf:MAP+MAT+MAP+logD+sumBn+sumBn:MAT+sumBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP+(logD-1|species.id)+(Tf-1|set.id)+(sumBn-1|set.id)+(sumTnTfBn.abs-1|set.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.AD.Tf",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|species.id)+(1|plot.id)+Tf+logD+sumBn+sumTnTfBn.abs+(logD-1|species.id)+(Tf-1|set.id)+(sumBn-1|set.id)+(sumTnTfBn.abs-1|set.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.AD.Tf.norandom",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|species.id)+(1|plot.id)+Tf+logD+sumBn+sumTnTfBn.abs+(logD|species.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.ER.AD.Tf.CAT.r.biomes.species",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|plot.id)+Tf.A_EV+Tf.A_D+Tf.C+logD+sumBn+sumTfBn.A_EV+sumTfBn.A_D+sumTfBn.C+sumTnBn.A_EV+sumTnBn.A_D+sumTnBn.C+sumTnTfBn.abs+(1|species.id) +(logD-1|species.id) +(sumBn-1|species.id)+(Tf-1|biomes.id)+(sumBn-1|biomes.id)+(sumTfBn.A_EV-1|biomes.id)+(sumTfBn.A_D-1|biomes.id)+(sumTfBn.C-1|biomes.id)+(sumTnBn.A_EV-1|biomes.id)+(sumTnBn.A_D-1|biomes.id)+(sumTnBn.C-1|biomes.id)+(sumTnTfBn.abs-1|biomes.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.ER.AD.Tf.CAT.r.species",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|plot.id)+Tf.A_EV+Tf.A_D+Tf.C+logD+sumBn+sumTfBn.A_EV+sumTfBn.A_D+sumTfBn.C+sumTnBn.A_EV+sumTnBn.A_D+sumTnBn.C+sumTnTfBn.abs+(1|species.id) +(logD-1|species.id) +(sumBn-1|species.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.ER.AD.Tf.MAT.MAP.r.species",
lmer.formula.tree.id=formula("logG~1+(1|plot.id)+Tf+Tf:MAT+Tf:MAP+MAT+MAP+logD+sumBn+sumBn:MAT+sumBn:MAP+sumTfBn+sumTfBn:MAT+sumTfBn:MAP+sumTnBn+sumTnBn:MAT+sumTnBn:MAP+sumTnTfBn.abs+sumTnTfBn.abs:MAT+sumTnTfBn.abs:MAP+(1|species.id)+(logD-1|species.id)+(sumBn-1|species.id)+(MAT-1|species.id)+(MAP-1|species.id)"))
}
load.model <- function () {
list(name="lmer.LOGLIN.ER.AD.Tf",
lmer.formula.tree.id=formula("logG~1+(1|plot.id)+Tf+logD+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs+(1+logD|species.id)+(1+Tf+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs|set.id)"))
lmer.formula.tree.id=formula("logG~1+(1|plot.id)+(1|set.id)+Tf+logD+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs+(1+logD|species.id)+(Tf-1|set.id)+(sumBn-1|set.id)+(sumTfBn-1|set.id)+(sumTnBn-1|set.id)+(sumTnTfBn.abs-1|set.id)"))
}
......
load.model <- function () {
list(name="lmer.LOGLIN.ER.AD.Tf",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|species.id)+(1|plot.id)+Tf+logD+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs+(1+logD|species.id)+(1+Tf+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs|biomes.id)"))
list(name="lmer.LOGLIN.ER.AD.Tf.r.biomes",
lmer.formula.tree.id=formula("logG~1+(1|set.id)+(1|species.id)+(1|plot.id)+Tf+logD+sumBn+sumTfBn+sumTnBn+sumTnTfBn.abs+(1+logD|species.id)+(Tf-1|biomes.id)+(sumBn-1|biomes.id)+(sumTfBn-1|biomes.id)+(sumTnBn-1|biomes.id)+(sumTnTfBn.abs-1|biomes.id)"))
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment