#Title:Does the expensive brain hypothesis apply to amphibians and reptiles?
#Author: Zitan Song

ExpLizAmp<-read.csv("~ExpLizAmp.csv")
rownames(ExpLizAmp)<-ExpLizAmp$Species

ExpLizAmp$Residual_BS<-NA
a<-lm(log10(BrM) ~ log10(BdM), ExpLizAmp )
summary(a)
ExpLizAmp$Residual_BS<-residuals(a)


EctoTre<-read.tree("~/EctoTre.tre")
EctoTreCon<-read.nexus("~/EctoTreConsensus.tre")

##load package and function######
library(ape)
library(phylolm)
library(lsr) # ciMean
library(ggplot2)
PGLS.result<-function(modBIR){
  n<-length(modBIR)
  estimates<-matrix(nrow= n ,ncol=(length(modBIR[[1]]$coefficients)*4+4))
  c<-c("Estimate","SE","t","p")
  b<-names(modBIR[[1]]$coefficients)
  j<-2
  a<-matrix(nrow = 1,ncol = (length(modBIR[[1]]$coefficients))*4+3)
  a[,1]<-"mod.no"
  
  for(i in 1 : length(b)){
    a[j:(j+length(c)-1)]<-paste(b[i], c, sep = ".")
    j=j+length(c)
  }
  
  a[j]<-"lambda"
  a[j+1]<-"AIC"
  a[j+2]<-"R2"
  colnames(estimates)=a
  estimates[,1]<-c(1:n)
  
  for(i in 1 : length(modBIR)){
    if(class(modBIR[[i]])== "try-error") {
      estimates[i,]<-NA}
    else {
      j<-2  
      for(k in 1:length(modBIR[[i]]$coefficients)){
        estimates[i,(j:(j+3))]<-as.numeric(summary(modBIR[[i]])[2]$coefficients[k,])
        
        j<-j+4 }
      
      estimates[i,j]<-modBIR[[i]]$optpar
      estimates[i,j+1]<-AIC(modBIR[[i]])
      estimates[i,j+2]<-modBIR[[i]]$r.squared
    }
  }
  
  estimates<-na.omit(estimates)
  d<-matrix(nrow=length(modBIR[[1]]$coefficients) , ncol=4)
  colnames(d)<- c("estimate","se","t","p")
  rownames(d)<-names(modBIR[[1]]$coefficients)
  for(i in 1:nrow(d)){
    d[i,1]<-paste(format(mean(estimates[,((i-1)*4+2)], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format(ciMean(estimates[,((i-1)*4+2)], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format(ciMean(estimates[,((i-1)*4+2)], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" )
    d[i,2]<-paste(format(mean(estimates[,((i-1)*4+3)], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format(ciMean(estimates[,((i-1)*4+3)], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format(ciMean(estimates[,((i-1)*4+3)], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" )
    d[i,3]<-paste(format(mean(estimates[,((i-1)*4+4)], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format(ciMean(estimates[,((i-1)*4+4)], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format(ciMean(estimates[,((i-1)*4+4)], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" )
    d[i,4]<-paste(format.pval(mean(estimates[,((i-1)*4+5)], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format.pval(ciMean(estimates[,((i-1)*4+5)], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format.pval(ciMean(estimates[,((i-1)*4+5)], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" )
  }
  print(paste(format(mean(estimates[,j], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format(ciMean(estimates[,j], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format(ciMean(estimates[,j], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" ))
  print(paste(format(mean(estimates[,j+2], na.rm=T),digits = 1, eps = 0.001,  nsmall = 3)," (",format(ciMean(estimates[,j+2], conf = 0.95, na.rm = TRUE)[1],digits = 1, eps = 0.001,  nsmall = 3) ,", ",format(ciMean(estimates[,j+2], conf = 0.95, na.rm = TRUE)[2],digits = 1, eps = 0.001,  nsmall = 3) ,")",sep="" ))
  write.csv(d,"/Users/zsong/Desktop/d.csv")
} 

###Table 1
modTable1<-list()
for(i in 1:100){
  modTable1[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01*Tb , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modTable1)

modTable11 <-list()
for(i in 1:100){
  modTable11[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+Tb , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modTable11)


vif.phyloglm(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+Tb , data=ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda"))
pglmNull<-phylolm(log10(BrM) ~ log10(BdM) + Taxa , data=ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")
pglmNull2<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+Tb , data=ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")
pglm1<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01*Tb , data=ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")

residuals <- resid(pglm1)

# Create QQ plot
qqnorm(residuals)
qqline(residuals)
hist(residuals)
# Density plot
plot(density(residuals))

lrt <- 2 * (pglmNull2$logLik - pglmNull$logLik)
df <- length(coef(pglmNull2))  - length(coef(pglmNull)) 
p_value <- 1 - pchisq(lrt, df)
p_value #  0.036

lrt <- 2 * (pglm1$logLik - pglmNull2$logLik)
df <- length(coef(pglm1))  - length(coef(pglmNull2)) 
p_value <- 1 - pchisq(lrt, df)
p_value #  0.00065


#plot


lm1<-phylolm(Residual_BS~  Tb   , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Diurnal+Cath"),] , phy=EctoTreCon, model="lambda"  )
lm2<-phylolm(Residual_BS~  Tb    , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Not basking"),] , phy=EctoTreCon, model="lambda"  )

ExpLizAmp$Taxon<-factor(ExpLizAmp$Taxon, levels = c("Anura", "Caudata", "Amphisbaenia", "Sauria", "Serpentes", "Rhynchocephalia"))

ggplot(ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01)),], 
       aes( x=Tb, y = Residual_BS , group = Activity.period01, col= as.factor(Activity.period01), shape=as.factor(Taxon) )) +
  geom_point(fill = "white", size = 1.5, stroke = 1.5*0.75)+ 
  scale_shape_manual(values=c( 1, 2, 15:18))+
  scale_color_manual(values = c( "#D55E00", "#0072B2") , labels=c("Diurnal & Cathemeral","Nocturnal"))+
  geom_abline( slope = 0.0100904, intercept= (-0.2051920)  ,colour = "#D55E00",linetype=1,size=1.2)+
  geom_abline( slope = (-0.0129507), intercept= (0.1339682)  ,colour = "#0072B2",linetype=1,size=1.2)+
  theme(
    text = element_text(size=18), 
    axis.text.y =element_text(size=15),
    axis.text.x =element_text(size=15),
    panel.background = element_blank(),
    panel.border = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.title = element_text(colour = "steelblue", face = "bold.italic", size =12),
    legend.text = element_text(face = "italic", colour = "steelblue4", size =8),
    # Change axis line
    axis.line = element_line(colour = "black"))+
  labs(colour = "Activity period", shape = "Taxon",
       x = "Body temperature °C",
       y = "Brain mass (residual)")


##Table S2
#Basking n = 104
mod_Basking<-list()
for(i in 1:100){
  mod_Basking[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Tb , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Diurnal+Cath"),] ,phy=EctoTre[[i]],model="lambda", lower.bound = 0.01), silent = T)
}
PGLS.result(mod_Basking)


pglmS1<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Tb , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Diurnal+Cath" & !is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")
pglmS2<-phylolm(log10(BrM) ~ log10(BdM) + Taxa , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Diurnal+Cath" & !is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")

lrt <- 2 * (pglmS1$logLik - pglmS2$logLik)
lrt
df <- length(coef(pglmS1))  - length(coef(pglmS2)) 
p_value <- 1 - pchisq(lrt, df)
p_value # 0.02347885



#Not basking n =49
mod_NotBasking<-list()
for(i in 1:100){
  mod_NotBasking[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Tb , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Not basking"),] ,phy=EctoTre[[i]],model="lambda", lower.bound = 0.01), silent = T)
}
PGLS.result(mod_NotBasking)

pglmS1<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Tb , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Not basking" & !is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")
pglmS2<-phylolm(log10(BrM) ~ log10(BdM) + Taxa , data=ExpLizAmp[which(ExpLizAmp$Activity.period01=="Not basking" & !is.na(ExpLizAmp$Activity.period01) & !is.na(ExpLizAmp$Tb)  ),] ,phy=EctoTreCon,model="lambda")

lrt <- 2 * (pglmS1$logLik - pglmS2$logLik)
df <- length(coef(pglmS1))  - length(coef(pglmS2)) 
p_value <- 1 - pchisq(lrt, df)
p_value # 0.03842391


##Table 2

modCVNDVI<-list()
for(i in 1:100){
  modCVNDVI[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01 + mean_Temp +mean_NDVI+CV_NDVI  , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modCVNDVI)

vif.phyloglm(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+ mean_Temp +mean_NDVI+CV_NDVI , data=ExpLizAmp ,phy=EctoTreCon,model="lambda"))

pglm3<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+ mean_Temp +mean_NDVI+CV_NDVI , data=ExpLizAmp ,phy=EctoTreCon,model="lambda")
pglm3NULL<-phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01, data=ExpLizAmp[which(!is.na(ExpLizAmp$mean_Temp) & !is.na(ExpLizAmp$mean_NDVI)),] ,phy=EctoTreCon,model="lambda")

lrt <- 2 * (pglm3$logLik - pglm3NULL$logLik)
lrt
df <- length(coef(pglm3))  - length(coef(pglm3NULL)) 
p_value <- 1 - pchisq(lrt, df)
p_value # 0.03842391


residuals <- resid(pglm3)
# Create QQ plot
qqnorm(residuals)
qqline(residuals)
hist(residuals)
# Density plot
plot(density(residuals))


##Table S3

vif.phyloglm(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+ mean_Temp +Season_Temp , data=ExpLizAmp ,phy=EctoTreCon,model="lambda"))

modTemp<-list()
for(i in 1:100){
  modTemp[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01 + mean_Temp + Season_Temp , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modTemp)



##Table S4

modCVNDVI_Tb<-list()
for(i in 1:100){
  modCVNDVI_Tb[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+Tb + mean_Temp +mean_NDVI+CV_NDVI  , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modCVNDVI_Tb)

##Table S5
modTemp_Tb<-list()
for(i in 1:100){
  modTemp_Tb[[i]]<-try(phylolm(log10(BrM) ~ log10(BdM) + Taxa+ Activity.period01+Tb + mean_Temp +Season_Temp , data=ExpLizAmp ,phy=EctoTre[[i]],model="lambda"), silent = T)
}
PGLS.result(modTemp_Tb)



###supplementary FIGURE

###Figure S1
ggplot(ExpLizAmp[which(!is.na(ExpLizAmp$Activity.period01)),], aes(x=Taxa , y = mean_Temp,  fill = Activity.period01 )) +
  geom_violin(position = position_dodge(0.9) ) +
  geom_boxplot(width = .2,
               fatten = NULL,
               position = position_dodge(0.9))  +
  scale_fill_manual(values=c( "#D55E00", "#0072B2"), labels=c("Diurnal & Cathemeral","Nocturnal")) +
  stat_summary(fun = "mean", 
               geom = "point", 
               position = position_dodge(0.9)) +
  theme(
    text = element_text(size=14), 
    axis.text.y =element_text(size=10),
    axis.text.x =element_text(size=14),
    panel.background = element_blank(),
    panel.border = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.title = element_text(colour = "steelblue", face = "bold.italic", size =8),
    legend.text = element_text(face = "italic", colour = "steelblue4", size =6),
    # Change axis line
    axis.line = element_line(colour = "black"))+
  labs(fill = "Activity period",
       y = "Ambient temperature °C")

###Figure S2
ggplot(ExpLizAmp, aes(x=Taxa , y = Tb,  fill = Activity.period01 )) +
  geom_violin(position = position_dodge(0.9) ) +
  geom_boxplot(width = .2,
               fatten = NULL,
               position = position_dodge(0.9))  +
  scale_fill_manual(values=c(  "#D55E00", "#0072B2"), labels=c("Diurnal & Cathemeral","Nocturnal")) +
  stat_summary(fun = "mean", 
               geom = "point", 
               position = position_dodge(0.9)) +
  theme(
    text = element_text(size=14), 
    axis.text.y =element_text(size=10),
    axis.text.x =element_text(size=14),
    panel.background = element_blank(),
    panel.border = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.title = element_text(colour = "steelblue", face = "bold.italic", size =8),
    legend.text = element_text(face = "italic", colour = "steelblue4", size =6),
    # Change axis line
    axis.line = element_line(colour = "black"))+
  labs(fill = "Activity period",
       y = "Body temperature °C")

