rm(list=ls())
gc()

# OXT methylation (microarray)
library(data.table)
x<-fread("OXT_microarray_dataset.csv",data.table = F)

beta<-x[,c(8:22)]
beta<-t(beta)
colnames(beta)<-x$gID
beta<-as.data.frame(beta)

phen<-x[,c(1:7)]
rownames(phen)<-phen$gID
phen<-phen[,-1]

beta<-beta[,colnames(beta)%in%rownames(phen)]
phen<-phen[rownames(phen)%in%colnames(beta),]
beta<-beta[,order(colnames(beta))]
phen<-phen[order(rownames(phen)),]

indep<-as.numeric(phen$CM)
age<-as.numeric(phen$Age)
female<-as.factor(phen$Female)
fsiq<-as.numeric(phen$FSIQ)
epi<-as.numeric(phen$Epi)

library(CpGassoc)
result <- cpg.assoc(beta,
                    indep,
                    covariates=~age+female+epi+fsiq,
                    data=NULL,
                    logit.transform=FALSE,
                    chip.id=NULL,
                    subset=NULL,
                    random=FALSE,
                    fdr.cutoff=0.05,
                    large.data=TRUE,
                    fdr.method="BH",
                    logitperm=FALSE)

res<-result$results
res<-res[order(res$P.value),]

annot<-fread("EPIC_annot_OXT.csv",data.table=F)
rownames(annot)<-annot$targetID
annot<-annot[,-1]
res<-merge(res,annot,by.x=1,by.y=0,all.x=TRUE)
res<-res[order(res$MAPINFO),]
res


# OXT methylation plot
library(Gviz)
pos<-annot$MAPINFO
pos<-as.data.frame(pos)
gr<-GRanges(
  seqnames=Rle("chr20"),
  ranges=IRanges(pos$pos, pos$pos))
gr@seqinfo@genome<-"hg19"
gr

chr<-as.character(unique(seqnames(gr)))
gen<-genome(gr)
itrack<-IdeogramTrack(genome=gen,chromosome=chr,name="Chr_20",centromereShape="triangle")
gtrack<-GenomeAxisTrack(labelPos="alternating",add53=TRUE,add35=TRUE,littleTicks=FALSE)

library(biomaRt)
bm<-useMart(host="grch37.ensembl.org",biomart="ENSEMBL_MART_ENSEMBL",dataset="hsapiens_gene_ensembl")
biomTrack<-BiomartGeneRegionTrack(genome="hg19",
                                  name="ENSEMBL",
                                  chromosome=chr, 
                                  start=as.numeric(pos[1,]),
                                  end=as.numeric(pos[dim(pos)[1],]),
                                  filter=list(with_refseq_mrna=TRUE),
                                  biomart=bm,
                                  background.title = "gray40",
                                  stacking="dense")

atrack<-AnnotationTrack(gr,name="CpG",stacking="dense",background.title="gray40",col="black",fill="black")

da<-GRanges(
  seqnames = Rle("chr20"),
  ranges = IRanges(pos$pos, pos$pos),
  tstatistics = res$T.statistic)
da@seqinfo@genome<-"hg19"
da

dTrack<-DataTrack(da,
                  name="t-statistics",
                  type="b",
                  pch=21,
                  cex=1.5,
                  col="gray40",
                  background.title = "gray40")

ht<-HighlightTrack(trackList=list(biomTrack,dTrack),
                   start=3051954,end=3052345,chromosome=20,col="white")
trackList<-list(itrack,gtrack,ht)

plotTracks(trackList,
           from=NULL,
           to=NULL,
           sizes=c(0.1,0.15,0.2,0.5),
           stackHeight=0.75,
           panel.only=FALSE,
           extend.right=0,
           extend.left=0,
           title.width=NULL,
           add=FALSE,
           reverseStrand = FALSE,
           main = "OXT_ENSG00000101405(GRCh37/hg19)",
           cex.main=2,
           fontface.main=2,
           col.main="darkred",
           margin=0,
           chromosome=NULL,
           innerMargin=0)


# Correlation matrices
library(corrr)
beta<-t(beta)
corrr<-correlate(beta,use="complete.obs",method="pearson")
corrr

library(dplyr)
shave(corrr,upper=TRUE)%>%rplot(print_cor=TRUE,shape=19,colours=c("skyblue1","white","indianred2"))


# Maximum likelihood factor analysis (MLFA)
library(impute)
sum(is.na(beta))
beta<-as.matrix(beta)
beta.imp<-impute.knn(beta)
beta<-beta.imp$data
sum(is.na(beta))
beta<-as.data.frame(beta)

library(nFactors)
ev<-eigen(cor(beta))
ap<-parallel(subject=nrow(beta),var=ncol(beta),rep=100,cent=.05)
nS<-nScree(x=ev$values,aparallel=ap$eigen$qevpea)
plotnScree(nS)

factanal<-factanal(x=beta,factors=sum(ev$values>1),rotation="varimax",scores="regression")
print(factanal,cutoff=0.5)


# OXTmi calculation
x$OXTmi<-rowMeans(beta[,c(4:12)])
x$OXTmi


# OXTmi multiple regression model (standardized partial regression coeficient calculation)
library(car)
rownames(x)<-x$gID
x<-x[,-1]
z<-scale(x)
z<-data.frame(z)
CM_model<-lm(OXTmi~CM+Age+Female+FSIQ+Epi, data=z)
summary(CM_model)


# Global varidation
library(gvlma)
summary(gvlma(CM_model))


# Normality
qqPlot(CM_model,labels=row.names(z),id.method="identity",simulate=T)

residplot = function(CM_model, nbreaks = 10 ){
  d=rstudent(CM_model)
  hist(d,breaks=nbreaks,freq=F,
       xlab="Studentized Residual",main="Distribution of Errors")
  rug(jitter(d),col="brown")
  curve(dnorm(x,mean=mean(d),sd=sd(d)),add=T,col="blue",lwd=2)
  lines(density(d)$x,density(d)$y,col="red",lwd=2,lty=2)
  legend("topleft",legend=c("Normal Curve","Kernel Density Curve"),
         lty=1:2,col=c("blue","red"),cex=.7)
}
residplot(CM_model)


# Independence
durbinWatsonTest(CM_model)


# Linearity
crPlots(CM_model,frame.plot = FALSE)


# Multicolinearlity
vif(CM_model)


# Homoscedasticity
ncvTest(CM_model)
spreadLevelPlot(CM_model)


# Heteroskedasticity-robust standard errors
library(estimatr)
CM_model_robust<-lm_robust(OXTmi~CM+Age+Female+FSIQ+Epi, data=z,se_type = "stata")
summary(CM_model_robust)


# Comparison of the OXTmi between non-CM, PA-, and PA+
PA_model<-lm(x$OXTmi~x$PA+x$Age+x$Female+x$FSIQ+x$Epi)

library(ppcor)
pcor.test(x$PA,x$OXTmi,x[,c("Age","Female","FSIQ","Epi")])

Y_resid<-resid(lm(x$OXTmi~ x$Age+x$Female+x$FSIQ+x$Epi))
X_resid<-resid(lm(x$PA~ x$Age+x$Female+x$FSIQ+x$Epi))

x$PA<-replace(x$PA,which(x$PA==0),"PA+")
x$PA<-replace(x$PA,which(x$PA==1),"PA-")
x$PA<-replace(x$PA,which(x$PA==2),"non-CM")
x$PA<-factor(x$PA, levels=c("PA+","PA-","non-CM"))

library(ggplot2)
y=lm(Y_resid~X_resid)
ggplot(x,aes(x=X_resid,y=Y_resid,col=PA,fill=PA))+
  geom_point(shape=21,size=8,stroke=0.5)+
  geom_abline(slope=y$coefficients[2],intercept=y$coefficients[1],col="red")+
  scale_color_manual(values=c("gray10","gray10","gray10"))+
  scale_fill_manual(values=c("gray10","gray65","gray98"))+
  labs(x="Residualized Group",y="Residualized OXTmi")+
  theme_bw()+
  theme(axis.title.x=element_text(size=24),
        axis.title.y=element_text(size=24),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        legend.title=element_blank(),
        legend.text=element_text(size=16))

y=lm(Y_resid~x$PA)
ggplot(x,aes(x=PA,y=Y_resid,col=PA,fill=PA))+
  geom_point(shape=21,size=8,stroke=0.5)+
  scale_color_manual(values=c("gray10","gray10","gray10"))+
  scale_fill_manual(values=c("gray10","gray65","gray98"))+
  labs(x="Group", y="Residualized OXTmi")+
  theme_bw()+
  theme(axis.title.x=element_text(size=24),
        axis.title.y=element_text(size=24),
        axis.text.x=element_text(size=14),
        axis.text.y=element_text(size=14),
        legend.title=element_blank(),
        legend.text=element_text(size=16))
