This is an analysis of the Cranbroo school data collected before and after the Purpose Navigator program. Load packedges
library(dplyr)
##
## Attaching package: 'dplyr'
##
## The following objects are masked from 'package:stats':
##
## filter, lag
##
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
library(psych)
library(ggplot2)
##
## Attaching package: 'ggplot2'
##
## The following object is masked from 'package:psych':
##
## %+%
library(Rmisc)
## Loading required package: lattice
## Loading required package: plyr
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
##
## Attaching package: 'plyr'
##
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
library(nlme)
##
## Attaching package: 'nlme'
##
## The following object is masked from 'package:dplyr':
##
## collapse
First read in the dataset that tells us which section each students completed.
setwd("~/Dropbox/Schools Study/Cranbrook Study")
Cranbrook<-read.csv("CranbrookPN.csv")
#View(Cranbrook)
#str(Cranbrook)
See the how many students completed each section
summary(Cranbrook$Last.Complete)
## 0 1.1.12 1.1.13 1.1.7 1.1.9 2.0.10 2.0.2 2.0.5 2.0.6 2.1.1
## 3 1 1 1 1 1 1 1 1 1
## 2.1.4 2.2 2.3 2.4 2.5.1 2.6 2.6.1 2.6.10 2.6.4 2.6.8
## 8 4 5 1 17 2 1 9 1 1
## 2.6.9 3.0.1 3.1 3.2 4.1.36 4.1.4 4.2.1 5.0.13 5.0.17 5.0.3
## 1 24 15 19 2 3 1 1 3 3
## 5.0.4 5.0.5 5.0.6 5.0.7 5.0.9 6.0.1
## 4 2 1 2 1 20
In order to be able to join the datasets together later we will need first and last names together
Cranbrook$Full.Name <- paste(Cranbrook$First.Name, Cranbrook$Last.Name, sep=' ')
Put names to all uppercase so that we wont have the case cause problems later when joining datasets
Cranbrook$Full.Name<-toupper(Cranbrook$Full.Name)
Remove extra space between first and last name
Cranbrook$Full.Name<-gsub(" "," ", Cranbrook$Full.Name)
remove white space before and fater words
Cranbrook$Full.Name<-str_trim(Cranbrook$Full.Name, side = c("both"))
check for duplicates
Cranbrook$Full.Name[duplicated(Cranbrook$Full.Name)]
## character(0)
Create new dataset “name_complete” that just contains Full Name and the last sction complete
name_complete<-select(Cranbrook, Full.Name, Last.Complete)
#write.csv(name_complete, file = "name_complete.csv",row.names=FALSE)
Summaries of data
#str(name_complete)
summary(name_complete)
## Full.Name Last.Complete
## Length:163 3.0.1 :24
## Class :character 6.0.1 :20
## Mode :character 3.2 :19
## 2.5.1 :17
## 3.1 :15
## 2.6.10 : 9
## (Other):59
The dataset has sections in umber such as 1.2.3 and here we change sections to integers
name_complete$Last.Complete<-as.character(name_complete$Last.Complete)
name_complete$Last.Complete[name_complete$Last.Complete=="1.1.12"] <- 1
name_complete$Last.Complete[name_complete$Last.Complete=="1.1.13"] <- 1
name_complete$Last.Complete[name_complete$Last.Complete=="1.1.7"] <- 1
name_complete$Last.Complete[name_complete$Last.Complete=="1.1.9"] <- 1
name_complete$Last.Complete[name_complete$Last.Complete=="2.0.10"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.0.2"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.0.5"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.0.6"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.1.1"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.1.4"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.2"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.3"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.4"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.5.1"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.5.1"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6.1"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6.10"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6.4"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6.8"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="2.6.9"] <- 2
name_complete$Last.Complete[name_complete$Last.Complete=="3.0.1"] <- 3
name_complete$Last.Complete[name_complete$Last.Complete=="3.1"] <- 3
name_complete$Last.Complete[name_complete$Last.Complete=="3.2"] <- 3
name_complete$Last.Complete[name_complete$Last.Complete=="4.1.36"] <- 4
name_complete$Last.Complete[name_complete$Last.Complete=="4.2.36"] <- 4
name_complete$Last.Complete[name_complete$Last.Complete=="4.1.4"] <- 4
name_complete$Last.Complete[name_complete$Last.Complete=="4.2.1"] <- 4
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.13"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.17"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.3"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.4"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="6.0.1"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.5"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.6"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.7"] <- 5
name_complete$Last.Complete[name_complete$Last.Complete=="5.0.9"] <- 5
#View(name_complete)
Read in pre and post data from Cranbrook
cranall<-read.csv("pre_post_Cran.csv")
#View(cranall)
In order to be able to join the datasets together later we will need first and last names together
cranall$Full.Name <- paste(cranall$First.Name, cranall$Last.Name, sep=' ')
Put names to all uppercase so that we wont have the case cause problems later when joining datasets
cranall$Full.Name<-toupper(cranall$Full.Name)
Remove extra space between first and last name
cranall$Full.Name<-gsub(" "," ", cranall$Full.Name)
Remove white space before and after
cranall$Full.Name<-str_trim(cranall$Full.Name, side = c("both"))
Join bith datasets using full_join from dyplyr
cranall1<-full_join(name_complete, cranall, by="Full.Name")
check duplicates
#cranall1$Full.Name[duplicated(cranall1$Full.Name)]
mark thoes who we have no record of having done the intervention as 0 in the section complete “Last.Complete” variable
cranall1$Last.Complete[is.na(cranall1$Last.Complete)] <- 0
Remove the students who did not even start the intervention
cranall1<-filter(cranall1, Last.Complete>1)
View dataset and Last.Complete is not showing up on the second part of the dtatset. Instead it has NS’s
#View(cranall1)
#write CSV
#write.csv(cranall1, file = "cranall1.csv",row.names=FALSE)
summary(name_complete$Last.Complete)
## Length Class Mode
## 163 character character
Create new dataset with all information but only with MLQ found purpose questions
cranMLQ<-select(cranall1, Last.Complete, wave, ID, MLQ_1, MLQ_4, MLQ_5, MLQ_6, MLQ_9, Full.Name)
reverse code the negative question
items <- c("MLQ_1" ,"MLQ_4", "MLQ_5", "MLQ_6", "MLQ_9")
scaleKey <- c(1, 1, 1,1,-1)
create new veriable meanMLQ and add to dataset
cranMLQ$meanmlq <- scoreItems(scaleKey, items=cranMLQ[,items], delete=FALSE)$score
#View(cranMLQ)
Remove NAs
cranMLQ<-cranMLQ[complete.cases(cranMLQ),]
As numeric
cranMLQ$wave<-as.numeric(cranMLQ$wave)
cranMLQ$meanmlq<-as.numeric(cranMLQ$meanmlq)
Create datasets for ploting with wave one and wave 2 as two seperate dtatsets
cranMLQT1<-filter(cranMLQ, wave == 1)
cranMLQT2<-filter(cranMLQ, wave == 2)
Plot
plot(cranMLQT1$Last.Complete, cranMLQT1$meanmlq, type="h", ylab= "Meaning in Life", xlab = "Sections of PN Completed")
plot(cranMLQT2$Last.Complete, cranMLQT2$meanmlq, type="h", ylab= "Meaning in Life", xlab = "Sections of PN Completed")
Plot using ggplot plots meanMLQ - Completed Sections
CranMLQSET1 <- summarySE(cranMLQT1, measurevar="meanmlq", groupvars="Last.Complete", na.rm = TRUE)
p1<-ggplot(CranMLQSET1, aes(x=Last.Complete, y=meanmlq, colour=Last.Complete)) +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se), width=.1) +
labs(x="Sections Completed", y="Purpose")+
ylim(c(1,7))+
geom_point() +
geom_line() +
ggtitle("Purpose Time 1")+
theme(legend.title = element_text(colour="black", size=10, face="bold"))+
scale_color_discrete(name="Sections\nCompleted")
CranMLQSET2 <- summarySE(cranMLQT2, measurevar="meanmlq", groupvars="Last.Complete", na.rm = TRUE)
p2<-ggplot(CranMLQSET2, aes(x=Last.Complete, y=meanmlq, colour=Last.Complete)) +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se), width=.1) +
labs(x="Sections Completed", y="Purpose")+
ylim(c(1,7))+
geom_point() +
geom_line() +
ggtitle("Purpose Time 2")+
theme(legend.title = element_text(colour="black", size=10, face="bold"))+
scale_color_discrete(name="Sections\nCompleted")
CranMLQSET1BG <- CranMLQSET1
CranMLQSET1BG$Last.Complete <- factor(CranMLQSET1BG$Last.Complete)
p3<-ggplot(CranMLQSET1BG, aes(x=Last.Complete, y=meanmlq, fill=Last.Complete)) +
geom_bar(position=position_dodge(), stat="identity") +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se),
width=.2, # Width of the error bars
position=position_dodge(.9))+
labs(x="Sections Completed", y="Purpose")+
theme(legend.position="none") + #removes legand
geom_line() +
ggtitle("Purpose Time 1")
CranMLQSET2BG <- CranMLQSET2
CranMLQSET2BG$Last.Complete <- factor(CranMLQSET2BG$Last.Complete)
p4<-ggplot(CranMLQSET2BG, aes(x=Last.Complete, y=meanmlq, fill=Last.Complete)) +
geom_bar(position=position_dodge(), stat="identity") +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se),
width=.2, # Width of the error bars
position=position_dodge(.9)) +
theme(legend.position="none") + #removes legand
labs(x="Sections Completed", y="Purpose")+
geom_line() +
ggtitle("Purpose Time 2")
multiplot(p1, p3, p2, p4, cols=2)
## geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
## geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
## geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
## geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
Creat table with count, mean, standard deviation, standard error of the mean, and confidence interval (95%) in order to ba able to plot.
CranMLQ <- summarySE(cranMLQ, measurevar="meanmlq", groupvars="wave", na.rm = FALSE)
Plots mean MLQ - Wave
p1<-ggplot(CranMLQ, aes(x=wave, y=meanmlq, colour=wave)) +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se), width=.1) +
geom_point() +
ylim(c(1,7))+
geom_line() +
ggtitle("Meaning in Life Time One to Time Two")
CranMLQSET <- CranMLQ
CranMLQSET$wave <- factor(CranMLQSET$wave)
p3<-ggplot(CranMLQSET, aes(x=wave, y=meanmlq, fill=wave)) +
geom_bar(position=position_dodge(), stat="identity") +
geom_errorbar(aes(ymin=meanmlq-se, ymax=meanmlq+se),
width=.2, # Width of the error bars
position=position_dodge(.9))+
theme(legend.position="none") + #removes legand
geom_line() +
ggtitle("Meaning in Life Time One to Time Two")
multiplot(p1, p3, cols=2)
## geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?
T-test. First create a dtataset for paired t-test
paired1<-filter(cranMLQ, wave==1)
paired2<-filter(cranMLQ, wave==2)
pairedttest<-full_join(paired1,paired2, by="Full.Name")
#View(pairedttest)
Paired t-test pairs means based pre and post.
t.test(pairedttest$meanmlq.x, pairedttest$meanmlq.y, paired=T)
##
## Paired t-test
##
## data: pairedttest$meanmlq.x and pairedttest$meanmlq.y
## t = 0.45876, df = 100, p-value = 0.6474
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.1843351 0.2952262
## sample estimates:
## mean of the differences
## 0.05544554
unpaird t-test based on wave
t.test(cranMLQ$meanmlq ~ cranMLQ$wave, paired=F)
##
## Welch Two Sample t-test
##
## data: cranMLQ$meanmlq by cranMLQ$wave
## t = 0.9028, df = 231.93, p-value = 0.3676
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.1709484 0.4601129
## sample estimates:
## mean in group 1 mean in group 2
## 4.525714 4.381132
Boxplot of t-test
boxplot(meanmlq~wave,data=cranMLQ, main="Cranbrook",
xlab="Wave", ylab="MLQ")
Mixed linier models MLQ by wave (nearly the same as t-test)
TimesModel <- lme(meanmlq ~ wave, random = ~1 | ID, data = cranMLQ, method = "ML", na.action = "na.omit")
summary(TimesModel)
## Linear mixed-effects model fit by maximum likelihood
## Data: cranMLQ
## AIC BIC logLik
## 815.0419 829.0632 -403.5209
##
## Random effects:
## Formula: ~1 | ID
## (Intercept) Residual
## StdDev: 0.0001122728 1.247811
##
## Fixed effects: meanmlq ~ wave
## Value Std.Error DF t-value p-value
## (Intercept) 4.670296 0.2442553 145 19.120557 0.0000
## wave -0.144582 0.1613139 99 -0.896278 0.3723
## Correlation:
## (Intr)
## wave -0.945
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -2.82552039 -0.58159011 0.05953284 0.65624376 2.09877038
##
## Number of Observations: 246
## Number of Groups: 146
Mixed linier model, MLQ based on last completed section
SectionModel <- lme(meanmlq ~ Last.Complete, random = ~1 | ID, data = cranMLQ, method = "ML", na.action = "na.omit")
summary(SectionModel)
## Linear mixed-effects model fit by maximum likelihood
## Data: cranMLQ
## AIC BIC logLik
## 815.3146 836.3466 -401.6573
##
## Random effects:
## Formula: ~1 | ID
## (Intercept) Residual
## StdDev: 9.361872e-05 1.238393
##
## Fixed effects: meanmlq ~ Last.Complete
## Value Std.Error DF t-value p-value
## (Intercept) 4.423256 0.1346385 145 32.85284 0.0000
## Last.Complete3 -0.111428 0.1867903 97 -0.59654 0.5522
## Last.Complete4 0.421189 0.4374312 97 0.96287 0.3380
## Last.Complete5 0.283641 0.2121468 97 1.33700 0.1843
## Correlation:
## (Intr) Lst.C3 Lst.C4
## Last.Complete3 -0.721
## Last.Complete4 -0.308 0.222
## Last.Complete5 -0.635 0.457 0.195
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -2.99331151 -0.57380412 0.07119875 0.62721938 2.17069352
##
## Number of Observations: 246
## Number of Groups: 146
Mixed linier model - MLQ based on last completed section and wave
SectionModel <- lme(meanmlq ~ wave * Last.Complete, random = ~1 | ID, data = cranMLQ, method = "ML", na.action = "na.omit")
summary(SectionModel)
## Linear mixed-effects model fit by maximum likelihood
## Data: cranMLQ
## AIC BIC logLik
## 821.671 856.7243 -400.8355
##
## Random effects:
## Formula: ~1 | ID
## (Intercept) Residual
## StdDev: 8.507756e-05 1.234263
##
## Fixed effects: meanmlq ~ wave * Last.Complete
## Value Std.Error DF t-value p-value
## (Intercept) 4.757883 0.4175934 145 11.393580 0.0000
## wave -0.230224 0.2718033 93 -0.847023 0.3992
## Last.Complete3 -0.468027 0.5747509 93 -0.814312 0.4175
## Last.Complete4 0.852117 1.3519345 93 0.630294 0.5300
## Last.Complete5 0.278238 0.6543934 93 0.425185 0.6717
## wave:Last.Complete3 0.245822 0.3793989 93 0.647924 0.5186
## wave:Last.Complete4 -0.299776 0.8845635 93 -0.338897 0.7355
## wave:Last.Complete5 0.000163 0.4296243 93 0.000380 0.9997
## Correlation:
## (Intr) wave Lst.C3 Lst.C4 Lst.C5 w:L.C3 w:L.C4
## wave -0.946
## Last.Complete3 -0.727 0.687
## Last.Complete4 -0.309 0.292 0.224
## Last.Complete5 -0.638 0.604 0.464 0.197
## wave:Last.Complete3 0.678 -0.716 -0.945 -0.209 -0.433
## wave:Last.Complete4 0.291 -0.307 -0.211 -0.946 -0.186 0.220
## wave:Last.Complete5 0.599 -0.633 -0.435 -0.185 -0.945 0.453 0.194
##
## Standardized Within-Group Residuals:
## Min Q1 Med Q3 Max
## -3.08367054 -0.58103750 0.06396316 0.71078497 2.18312090
##
## Number of Observations: 246
## Number of Groups: 146