library(marked)
library(mvtnorm)
library(dplyr)

#Import the data.
s1 <- read.delim("C:/Users/jmarien/Desktop/PhD2/MOSA/MOSA_ifa/Rmark files/r scripts and data/Mosa_allvariables_transientsremoved_fourstate_May2010_2017h.txt")
dif <- read.delim("C:/Users/jmarien/Desktop/PhD2/MOSA/MOSA_ifa/Rmark files/r scripts and data/timedifferencebetweencapturesessions_b.txt")

diff=dif[-1,]; mean(diff)#Calculate differences between days
diffsc=round(diff/30,1); max(diffsc)# Scale all differences to 30 days.

s1[,1]=as.character(s1[,1]); s1[,2]=as.character(s1[,2]);s1[,3]=as.numeric(as.character(s1[,3]))# Put all columns into the correct shape.
s1=s1[,-(c(2,4))]# Remove not used collumns.
s1=s1[-(which(s1[,2]<15)),]# Remove all individuals with a body mass < 15g (maternal antibodies).
s1=s1[-(which(s1[,2]>35)),] #Remove all individuals with body mass > 35g (too old).

s1[,2]=log(as.numeric(as.character(s1[,2])))## Put body weight on log scale, as it is used as proxy for age (Marien et al 2017).

#Processed data list (dp), contains the data of the model and attributes.
dp=process.data(s1,model="mvmscjs",
                strata.labels=list(inf=c("N","P"),cap=c("F","R")),time.intervals=diffsc)#Processed data list (dp) contains the data and the model and data attributes

ddl=make.design.data(dp);ddl$p$time;ddl$Phi$time# Make design frame for data.

time=1:84 # There are 84 capture sessions.
year2=floor((time-1)/12) # Create 'year' data. 
season=floor((time-year2*12-1)/6)# Create seasonal parameter (incline versus decline season). 
ses=season
year2=as.factor(year2)
season=factor(season,labels=c("inc","decl"))# Create seasonal covariate matrix.
env.data=data.frame(time=c(1,as.numeric(as.character(unique(ddl$p$time)))),ses=season,yr=year2)

# Merge covariate matrix to the design matrix voor P (recapture), Phi (Survival) and PSi (transition) parameters.
ddl$p=merge_design.covariates(ddl$p,env.data)
ddl$Phi=merge_design.covariates(ddl$Phi,env.data)
ddl$Psi=merge_design.covariates(ddl$Psi,env.data)

# Set Psi to 0 for cases which are not possible in nature.
ddl$Psi$fix[as.character(ddl$Psi$inf)=="P"&as.character(ddl$Psi$toltag)=="N"]=0# Impossible to go from antibody positive "P" to antibody negative "N".
ddl$p$fix[as.character(ddl$p$cap)=="R"]=1 # If an animal is in the recaptured state "cap", it is evidently recaptured.

ddl$Psi$weight=as.numeric(ddl$Psi$weight)# Give 'Body weight' a numerical value.
ddl$Phi$weight=as.numeric(ddl$Phi$weight)
ddl$p$weight=as.numeric(ddl$p$weight)

ddl$Psi$NtoP=ifelse(ddl$Psi$inf=="N"&ddl$Psi$toinf=="P",1,0) # Negative to Positive state movement. 
ddl$Psi$FtoR=ifelse(ddl$Psi$cap=="F"&ddl$Psi$tocap=="R",1,0) # First capture "F" to Recapture "R" state movement.
ddl$Psi$RtoF=ifelse(ddl$Psi$cap=="R"&ddl$Psi$tocap=="F",1,0) # Reapture to First capture state movement.


#All models
# ses= season; weight = body mass (proxy for age); inf = infection status (antibody positive or negative); RtoF = Recapture to First capture transition; FtoR = First capture to recapture transition

### PSi transition models
Psi1=list(formula=~FtoR+RtoF+NtoP*ses+ses*weight)
Psi2=list(formula=~FtoR+RtoF+NtoP*weight*ses)
Psi3=list(formula=~FtoR+RtoF+NtoP+ses*weight)
Psi4=list(formula=~FtoR+RtoF+NtoP*ses+weight)
Psi5=list(formula=~FtoR+RtoF+ses*weight+NtoP*weight)
Psi6=list(formula=~FtoR+RtoF+NtoP*ses+ses*weight+NtoP*weight)
Psi7=list(formula=~FtoR+RtoF+NtoP+ses+weight)
Psi8=list(formula=~FtoR+RtoF+NtoP*weight)
Psi9=list(formula=~FtoR+RtoF+NtoP+weight)
Psi10=list(formula=~FtoR+RtoF+NtoP*weight+ses)
Psi11=list(formula=~FtoR+RtoF+NtoP*weight+weight*ses)

### P Recapture models
p1=list(formula=~cap)         
p2=list(formula=~cap+inf)
p3=list(formula=~cap+ses)
p4=list(formula=~cap+weight)
p5=list(formula=~cap+inf+ses)
p6=list(formula=~cap+inf+weight)
p7=list(formula=~cap+ses+weight)
p8=list(formula=~cap+inf*ses)
p9=list(formula=~cap+inf*weight)
p10=list(formula=~cap+ses*weight)
p11=list(formula=~cap+inf+ses+weight)
p12=list(formula=~cap+inf*ses+weight)
p13=list(formula=~cap+inf*weight+ses)
p14=list(formula=~cap+ses*weight+inf)
p15=list(formula=~cap+inf*ses+weight*ses)
p16=list(formula=~cap+inf*ses+weight*inf)
p17=list(formula=~cap+inf*weight+ses*weight)
p18=list(formula=~cap+inf*ses+inf*weight+ses*weight)
p19=list(formula=~cap+inf*ses*weight) 

#### Phi survival models
Phi1=list(formula=~1) 
Phi2=list(formula=~inf)
Phi3=list(formula=~ses)
Phi4=list(formula=~weight)
Phi5=list(formula=~inf+ses)
Phi6=list(formula=~inf+weight)
Phi7=list(formula=~ses+weight)
Phi8=list(formula=~inf*ses)
Phi9=list(formula=~inf*weight)
Phi10=list(formula=~ses*weight)
Phi11=list(formula=~inf+ses+weight)
Phi12=list(formula=~inf*ses+weight)
Phi13=list(formula=~inf*weight+ses)
Phi14=list(formula=~ses*weight+inf)
Phi15=list(formula=~inf*ses+weight*ses)
Phi16=list(formula=~inf*ses+weight*inf)
Phi17=list(formula=~inf*weight+ses*weight)
Phi18=list(formula=~inf*ses+inf*weight+ses*weight)
Phi19=list(formula=~inf*ses*weight)

##########################################################################################################

# Insert the models that you want to test.
psi.list=list(Psi1 )
p.list=list( p2)
p.list=list( p2, p3)
phi.list=list(Phi5)
#phi.list=list(Phi5,Phi7)

mod=list()
i=1
tel=0
for(i in 1:length(phi.list)){
  k=1
  for(k in 1:length(p.list)){
    tel=tel+1
    mod[[(i+k)-1]]=crm(dp,ddl,model.parameters=list(Psi=psi.list[[1]],p=p.list[[k]],Phi=phi.list[[i]]),hessian=TRUE)
    Phi=phi.list[[i]]
  }
}


i=1
aic=rep(NA,length(mod))
for(i in 1:length(mod)){
  aic[i]=mod[[i]]$results$AIC
}
min=which(aic==min(aic))
mod[[min]]# Best fitting model.
