source("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/PrepData.R")
df <- read_csv("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/Results/allData.csv") %>%
mutate(id = as.factor(id))
results <- read_csv("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/Results/results.csv") %>%
mutate(prev = factor(prev, levels = c("none", "nature", "urban")),
filt = factor(filt, levels = c("hi", "lo")),
id = factor(id))
rel_results <- read_csv("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/Results/rel_results.csv") %>%
mutate(prev = factor(prev, levels = c("urban", "nature")),
filt = factor(filt, levels = c("lo", "hi")),
id = factor(id))
lmer_results <- read_csv("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/Results/lmer_results.csv") %>%
mutate(prev = factor(prev, levels = c("urban", "nature")),
filt = factor(filt, levels = c("lo", "hi")),
id = factor(id))
imsort <- read_csv("/Users/notandi/Desktop/Skoli Vor 2018/BS Verkefni/Results/imsort.csv")
aov(cbind(errors, dprime, ies, rt) ~ type, results) %>%
summary
## Response errors :
## Df Sum Sq Mean Sq F value Pr(>F)
## type 1 48.1 48.050 0.838 0.3613
## Residuals 169 9690.4 57.339
##
## Response dprime :
## Df Sum Sq Mean Sq F value Pr(>F)
## type 1 0.00478 0.0047764 0.697 0.405
## Residuals 169 1.15807 0.0068525
##
## Response ies :
## Df Sum Sq Mean Sq F value Pr(>F)
## type 1 0.0359 0.035927 1.8428 0.1764
## Residuals 169 3.2949 0.019496
##
## Response rt :
## Df Sum Sq Mean Sq F value Pr(>F)
## type 1 0.01179 0.0117873 1.6179 0.2051
## Residuals 169 1.23128 0.0072857
Umhverfið sem sést á mynd er repeated measure þ.a. við munum nota mixed factorial ANOVA með anova_ez() fallinu úr afex pakkanum. Munum skoða fjórar breytur: svartíma, fjölda villna, d’prime, og inverse efficency score. Hér fyrir neðan sést dreifing þeirra breyta milli hópa. Við sjáum að það er mikill munur milli filter hópa, en munurinn er líka þegar environment er none þ.a. þetta er líklegast úrtaksskekkja, en ekki afurð hópaskiptinganna (rétt ályktun?)
cap <- "Summary plot of measures before correction. A large difference can be seen in the first trial (none)"
results %>%
select(-accuracy) %>%
gather(measure, value, rt, errors:ies) %>%
mutate(measure = factor(measure, levels = c("rt","errors", "dprime", "ies"))) %>%
ggplot(aes(prev, value, linetype = filt)) +
stat_summary(geom = "errorbar",
fun.data = function(x) mean_se(x, mult = 1), position = "dodge") +
stat_summary(geom = "point",
fun.data = function(x) mean_se(x, mult = 0), position = position_dodge(width = 0.9)) +
scale_linetype_manual(name = "Spatial Filter",
values = c(1, 2),
labels = c("High Pass ", " Low Pass")) +
guides(linetype = guide_legend(title.position = "top",
title.hjust = 0.5,
label.position = "bottom",
title.vjust = -2,
label.vjust = -2)) +
facet_wrap(~ measure, scales = "free", ncol = 4,
labeller = labeller(measure = c(rt = "Reaction Time (MS)",
dprime = "D'Prime",
ies = "Inverse Efficiency Score",
errors = "Errors"))) +
theme(text = element_text(size = 12, family = "Courier New"),
panel.border = element_rect(fill = NA, linetype = 1, size = 0.8),
panel.grid = element_line(linetype = 1, size = 0.6),
strip.background = element_rect(fill = c("gray95"), linetype = 0),
strip.text = element_text(margin = c(0, 0, 0, 0, "cm")),
legend.position = "top") +
labs(x = "", y = TeX("$\\bar{X} \\pm sd$"))
Summary plot of measures before correction. A large difference can be seen in the first trial (none)
Taflan fyrir neðan sýnir að filtlo hópurinn er verulega frábrugðinn filthi hópnum í fyrsta talnaverkefninu (áður en myndir eru sýndar).
Líkön voru smíðuð með fjórar mismunandi fylgibreytur, filt sem millihópa, id sem … þátttakendaID og prev sem innanhópa breytu.
Fyrir neðan sjást myndir af væntum gildum eftir hópum samkvæmt líkönum með errorbars sem taka gildi plús/mínus eitt staðalfrávik. Enginn stuðull var marktækur innan 95% öryggismarka en samvirkniáhrif á dprime og errors voru marktæk innan 90% marka (fyrir allar leiðréttingar vegna fjölda marktektarprófa). Öryggisbil og myndir virðast benda á að samvirknihrif séu til staðar. Munur milli hópa er nánast enginn í lágtíðni en hann er sýnilegur í hátíðni. Svo virðist vera að það að sjá eingöngu hátíðnispectrum náttúrumynda er meira þreytandi en að sjá það sama í urban myndum.
Kannski náum við að smala nokkrum þátttakendum í viðbót til að gá hvort að við getum fengið marktæk samvirkniáhrif og tekið svo fram að þau voru marktæk fyrir leiðréttingar?
my_aov <- function(variable) {
aov_ez(id = "id",
data = rel_results %>% spread(measure, value),
dv = variable,
between = "filt",
within = "prev")
}
aovs <- map(c("dprime", "errors", "ies", "rt"), my_aov)
aovs[[1]]$anova_table %>%
as.tibble %>%
rownames_to_column("Variable") %>%
select(-c(2:6)) %>%
mutate(DV = "D'Prime") %>%
rbind(
aovs[[2]]$anova_table %>%
as.tibble %>%
rownames_to_column("Variable") %>%
select(-c(2:6)) %>%
mutate(DV = "Errors")
) %>%
rbind(
aovs[[3]]$anova_table %>%
as.tibble %>%
rownames_to_column("Variable") %>%
select(-c(2:6)) %>%
mutate(DV = "IES")
) %>%
rbind(
aovs[[4]]$anova_table %>%
as.tibble %>%
rownames_to_column("Variable") %>%
select(-c(2:6)) %>%
mutate(DV = "RT")
) %>%
set_names(c("Predictor", "p", "DV")) %>%
spread(DV, p) %>%
mutate(Predictor = c("Filter", "Filter:Prev", "Prev")) %>%
kable(format = "html", digits = 3,
caption = "P values for Mixed ANOVA tests") %>%
kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover")) %>%
add_header_above(c("", "P-Value" = 4))
| Predictor | D’Prime | Errors | IES | RT |
|---|---|---|---|---|
| Filter | 0.885 | 0.955 | 0.756 | 0.176 |
| Filter:Prev | 0.048 | 0.055 | 0.148 | 0.546 |
| Prev | 0.421 | 0.391 | 0.267 | 0.438 |
aovs[[1]] %>%
lsmeans("prev", "filt") %>%
pairs %>%
update(by = NULL, adjust = "holm")
## contrast filt estimate SE df t.ratio p.value
## urban - nature lo -0.007942849 0.009352198 55 -0.849 0.3994
## urban - nature hi 0.018566610 0.009189539 55 2.020 0.0964
##
## P value adjustment: holm method for 2 tests
aovs[[2]] %>%
lsmeans("prev", "filt") %>%
pairs %>%
update(by = NULL, adjust = "holm")
## contrast filt estimate SE df t.ratio p.value
## urban - nature lo 0.6428571 0.8354874 55 0.769 0.4449
## urban - nature hi -1.6551724 0.8209561 55 -2.016 0.0974
##
## P value adjustment: holm method for 2 tests
aovs[[3]] %>%
lsmeans("prev", "filt") %>%
pairs %>%
update(by = NULL, adjust = "holm")
## contrast filt estimate SE df t.ratio p.value
## urban - nature lo -0.003310092 0.01368408 55 -0.242 0.8098
## urban - nature hi 0.024812407 0.01344608 55 1.845 0.1408
##
## P value adjustment: holm method for 2 tests
aovs[[4]] %>%
lsmeans("prev", "filt") %>%
pairs %>%
update(by = NULL, adjust = "holm")
## contrast filt estimate SE df t.ratio p.value
## urban - nature lo 0.001096646 0.009025567 55 0.122 0.9037
## urban - nature hi 0.008791500 0.008868589 55 0.991 0.6518
##
## P value adjustment: holm method for 2 tests
cap <- "Predicted values for dependent variables by mixed ANOVA models"
aovs[[1]] %>%
emmeans::lsmeans(c("prev", "filt")) %>%
summary %>%
as.tibble %>%
mutate(variable = "dprime") %>%
select(-lower.CL, upper.CL, df) %>%
rbind(
aovs[[2]] %>%
emmeans::lsmeans(c("prev", "filt")) %>%
summary %>%
as.tibble %>%
mutate(variable = "ies") %>%
select(-lower.CL, upper.CL, df)
) %>%
rbind(
aovs[[3]] %>%
emmeans::lsmeans(c("prev", "filt")) %>%
summary %>%
as.tibble %>%
mutate(variable = "errors") %>%
select(-lower.CL, upper.CL, df)
) %>%
rbind(
aovs[[4]] %>%
emmeans::lsmeans(c("prev", "filt")) %>%
summary %>%
as.tibble %>%
mutate(variable = "rt") %>%
select(-lower.CL, upper.CL, df)
) %>%
ggplot(aes(prev, lsmean,
ymin = lsmean - SE,
ymax = lsmean + SE,
linetype = filt, group = filt)) +
geom_errorbar(alpha = 0.3) +
geom_point() +
geom_line() +
scale_linetype_manual(name = "Spatial Filter",
values = c(1, 2),
labels = c("High Pass ", " Low Pass")) +
guides(linetype = guide_legend(title.position = "top",
title.hjust = 0.5,
label.position = "bottom",
title.vjust = -2,
label.vjust = -2)) +
facet_wrap(~ variable, scales = "free", ncol = 2,
labeller = labeller(variable = c(rt = "Reaction Time (MS)",
dprime = "D'Prime",
ies = "Inverse Efficiency Score",
errors = "Errors"))) +
theme(panel.border = element_rect(fill = NA, linetype = 1, size = 0.8),
panel.grid = element_blank(),
strip.background = element_rect(fill = c("gray95"), linetype = 0),
strip.text = element_text(size = 12, margin = c(0, 0, 0, 0, "cm")),
legend.text = element_text(size = 12),
legend.title = element_text(size = 14, family = "Courier New"),
legend.position = "top") +
labs(x = "", y = TeX("\\bar{Y}_{AOV} $\\pm sd$"))
Predicted values for dependent variables by mixed ANOVA models
Ég smíðaði líka linear mixed effects models með lme4 pakkanum. Þar sem frumbreyturnar taka bara tvö gildi skilar það því sama og post-hoc ANOVA próf. Helsti munurinn er að þá getum við séð effects plot fyrir hvern þátttakanda.
dprime_lmer <- lmer(dprime ~ filt * prev + (1 | id) + (prev || type),
data = lmer_results)
errors_lmer <- lmer(errors ~ filt * prev + (1 | id) + (prev || type),
data = lmer_results)
ies_lmer <- lmer(ies ~ filt * prev + (1 | id) + (prev || type),
data = lmer_results)
rt_lmer <- lmer(rt ~ filt * prev + (1 | id) + (prev || type),
data = lmer_results)
(1 | id) þýðir að hver þátttakandi má hafa ólíkt slembidreifðan skurðpunkt.(prev || type) þýðir að hvor röðunarhópur fær að hafa eigin slembidreifða hallatölu en ekki ólíkan skurðpunkt þar sem við dílum nú þegar við það með hinni breytunni.Úr þessu verður líkan sem metur samvirkniáhrf síunnar og umhverfis sem birtist fyrir SART próf, en leiðréttir fyrir endurteknar mælingar.
dprime_lmer %>%
tidy("fixed") %>%
set_names(c("term", "estimate", "std.error", "df", "statistic", "p.value")) %>%
mutate(variable = "dprime") %>%
rbind(
errors_lmer %>%
tidy("fixed") %>%
set_names(c("term", "estimate", "std.error", "df", "statistic", "p.value")) %>%
mutate(variable = "errors")
) %>%
rbind(
ies_lmer %>%
tidy("fixed") %>%
set_names(c("term", "estimate", "std.error", "df", "statistic", "p.value")) %>%
mutate(variable = "ies")
) %>%
select(-df, -statistic, -std.error) %>%
unite(nums, estimate, p.value) %>%
spread(variable, nums) %>%
separate(dprime, paste0("dprime_", c("estimate", "p.value")), sep = "_") %>%
separate(errors, paste0("errors_", c("estimate", "p.value")), sep = "_") %>%
separate(ies, paste0("ies_", c("estimate", "p.value")), sep = "_") %>%
mutate_at(2:7, as.numeric) %>%
set_names(c("term", rep(c("estimate", "p"), 3))) %>%
kable(format = "html", digits = 3) %>%
kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover"), font_size = 10) %>%
add_header_above(c("", "D-Prime" = 2, "Errors" = 2, "IES" = 2))
| term | estimate | p | estimate | p | estimate | p |
|---|---|---|---|---|---|---|
| (Intercept) | 0.006 | 0.623 | -1.036 | 0.353 | 0.013 | 0.536 |
| filthi | 0.016 | 0.366 | -1.068 | 0.494 | 0.022 | 0.419 |
| filthi:prevnature | -0.027 | 0.048 | 2.298 | 0.055 | -0.028 | 0.149 |
| prevnature | 0.008 | 0.399 | -0.643 | 0.445 | 0.003 | 0.819 |
dprime_lmer %>%
anova %>%
tidy %>%
mutate(variable = "dprime") %>%
rbind(
errors_lmer %>%
anova %>%
tidy %>%
mutate(variable = "errors")
) %>%
rbind(
ies_lmer %>%
anova %>%
tidy %>%
mutate(variable = "ies")
) %>%
select(-sumsq, -meansq, -NumDF, -DenDF, -statistic) %>%
spread(variable, p.value) %>%
kable(format = "html", digits = 3) %>%
kable_styling(bootstrap_options = c("striped")) %>%
add_header_above(c("", "P-Gildi" = 3))
| term | dprime | errors | ies |
|---|---|---|---|
| filt | 0.885 | 0.955 | 0.757 |
| filt:prev | 0.048 | 0.055 | 0.149 |
| prev | 0.421 | 0.391 | 0.392 |
Ef áhrifin sem við sjáum eru vegna skilyrðanna og ekki bara vegna þess að fólk í mismunandi hópum svarar hraðar/hægar ættum við að sjá mismunandi áhrif svartíma á villufjölda.
lmer_results %>%
mutate(rt = rt * 1000) %>%
group_by(filt, prev) %>%
nest %>%
mutate(model = map(data, ~ lm(errors ~ rt, .))) %>%
mutate(model = map(model, tidy)) %>%
unnest(model) %>%
filter(!grepl("Intercept", term)) %>%
unite(group, filt, prev) %>%
mutate(group = reorder(group, estimate)) %>%
ggplot(aes(group, estimate,
ymin = estimate - 1.96 * std.error,
ymax = estimate + 1.96 * std.error)) +
geom_line(aes(group = "none")) +
geom_point() +
geom_errorbar()
model <- lmer(dprime ~ filt + prev + (1 | id), lmer_results)
lmer_results$resid <- residuals(model)
ggplot(lmer_results, aes(prev, resid, linetype = filt)) +
stat_summary(geom = "errorbar",
fun.data = function(x) mean_se(x, mult = 1.96), position = "dodge") +
stat_summary(geom = "point",
fun.data = function(x) mean_se(x, mult = 0), position = position_dodge(width = 0.9)) +
stat_summary(geom = "line", aes(group = filt),
fun.data = function(x) mean_se(x, mult = 0), position = position_dodge(width = 0.9))
cap <- "Predicted values with random intercepts for each participatns and random slopes for each level of type"
dprime_lmer %>%
augment %>%
as.tibble %>%
mutate(variable = "dprime") %>%
rename(true = dprime) %>%
rbind(
errors_lmer %>%
augment %>%
as.tibble %>%
mutate(variable = "errors") %>%
rename(true = errors)
) %>%
mutate(filt2 = filt) %>%
unite(col = variable, variable, filt2) %>%
ggplot(aes(prev, .fitted, linetype = filt, group = id)) +
geom_line() +
geom_point() +
scale_linetype_manual(name = "Spatial Filter",
values = c(1, 2),
labels = c("High Pass ", " Low Pass")) +
guides(shape = FALSE,
linetype = guide_legend(title.position = "top",
title.hjust = 0.5,
label.position = "bottom",
title.vjust = -2,
label.vjust = -2)) +
facet_wrap(~ variable, ncol = 2, scales = "free",
labeller = labeller(variable = c(dprime_hi = "D'Prime",
dprime_lo = "D'Prime",
errors_hi = "Errors",
errors_lo = "Errors"))) +
theme(panel.border = element_rect(fill = NA, linetype = 1, size = 0.8),
panel.grid = element_blank(),
strip.background = element_rect(fill = c("gray95"), linetype = 0),
strip.text = element_text(size = 12, margin = c(0, 0, 0, 0, "cm"))) +
labs(x = "", y = TeX("\\bar{Y}_{AOV} $\\pm sd$"))
Predicted values with random intercepts for each participatns and random slopes for each level of type
Ef þetta er eitthvað sem endurspeglar raunveruleikann gæti (ef við miðum við fyrri rannsóknir) hámarks restorative umhverfi samanstaðið af hátíðnieiginleikum urban umhverfis en lágtíðnieiginleikum náttúrulegs umhverfis (Þ.e. umhverfið hefur litapalettu og dreifingu náttúru en einfaldleika borgar). Þetta er spennandi pæling og býður upp á frekari rannsóknir.
þetta myndrit sýnir loess nálgun á svartíma (rautt og vinstri y-ás) og hlutfalli réttra svara (blátt og hægri y-ás) sem fall af tíma, s.s. nr talnaverkefnisstaks á skalanum 1-270 3 = 1-810*.
cap <- "Svarhegðun hópa sem fall af tíma (tímaeining = ýta á bilstöng einu sinni)"
acc_dat <- df %>%
filter(block > 0) %>%
mutate(trial = trial + 270 * (block - 1)) %>%
filter(number == "3") %>%
select(-response, -prev, -resp_rt, -aldur, -kyn)
rt_dat <- df %>%
mutate(type1 = str_match(type, "([a-zA-Z]+)-")[,2],
type2 = str_match(type, "-([a-zA-Z]+)")[,2]) %>%
filter(block > 0) %>%
mutate(trial = trial + 270 * (block - 1)) %>%
na.omit %>%
mutate(id = as.character(id))
#### Measure by group ####
rt_dat %>%
ggplot() +
geom_ribbon(aes(fill = cut(trial, breaks = c(-Inf, 270, 540, Inf)),
x = trial, ymin = 0.2, ymax = 0.5), alpha = 0.1) +
# Accuracy plots
geom_smooth(data = acc_dat %>% filter(trial <= 270),
method = "loess",
aes(trial, resp_acc/1.8, col = "2"),
se = F, span = 0.3) +
geom_smooth(data = acc_dat %>% filter(trial > 270, trial <= 540),
method = "loess",
aes(trial, resp_acc/1.8, col = "2"),
se = F, span = 0.3) +
geom_smooth(data = acc_dat %>% filter(trial > 540),
method = "loess",
aes(trial, resp_acc/1.8, col = "2"),
se = F, span = 0.3) +
# RT plots
geom_smooth(data = rt_dat %>% filter(trial <= 270),
method = "loess",
aes(trial, resp_rt, col = "1"),
se = F, span = 0.3) +
geom_smooth(data = rt_dat %>% filter(trial > 270, trial <= 540),
method = "loess",
aes(trial, resp_rt, col = "1"),
se = F, span = 0.3) +
geom_smooth(data = rt_dat %>% filter(trial > 540),
method = "loess",
aes(trial, resp_rt, col = "1"),
se = F, span = 0.3) +
geom_rug(data = acc_dat, aes(trial), alpha = 0.05) +
facet_grid(type ~ filt, labeller = labeller(filt = c(hi = "High Spatial Frequency",
lo = "Low Spatial Frequency"),
type = c("nature-urban" = "Nature then Urban",
"urban-nature" = "Urban then Nature"))) +
scale_x_continuous(breaks = c(0, 270, 540, 810),
labels = c("Start", "Photos", "Photos", "End")) +
scale_y_continuous(sec.axis = sec_axis(~ . * 1.8, name = "")) +
scale_color_manual(name = "Measure",
values = c("#d95f02",
"#7570b3"),
labels = c("Reaction Time\n (Left Axis)",
" Accuracy\n(Right Axis) ")) +
guides(color = guide_legend(title = "Measure",
title.position = "top",
title.hjust = 0.5),
fill = F) +
theme(panel.border = element_rect(fill = NA, linetype = 2),
panel.grid.major.y = element_line(linetype = 1, size = 0.05),
panel.grid.major.x = element_line(linetype = 3, size = 0.1),
strip.background = element_rect(fill = c("gray97"), linetype = 0),
strip.text = element_text(size = 12, margin = c(0, 0, 0, 0, "cm")),
legend.text = element_text(size = 12),
legend.position = "top") +
labs(x = "", y = "")
Svarhegðun hópa sem fall af tíma (tímaeining = ýta á bilstöng einu sinni)