#### CFA FOR UNWANTED TRAITS ####

library(lavaan)

#### ** cross-validation ####

library(caret)

# setting seed to generate a
# reproducible random sampling
set.seed(3)
train.test <- createFolds(final.data$ID, k = 2)
train.test.data <- lapply(train.test, function(ind, dat) dat[ind,], dat = final.data)

train.test.data1 <- train.test.data$Fold1
train.test.data2 <- train.test.data$Fold2

write.table(train.test.data1,file="train.test.data1.csv")
write.table(train.test.data2,file="train.test.data2.csv")

train.test.data1 <- read.table(file="train.test.data1.csv", stringsAsFactors = T)

summary(train.test.data1)

## ** fitting different models ####

#### **** null model ####

null.model <- '
      noise_sensitivity_score ~~ noise_sensitivity_score
      fearfulness_score ~~ fearfulness_score
      barking_score ~~ barking_score
      stranger_aggression_score ~~ stranger_aggression_score
      owner_aggression_score ~~ owner_aggression_score
      dog_aggression_score ~~ dog_aggression_score
      surface_phobia_score ~~ surface_phobia_score
      separation_behavior_score ~~ separation_behavior_score 
      inattention_score ~~ inattention_score
      impulsivity_score ~~ impulsivity_score'

fit.null.model.1 <- cfa(null.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.null.model.1, fit.measures=TRUE)

fit.null.model.2 <- cfa(null.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.null.model.2, fit.measures=TRUE)

#### **** one general factor ####

p.model <- '
      one.p =~ noise_sensitivity_score + fearfulness_score +
                barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score +
                surface_phobia_score + separation_behavior_score + 
                inattention_score + impulsivity_score'

fit.p.model.1 <- cfa(p.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.p.model.1, fit.measures=TRUE)

fit.p.model.2 <- cfa(p.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.p.model.2, fit.measures=TRUE)


#### **** one general factor + ADHD ####

p.a.model <- '
      one.p =~ noise_sensitivity_score + fearfulness_score +
                barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score +
                surface_phobia_score + separation_behavior_score 
      adhd =~ inattention_score + impulsivity_score'

fit.pa.model.1 <- cfa(p.a.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.pa.model.1, fit.measures=TRUE)

fit.pa.model.2 <- cfa(p.a.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.pa.model.2, fit.measures=TRUE)


#### **** internalizing, externalizing & ADHD ####

i.e.a.model <- '
      internal =~ noise_sensitivity_score + fearfulness_score +
                  surface_phobia_score + separation_behavior_score 
      external =~ barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score
      adhd =~ inattention_score + impulsivity_score'

fit.iea.model.1 <- cfa(i.e.a.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.iea.model.1, fit.measures=TRUE)

fit.iea.model.2 <- cfa(i.e.a.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.iea.model.2, fit.measures=TRUE)


#### **** internalizing & externalizing ####

i.e.model <- '
      internal =~ noise_sensitivity_score + fearfulness_score +
                  surface_phobia_score + separation_behavior_score 
      external =~ barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score +
                inattention_score + impulsivity_score'

fit.ie.model.1 <- cfa(i.e.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.ie.model.1, fit.measures=TRUE)

fit.ie.model.2 <- cfa(i.e.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.ie.model.2, fit.measures=TRUE)


#### **** hierarchical, ADHD separate ####

hierarchical.a.model <- '
      internal =~ noise_sensitivity_score + fearfulness_score +
                  surface_phobia_score + separation_behavior_score 
      external =~ barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score
      adhd =~ inattention_score + impulsivity_score
      one.p =~ internal + external'

fit.hier.a.model.1 <- cfa(hierarchical.a.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.hier.a.model.1, fit.measures=TRUE)

fit.hier.a.model.2 <- cfa(hierarchical.a.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.hier.a.model.2, fit.measures=TRUE)


#### **** hierarchical ####

hierarchical.model <- '
      internal =~ noise_sensitivity_score + fearfulness_score +
                  surface_phobia_score + separation_behavior_score 
      external =~ barking_score + stranger_aggression_score +
                owner_aggression_score + dog_aggression_score +
                inattention_score + impulsivity_score
      one.p =~ internal + external'

fit.hier.model.1 <- cfa(hierarchical.model, estimator="ML", missing="ml", start="simple", data = train.test.data1)
summary(fit.hier.model.1, fit.measures=TRUE)

fit.hier.model.2 <- cfa(hierarchical.model, estimator="ML", missing="ml", start="simple", data = train.test.data2)
summary(fit.hier.model.2, fit.measures=TRUE)


#### **** dog studies ####

dog.model <- '
      fearaggre =~ fearfulness_score + barking_score + stranger_aggression_score
      fear.related =~ noise_sensitivity_score + separation_behavior_score + 
                      surface_phobia_score + fearfulness_score
      aggression =~ owner_aggression_score + dog_aggression_score + stranger_aggression_score
      adhd =~ inattention_score + impulsivity_score'

fit.dog.model.1 <- cfa(dog.model, estimator="ML", missing="ml", data = train.test.data1)
summary(fit.dog.model.1, fit.measures=TRUE)
standardizedSolution(fit.dog.model.1, output="pretty")

fit.dog.model.2 <- cfa(dog.model, estimator="ML", missing="ml", data = train.test.data2)
summary(fit.dog.model.2, fit.measures=TRUE)




#### ** model comparison ####

library(semTools)
library(nonnest2)



#### **** models vs null model ####

# are the models nested?
net(fit.null.model.1, fit.p.model.1)
net(fit.null.model.1, fit.pa.model.1)
net(fit.null.model.1, fit.iea.model.1)
net(fit.null.model.1, fit.ie.model.1)
net(fit.null.model.1, fit.hier.a.model.1)
net(fit.null.model.1, fit.hier.model.1)
net(fit.null.model.1, fit.dog.model.1)
# all models nested, thus use nested=TRUE in vuong test

# p.model fits better than null
vuongtest(fit.null.model.1, fit.p.model.1, nested=TRUE)

# pa.model fits better than null
vuongtest(fit.null.model.1, fit.pa.model.1, nested=TRUE)

# iea model fits better than null
vuongtest(fit.null.model.1, fit.iea.model.1, nested=TRUE)

# ie model fits better than null
vuongtest(fit.null.model.1, fit.ie.model.1, nested=TRUE)

# hier.a model fits better than null
vuongtest(fit.null.model.1, fit.hier.a.model.1, nested=TRUE)

# hier model fits better than null
vuongtest(fit.null.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than null
vuongtest(fit.null.model.1, fit.dog.model.1, nested=TRUE)


vuongtest(fit.null.model.2, fit.p.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.pa.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.iea.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.ie.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.hier.a.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.null.model.2, fit.dog.model.2, nested=TRUE)



#### **** other models vs p model ####


# pa.model fits better than p
vuongtest(fit.p.model.1, fit.pa.model.1, nested=TRUE)

# iea model fits better than p
vuongtest(fit.p.model.1, fit.iea.model.1, nested=TRUE)

# ie model fits better than p
vuongtest(fit.p.model.1, fit.ie.model.1, nested=TRUE)

# hier.a model fits better than p
vuongtest(fit.p.model.1, fit.hier.a.model.1, nested=TRUE)

# hier model fits better than p
vuongtest(fit.p.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than p
vuongtest(fit.p.model.1, fit.dog.model.1, nested=TRUE)



vuongtest(fit.p.model.2, fit.pa.model.2, nested=TRUE)
vuongtest(fit.p.model.2, fit.iea.model.2, nested=TRUE)
vuongtest(fit.p.model.2, fit.ie.model.2, nested=TRUE)
vuongtest(fit.p.model.2, fit.hier.a.model.2, nested=TRUE)
vuongtest(fit.p.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.p.model.2, fit.dog.model.2, nested=TRUE)




#### **** other models vs pa model ####

# iea model fits better than pa
vuongtest(fit.pa.model.1, fit.iea.model.1, nested=TRUE)

# pa model fits better than ie
vuongtest(fit.pa.model.1, fit.ie.model.1, nested=TRUE)

# hier.a model fits better than pa
vuongtest(fit.pa.model.1, fit.hier.a.model.1, nested=TRUE)

# pa model fits better than hier
vuongtest(fit.pa.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than pa
vuongtest(fit.pa.model.1, fit.dog.model.1, nested=TRUE)


vuongtest(fit.pa.model.2, fit.iea.model.2, nested=TRUE)
vuongtest(fit.pa.model.2, fit.ie.model.2, nested=TRUE)
vuongtest(fit.pa.model.2, fit.hier.a.model.2, nested=TRUE)
vuongtest(fit.pa.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.pa.model.2, fit.dog.model.2, nested=TRUE)



#### **** other models vs iea model ####

# iea model fits better than ie
vuongtest(fit.iea.model.1, fit.ie.model.1, nested=TRUE)

# hier.a and iea indistinguishable
vuongtest(fit.iea.model.1, fit.hier.a.model.1, nested=TRUE)

# iea model fits better than hier
vuongtest(fit.iea.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than iea
vuongtest(fit.iea.model.1, fit.dog.model.1, nested=TRUE)


vuongtest(fit.iea.model.2, fit.ie.model.2, nested=TRUE)
vuongtest(fit.iea.model.2, fit.hier.a.model.2, nested=TRUE)
vuongtest(fit.iea.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.iea.model.2, fit.dog.model.2, nested=TRUE)


#### **** other models vs ie model ####


# hier.a fits better than ie
vuongtest(fit.ie.model.1, fit.hier.a.model.1, nested=TRUE)

# hier and ie indistinguishable
vuongtest(fit.ie.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than ie
vuongtest(fit.ie.model.1, fit.dog.model.1, nested=TRUE)


vuongtest(fit.ie.model.2, fit.hier.a.model.2, nested=TRUE)
vuongtest(fit.ie.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.ie.model.2, fit.dog.model.2, nested=TRUE)



#### **** other models vs hier.a model ####


# hier.a fits better than hier
vuongtest(fit.hier.a.model.1, fit.hier.model.1, nested=TRUE)

# dog model fits better than hier.a
vuongtest(fit.hier.a.model.1, fit.dog.model.1, nested=TRUE)


vuongtest(fit.hier.a.model.2, fit.hier.model.2, nested=TRUE)
vuongtest(fit.hier.a.model.2, fit.dog.model.2, nested=TRUE)



#### **** other models vs hier ####


# dog model fits better than hier
vuongtest(fit.hier.model.1, fit.dog.model.1, nested=TRUE)

vuongtest(fit.hier.model.2, fit.dog.model.2, nested=TRUE)





#### SEM BASED ON THE DOG MODEL ####

library(lavaan)


final.model<- '
    # latent variables
    fearaggre =~ fearfulness_score + barking_score + stranger_aggression_score
    fear.related =~ noise_sensitivity_score + separation_behavior_score + 
                      surface_phobia_score + fearfulness_score
    aggression =~ owner_aggression_score + dog_aggression_score + stranger_aggression_score
    adhd =~ inattention_score + impulsivity_score
    
    # regressions
    fear.related ~ insecurity_score + aggressiveness_dominance_score + perseverance_score + training_focus_score +
      activity_playfulness_score + human_sociability_score + dog_sociability_score
    fearaggre ~ insecurity_score + aggressiveness_dominance_score + perseverance_score + training_focus_score +
      activity_playfulness_score + human_sociability_score + dog_sociability_score
    aggression ~ insecurity_score + aggressiveness_dominance_score + perseverance_score + training_focus_score +
      activity_playfulness_score + human_sociability_score + dog_sociability_score
    adhd ~ insecurity_score + aggressiveness_dominance_score + perseverance_score + training_focus_score +
      activity_playfulness_score + human_sociability_score + dog_sociability_score
    noise_sensitivity_score ~ sex.bin + mean.age + 
      socialization + noise_sensitivity_breed
    fearfulness_score ~ sex.bin + mean.age + 
      socialization + fearfulness_breed
    barking_score ~ sex.bin + mean.age + 
      socialization + barking_breed
    owner_aggression_score ~ sex.bin + mean.age + 
      socialization + owner_aggression_breed
    stranger_aggression_score ~ sex.bin + mean.age + 
      socialization + stranger_aggression_breed
    dog_aggression_score ~ sex.bin + mean.age + 
      socialization + dog_aggression_breed
    surface_phobia_score ~ sex.bin + mean.age +
      socialization + surface_phobia_breed
    separation_behavior_score ~ sex.bin + mean.age +
      socialization + separation_behavior_breed
    inattention_score ~ sex.bin + mean.age +
      socialization + inattention_breed
    impulsivity_score ~ sex.bin + mean.age +
      socialization + impulsivity_breed
    insecurity_score ~ sex.bin + 
      mean.age + socialization + insecurity_breed
    aggressiveness_dominance_score ~ sex.bin + 
      mean.age + socialization + aggressiveness_dominance_breed
    perseverance_score ~ sex.bin + 
      mean.age + socialization + perseverance_breed
    training_focus_score ~ sex.bin + 
      mean.age + socialization + training_focus_breed
    activity_playfulness_score ~ sex.bin + 
      mean.age + socialization + activity_playfulness_breed
    human_sociability_score ~ sex.bin + 
      mean.age + socialization + human_sociability_breed
    dog_sociability_score ~ sex.bin + 
      mean.age + socialization + dog_sociability_breed

    # residual correlations
    insecurity_score ~~ training_focus_score
    insecurity_score ~~ aggressiveness_dominance_score
    insecurity_score ~~ dog_sociability_score
    insecurity_score ~~ human_sociability_score
    training_focus_score ~~ aggressiveness_dominance_score
    training_focus_score ~~ dog_sociability_score
    training_focus_score ~~ human_sociability_score    
    activity_playfulness_score ~~ aggressiveness_dominance_score  
    activity_playfulness_score ~~ dog_sociability_score
    activity_playfulness_score ~~ human_sociability_score
    aggressiveness_dominance_score ~~ dog_sociability_score
    aggressiveness_dominance_score ~~ human_sociability_score
    '

fit.final.model <- sem(final.model, estimator="MLR", missing="ml.x", fixed.x=T, data = final.data)

# model fit
fitmeasures(fit.final.model, c("cfi","tli","rmsea","srmr"))

results <- standardizedSolution(fit.final.model, type="std.all", output="pretty")
write.table(results,file="results.csv")

summary(fit.final.model)


