Load data and function
data <- readr::read_csv("twitter-exp2-long.csv", col_names = TRUE)
## Rows: 30240 Columns: 28
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (15): RecordedDate, ID, Read1, why_judge, gender, race, social_media_use...
## dbl (12): Progress, Duration (in seconds), Read2, age, Item, Judgment_Time, ...
## lgl (1): Validity
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
stdCoef.merMod <- function(object) {
sdy <- sd(getME(object,"y"))
sdx <- apply(getME(object,"X"), 2, sd)
sc <- fixef(object)*sdx/sdy
se.fixef <- coef(summary(object))[,"Std. Error"]
se <- se.fixef*sdx/sdy
return(data.frame(stdcoef=sc, stdse=se))
}
Incorrect lure and correct answer descriptive stats for table summaries
summary <- data %>%
group_by(ID,Validity,Difficulty,Judgment) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Judgment, Validity, Difficulty) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
)
## `summarise()` has grouped output by 'ID', 'Validity', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Judgment', 'Validity'. You can override
## using the `.groups` argument.
print(summary)
## # A tibble: 12 × 9
## # Groups: Judgment, Validity [6]
## Judgment Validity Difficulty mean_err sd_err se_error mean_corr sd_corr
## <chr> <lgl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Accuracy FALSE Easy 0.0643 0.0766 0.00648 0.780 0.197
## 2 Accuracy FALSE Hard 0.121 0.104 0.00881 0.252 0.229
## 3 Accuracy TRUE Easy 0.0115 0.0271 0.00229 0.877 0.203
## 4 Accuracy TRUE Hard 0.0270 0.0349 0.00295 0.395 0.274
## 5 Interest FALSE Easy 0.105 0.111 0.00939 0.746 0.223
## 6 Interest FALSE Hard 0.138 0.110 0.00933 0.306 0.256
## 7 Interest TRUE Easy 0.0183 0.0439 0.00371 0.866 0.180
## 8 Interest TRUE Hard 0.0290 0.0336 0.00284 0.417 0.288
## 9 Like FALSE Easy 0.0948 0.117 0.00991 0.747 0.203
## 10 Like FALSE Hard 0.125 0.117 0.00991 0.275 0.278
## 11 Like TRUE Easy 0.0135 0.0289 0.00245 0.884 0.145
## 12 Like TRUE Hard 0.0266 0.0336 0.00284 0.396 0.291
## # … with 1 more variable: se_corr <dbl>
data %>%
filter(Validity == "FALSE") %>%
group_by(ID,Validity,Difficulty,Judgment) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Judgment,Difficulty) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
)
## `summarise()` has grouped output by 'ID', 'Validity', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Judgment'. You can override using the
## `.groups` argument.
## # A tibble: 6 × 8
## # Groups: Judgment [3]
## Judgment Difficulty mean_err sd_err se_error mean_corr sd_corr se_corr
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Accuracy Easy 0.0643 0.0766 0.00648 0.780 0.197 0.0167
## 2 Accuracy Hard 0.121 0.104 0.00881 0.252 0.229 0.0194
## 3 Interest Easy 0.105 0.111 0.00939 0.746 0.223 0.0188
## 4 Interest Hard 0.138 0.110 0.00933 0.306 0.256 0.0216
## 5 Like Easy 0.0948 0.117 0.00991 0.747 0.203 0.0172
## 6 Like Hard 0.125 0.117 0.00991 0.275 0.278 0.0235
# supplemental material, response count
data %>%
count(Difficulty,Response) %>%
summarise(
Difficulty = Difficulty,
Response = Response,
n = n,
prop = n/15120
)
## # A tibble: 8 × 4
## Difficulty Response n prop
## <chr> <chr> <int> <dbl>
## 1 Easy Correct 12348 0.817
## 2 Easy Incorrect-Lure 775 0.0513
## 3 Easy Incorrect-Other 484 0.0320
## 4 Easy Unsure 1513 0.100
## 5 Hard Correct 5143 0.340
## 6 Hard Incorrect-Lure 1175 0.0777
## 7 Hard Incorrect-Other 2038 0.135
## 8 Hard Unsure 6764 0.447
Models to analyze incorrect lure responses
# differences by Tweet accuracy
modelerror1 <- data %>%
mutate(Validity = ifelse(Validity == "TRUE",-.5,.5)) %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",-.5,.5)) %>%
glmer(Error ~ Difficulty*Validity + (1 + Difficulty + Validity | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
## boundary (singular) fit: see help('isSingular')
summary(modelerror1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Error ~ Difficulty * Validity + (1 + Difficulty + Validity |
## ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 11000.8 11092.3 -5489.4 10978.8 30229
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.4443 -0.2282 -0.1318 -0.0701 16.0884
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.4695 0.6852
## Difficulty 0.5689 0.7543 -0.17
## Validity 0.3561 0.5968 0.89 0.30
## Item (Intercept) 1.5847 1.2588
## Number of obs: 30240, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.89406 0.16048 -24.266 <2e-16 ***
## Difficulty 0.40238 0.31531 1.276 0.202
## Validity 1.85659 0.08236 22.543 <2e-16 ***
## Difficulty:Validity -0.24633 0.15303 -1.610 0.107
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt Valdty
## Difficulty -0.019
## Validity -0.088 0.078
## Dffclty:Vld 0.073 -0.175 -0.305
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
emmeans(modelerror1, ~ Difficulty*Validity) %>%
pairs(., simple = "Validity", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 1.98 0.1284 Inf 15.419 <.0001
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 1.73 0.0938 Inf 18.490 <.0001
##
## Results are given on the log odds ratio (not the response) scale.
# contrast accuracy < interest + like
modelerror2.1 <- data %>%
filter(Validity == "FALSE") %>%
mutate(acc_v_intlik = case_when(
Judgment == "Interest" ~ 1,
Judgment == "Like" ~ 1,
Judgment == "Accuracy" ~ -2
)) %>%
mutate(int_vs_like = case_when(
Judgment == "Interest" ~ 1,
Judgment == "Like" ~ -1,
Judgment == "Accuracy" ~ 0
)) %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",-.5,.5)) %>%
glmer(Error ~ Difficulty*acc_v_intlik + Difficulty*int_vs_like + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(modelerror2.1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Error ~ Difficulty * acc_v_intlik + Difficulty * int_vs_like +
## (1 + Difficulty | ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 8724.8 8801.0 -4352.4 8704.8 15110
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.7843 -0.3287 -0.2078 -0.1308 8.7444
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.7829 0.8848
## Difficulty 0.4599 0.6782 -0.03
## Item (Intercept) 1.3139 1.1462
## Number of obs: 15120, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.86650 0.14882 -19.261 < 2e-16 ***
## Difficulty 0.30872 0.28576 1.080 0.27999
## acc_v_intlik 0.10902 0.03806 2.864 0.00418 **
## int_vs_like 0.11606 0.06451 1.799 0.07200 .
## Difficulty:acc_v_intlik -0.14965 0.04956 -3.019 0.00253 **
## Difficulty:int_vs_like -0.04831 0.08167 -0.591 0.55420
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt acc_v_ int_v_ Dffclty:c__
## Difficulty -0.002
## acc_v_intlk -0.017 0.014
## int_vs_like -0.013 0.005 -0.010
## Dffclty:c__ 0.020 -0.024 -0.117 0.003
## Dffclty:n__ 0.009 -0.019 0.003 -0.067 -0.020
# test of simple effects
emmeans(modelerror2.1, ~ Difficulty*acc_v_intlik) %>%
pairs(., simple = "acc_v_intlik", reverse = FALSE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## (-2) - 1 -0.552 0.143 Inf -3.847 0.0001
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## (-2) - 1 -0.103 0.129 Inf -0.797 0.4257
##
## Results are given on the log odds ratio (not the response) scale.
# standardized beta and se
stdCoef.merMod(modelerror1)
## stdcoef stdse
## (Intercept) 0.0000000 0.0000000
## Difficulty 0.8191377 0.6418852
## Validity 3.7794960 0.1676564
## Difficulty:Validity -0.2507245 0.1557621
stdCoef.merMod(modelerror2.1)
## stdcoef stdse
## (Intercept) 0.00000000 0.0000000
## Difficulty 0.49732640 0.4603394
## acc_v_intlik 0.49671881 0.1734242
## int_vs_like 0.30531467 0.1697018
## Difficulty:acc_v_intlik -0.34093391 0.1129149
## Difficulty:int_vs_like -0.06353602 0.1074191
Models to analyze correct answer responses
# differences by Tweet accuracy
modelcorrect1 <- data %>%
mutate(Validity = ifelse(Validity == "TRUE",.5,-.5)) %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",.5,-.5)) %>%
glmer(Correct ~ Difficulty*Validity + (1 + Difficulty + Validity | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(modelcorrect1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Correct ~ Difficulty * Validity + (1 + Difficulty + Validity |
## ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 26318.6 26410.1 -13148.3 26296.6 30229
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -8.4349 -0.4371 0.1731 0.4475 8.6800
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 1.7827 1.3352
## Difficulty 1.2811 1.1319 -0.28
## Validity 0.4494 0.6703 0.26 0.33
## Item (Intercept) 0.4996 0.7069
## Number of obs: 30240, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.54223 0.10778 5.031 4.88e-07 ***
## Difficulty 3.16250 0.18028 17.542 < 2e-16 ***
## Validity 1.04469 0.04825 21.651 < 2e-16 ***
## Difficulty:Validity 0.37708 0.07617 4.951 7.40e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt Valdty
## Difficulty -0.041
## Validity 0.130 0.116
## Dffclty:Vld 0.057 0.038 0.157
# contrast accuracy > interest + like
modelcorrect2.1 <- data %>%
filter(Validity == "FALSE") %>%
mutate(acc_v_intlik = case_when(
Judgment == "Interest" ~ -2,
Judgment == "Like" ~ -1,
Judgment == "Accuracy" ~ -1
)) %>%
mutate(int_vs_like = case_when(
Judgment == "Interest" ~ 0,
Judgment == "Like" ~ -1,
Judgment == "Accuracy" ~ 1
)) %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",.5,-.5)) %>%
glmer(Correct ~ Difficulty*acc_v_intlik + Difficulty*int_vs_like + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(modelcorrect2.1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Correct ~ Difficulty * acc_v_intlik + Difficulty * int_vs_like +
## (1 + Difficulty | ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 14187.5 14263.7 -7083.7 14167.5 15110
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -6.6378 -0.4600 0.1762 0.4903 6.0783
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 1.7716 1.3310
## Difficulty 1.3939 1.1806 -0.43
## Item (Intercept) 0.5052 0.7108
## Number of obs: 15120, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.07469 0.22477 -0.332 0.73965
## Difficulty 3.69041 0.28420 12.985 < 2e-16 ***
## acc_v_intlik -0.05381 0.14671 -0.367 0.71376
## int_vs_like 0.03231 0.08496 0.380 0.70375
## Difficulty:acc_v_intlik 0.48061 0.15952 3.013 0.00259 **
## Difficulty:int_vs_like 0.10743 0.09357 1.148 0.25093
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt acc_v_ int_v_ Dffclty:c__
## Difficulty -0.243
## acc_v_intlk 0.873 -0.245
## int_vs_like -0.002 0.007 -0.001
## Dffclty:c__ -0.285 0.758 -0.325 0.005
## Dffclty:n__ 0.007 -0.007 0.005 -0.328 -0.005
# test of simple effects
emmeans(modelcorrect1, ~ Difficulty * Validity) %>%
pairs(., simple = "Validity", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 0.856 0.0566 Inf 15.130 <.0001
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 1.233 0.0660 Inf 18.687 <.0001
##
## Results are given on the log odds ratio (not the response) scale.
emmeans(modelcorrect2.1, ~ Difficulty * acc_v_intlik) %>%
pairs(., simple = "acc_v_intlik", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## (-1) - (-2) -0.294 0.188 Inf -1.561 0.1185
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## (-1) - (-2) 0.186 0.142 Inf 1.310 0.1903
##
## Results are given on the log odds ratio (not the response) scale.
Graph of incorrect lure responses by tweet accuracy
Twitter_Exp2_Figure1 <- summary %>%
filter(Validity == "FALSE") %>%
group_by(Difficulty, Judgment) %>%
ggplot(.) + aes(x = reorder(Difficulty, mean_err), y = mean_err, fill = reorder(Judgment, -mean_err)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Tweet Difficulty") + ylab("Proportion Lure Reported") + labs(fill = "Judgment Type") +
theme_classic() +
geom_errorbar(aes(ymin= mean_err - se_error, ymax= mean_err + se_error), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_err,digits=2)), position=position_dodge(width=.9), vjust=4) + scale_fill_manual(values=c("#f0f0f0","#bdbdbd","#636363"))
## Warning: Ignoring unknown parameters: fun.y
print(Twitter_Exp2_Figure1)
## No summary function supplied, defaulting to `mean_se()`
ggsave(Twitter_Exp2_Figure1, file="Twitter-Exp2-Error.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
Graph of correct answer responses by tweet accuracy
Twitter_Exp2_Figure2 <- summary %>%
filter(Validity == "FALSE") %>%
group_by(Difficulty, Judgment) %>%
ggplot(.) + aes(x = reorder(Difficulty, -mean_corr), y = mean_corr, fill = reorder(Judgment, -mean_err)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Tweet Difficulty") + ylab("Proportion Correct Answer Reported") + labs(fill = "Judgment Type") + theme_classic() +
geom_errorbar(aes(ymin= mean_corr - se_corr, ymax= mean_corr + se_corr), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_corr,digits=2)), position=position_dodge(width=.9), vjust=3) + scale_fill_manual(values=c("#f0f0f0","#bdbdbd","#636363"))
## Warning: Ignoring unknown parameters: fun.y
print(Twitter_Exp2_Figure2)
## No summary function supplied, defaulting to `mean_se()`
ggsave(Twitter_Exp2_Figure2, file="Twitter-Exp2-Correct.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
Exploratory analysis: Does accuracy, interest, or like judgment at exposure predict reproduction of that information at test?
# accuracy mindset
accuracy_reproduce <- data %>%
mutate(reproduce_info = case_when(
Validity == "TRUE" & Response == "Correct" ~ 1,
Validity == "FALSE" & Response == "Error" ~ 1,
TRUE ~ 0
)) %>%
filter(Judgment == "Accuracy") %>%
glmer(reproduce_info ~ Judgment_Response + (1 + Judgment_Response | ID) + (1 + Judgment_Response| Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
## boundary (singular) fit: see help('isSingular')
summary(accuracy_reproduce)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: reproduce_info ~ Judgment_Response + (1 + Judgment_Response |
## ID) + (1 + Judgment_Response | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 9432.2 9490.0 -4708.1 9416.2 10072
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -4.2959 -0.4997 -0.2914 0.4600 8.9787
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.230581 0.48019
## Judgment_Response 0.001963 0.04431 1.00
## Item (Intercept) 6.758001 2.59962
## Judgment_Response 0.607352 0.77933 -0.95
## Number of obs: 10080, groups: ID, 140; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.86644 0.31879 -5.855 4.78e-09 ***
## Judgment_Response 0.23016 0.09424 2.442 0.0146 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Jdgmnt_Rspn -0.935
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
stdCoef.merMod(accuracy_reproduce)
## stdcoef stdse
## (Intercept) 0.00000 0.000000
## Judgment_Response 0.82257 0.336801
# interest mindset
interest_reproduce <- data %>%
mutate(reproduce_info = case_when(
Validity == "TRUE" & Response == "Correct" ~ 1,
Validity == "FALSE" & Response == "Error" ~ 1,
TRUE ~ 0
)) %>%
filter(Judgment == "Interest") %>%
glmer(reproduce_info ~ Judgment_Response + (1 + Judgment_Response| ID) + (1 + Judgment_Response| Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(interest_reproduce)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: reproduce_info ~ Judgment_Response + (1 + Judgment_Response |
## ID) + (1 + Judgment_Response | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 11894.6 11952.3 -5939.3 11878.6 10072
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.6328 -0.6739 -0.4650 1.0168 3.8314
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.139284 0.37321
## Judgment_Response 0.005982 0.07734 0.28
## Item (Intercept) 0.555082 0.74504
## Judgment_Response 0.024200 0.15556 -0.54
## Number of obs: 10080, groups: ID, 140; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.99056 0.11204 -8.841 <2e-16 ***
## Judgment_Response 0.04557 0.02833 1.609 0.108
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Jdgmnt_Rspn -0.626
# social media mindset
like_reproduce <- data %>%
mutate(reproduce_info = case_when(
Validity == "TRUE" & Response == "Correct" ~ 1,
Validity == "FALSE" & Response == "Error" ~ 1,
TRUE ~ 0
)) %>%
filter(Judgment == "Like") %>%
glmer(reproduce_info ~ Judgment_Response + (1 + Judgment_Response| ID) + (1 + Judgment_Response| Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(like_reproduce)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: reproduce_info ~ Judgment_Response + (1 + Judgment_Response |
## ID) + (1 + Judgment_Response | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 11666.2 11723.9 -5825.1 11650.2 10072
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.6448 -0.6581 -0.4424 0.9183 5.3068
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.14684 0.3832
## Judgment_Response 0.02117 0.1455 -0.36
## Item (Intercept) 0.84442 0.9189
## Judgment_Response 0.09458 0.3075 -0.71
## Number of obs: 10080, groups: ID, 140; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.03745 0.12632 -8.213 <2e-16 ***
## Judgment_Response 0.05957 0.04322 1.378 0.168
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr)
## Jdgmnt_Rspn -0.720
Exploratory analysis: Are there differences in time taken to judge tweets between judgment groups?
# table of descriptive stats of response time
time_summary <- data %>%
group_by(Judgment) %>%
summarise(
mean_judge_time = mean(Judgment_Time),
sd_judge_time = sd(Judgment_Time),
mean_test_time = mean(Test_Time),
sd_test_time = sd(Test_Time)
)
print(time_summary)
## # A tibble: 3 × 5
## Judgment mean_judge_time sd_judge_time mean_test_time sd_test_time
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Accuracy 11.6 22.8 9.06 19.1
## 2 Interest 9.07 20.6 10.3 19.5
## 3 Like 9.90 26.5 9.54 16.0
# exposure judgment time
exposure_time_model <- data %>%
lmer(Judgment_Time ~ Judgment + (1 | ID) + (1 + Judgment | Item),., control = lmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
## boundary (singular) fit: see help('isSingular')
## Warning: Model failed to converge with 1 negative eigenvalue: -2.4e-01
summary(exposure_time_model)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Judgment_Time ~ Judgment + (1 | ID) + (1 + Judgment | Item)
## Data: .
## Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## REML criterion at convergence: 275656.2
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.802 -0.183 -0.087 0.000 62.067
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 26.3503 5.1333
## Item (Intercept) 3.6208 1.9028
## JudgmentInterest 0.4054 0.6367 -1.00
## JudgmentLike 2.7322 1.6530 -0.64 0.64
## Residual 519.8289 22.7998
## Number of obs: 30240, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 11.5845 0.5386 296.1099 21.509 < 2e-16 ***
## JudgmentInterest -2.5108 0.6966 404.5787 -3.605 0.000352 ***
## JudgmentLike -1.6856 0.7194 314.5378 -2.343 0.019748 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) JdgmnI
## JdgmntIntrs -0.684
## JudgmentLik -0.691 0.497
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
stdCoef.merMod(exposure_time_model)
## stdcoef stdse
## (Intercept) 0.00000000 0.00000000
## JudgmentInterest -0.05049117 0.01400776
## JudgmentLike -0.03389673 0.01446673
# test answer time
test_time_model <- data %>%
lmer(Test_Time ~ Judgment + (1 | ID) + (1 + Judgment| Item),., control = lmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
## boundary (singular) fit: see help('isSingular')
summary(test_time_model)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: Test_Time ~ Judgment + (1 | ID) + (1 + Judgment | Item)
## Data: .
## Control: lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## REML criterion at convergence: 260028.9
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.391 -0.216 -0.104 0.036 77.251
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 23.5548 4.8533
## Item (Intercept) 1.6397 1.2805
## JudgmentInterest 1.1208 1.0587 0.52
## JudgmentLike 0.0233 0.1526 -0.93 -0.16
## Residual 308.4212 17.5619
## Number of obs: 30240, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 9.0605 0.4708 373.6583 19.246 <2e-16 ***
## JudgmentInterest 1.2101 0.6429 374.3136 1.882 0.0606 .
## JudgmentLike 0.4776 0.6309 415.9126 0.757 0.4494
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) JdgmnI
## JdgmntIntrs -0.625
## JudgmentLik -0.678 0.489
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
Coding of accuracy focus mentioned in open-response text of judgment strategies
# proportion of individuals who mention taking accuracy into account in their judgments (by judgment condition)
Twitter_Exp2_Figure3 <- data %>%
group_by(Judgment) %>%
summarise(
prop = sum(mentions_accuracy == 1)/n()
) %>%
ggplot(.) + aes(x = reorder(Judgment, -prop), y = prop, fill = reorder(Judgment, -prop)) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") + ylab("Proportion Mention Accuracy as Judgment Strategy") + labs(fill = "Requested Judgment at Exposure") + theme_classic() + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank(), legend.position = "bottom") + geom_text(aes(label=round(prop,digits=2)), position=position_dodge(width=.9), vjust=3) + scale_fill_manual(values=c("#636363","#bdbdbd","#f0f0f0"))
## Warning: Ignoring unknown parameters: fun.y
ggsave(Twitter_Exp2_Figure3, file="Twitter-Exp3-OR.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
# prop incorrect and correct answers based on mentioning they took accuracy into account in their judgments (by judgment condition)
data %>%
filter(Validity == "FALSE") %>%
group_by(ID,Judgment,Difficulty,mentions_accuracy) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Judgment,Difficulty, mentions_accuracy) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
)
## `summarise()` has grouped output by 'ID', 'Judgment', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Judgment', 'Difficulty'. You can override
## using the `.groups` argument.
## # A tibble: 12 × 9
## # Groups: Judgment, Difficulty [6]
## Judgment Difficulty mentions_accuracy mean_err sd_err se_error mean_corr
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Accuracy Easy 0 0.0660 0.0866 0.0216 0.601
## 2 Accuracy Easy 1 0.0641 0.0757 0.00679 0.803
## 3 Accuracy Hard 0 0.0694 0.0772 0.0193 0.240
## 4 Accuracy Hard 1 0.128 0.106 0.00948 0.254
## 5 Interest Easy 0 0.125 0.123 0.0127 0.696
## 6 Interest Easy 1 0.0652 0.0666 0.00981 0.848
## 7 Interest Hard 0 0.129 0.101 0.0104 0.268
## 8 Interest Hard 1 0.156 0.126 0.0186 0.382
## 9 Like Easy 0 0.126 0.133 0.0145 0.667
## 10 Like Easy 1 0.0486 0.0671 0.00896 0.867
## 11 Like Hard 0 0.124 0.126 0.0137 0.203
## 12 Like Hard 1 0.126 0.105 0.0140 0.383
## # … with 2 more variables: sd_corr <dbl>, se_corr <dbl>
qualitative_error <- data %>%
filter(Validity == "FALSE") %>%
group_by(ID,Judgment,Difficulty,mentions_accuracy) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Difficulty, mentions_accuracy) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1, "Yes","No")) %>%
ggplot(.) + aes(x = Difficulty, y = mean_err, fill = mentions_accuracy) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Tweet Difficulty") + ylab("Proportion Lure Reported") + labs(fill = "Self-Reported Conisderation of Accuracy") + theme_classic() + theme(legend.position = "bottom") + geom_errorbar(aes(ymin= mean_err - se_error, ymax= mean_err + se_error), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_err,digits=2)), position=position_dodge(width=.9), vjust=4) + scale_fill_manual(values=c("#f0f0f0","#636363"))
## `summarise()` has grouped output by 'ID', 'Judgment', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Difficulty'. You can override using the
## `.groups` argument.
## Warning: Ignoring unknown parameters: fun.y
ggsave(qualitative_error, file="Twitter-Exp3-Qual-Error.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
qualitative_correct <- data %>%
filter(Validity == "FALSE") %>%
group_by(ID,Judgment,Difficulty,mentions_accuracy) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Difficulty, mentions_accuracy) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1, "Yes","No")) %>%
ggplot(.) + aes(x = Difficulty, y = mean_corr, fill = mentions_accuracy) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Tweet Difficulty") + ylab("Proportion Lure Reported") + labs(fill = "Self-Reported Conisderation of Accuracy") + theme_classic() + theme(legend.position = "bottom") + geom_errorbar(aes(ymin= mean_corr - se_corr, ymax= mean_corr + se_corr), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_corr,digits=2)), position=position_dodge(width=.9), vjust=4) + scale_fill_manual(values=c("#f0f0f0","#636363"))
## `summarise()` has grouped output by 'ID', 'Judgment', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Difficulty'. You can override using the
## `.groups` argument.
## Warning: Ignoring unknown parameters: fun.y
ggsave(qualitative_correct, file="Twitter-Exp3-Qual-Correct.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
# graph after non-evaluative judgments only
qualitative_error2 <- data %>%
filter(Validity == "FALSE") %>%
filter(Judgment != "Accuracy") %>%
group_by(ID,Judgment,Difficulty,mentions_accuracy) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Judgment,Difficulty, mentions_accuracy) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1, "Yes","No")) %>%
ggplot(.) + aes(x = Judgment, y = mean_err, fill = mentions_accuracy) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Judgment Type") + ylab("Proportion Lure Reported") + labs(fill = "Self-Reported Consideration of Accuracy") +
theme_classic() + theme(legend.position = "bottom") + geom_errorbar(aes(ymin= mean_err - se_error, ymax= mean_err + se_error), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_err,digits=2)), position=position_dodge(width=.9), vjust=4) + facet_wrap(vars(Difficulty)) + scale_fill_manual(values=c("#f0f0f0","#636363"))
## `summarise()` has grouped output by 'ID', 'Judgment', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Judgment', 'Difficulty'. You can override
## using the `.groups` argument.
## Warning: Ignoring unknown parameters: fun.y
ggsave(qualitative_error2, file="Twitter-Exp3-Qual-Error2.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
## No summary function supplied, defaulting to `mean_se()`
qualitative_correct2 <- data %>%
filter(Validity == "FALSE") %>%
filter(Judgment != "Accuracy") %>%
group_by(ID,Judgment,Difficulty,mentions_accuracy) %>%
summarise(
mean_error = mean(Error,na.rm=TRUE),
mean_correct = mean(Correct, na.rm=TRUE)
) %>%
group_by(Judgment,Difficulty, mentions_accuracy) %>%
summarise(
mean_err = mean(mean_error),
sd_err = sd(mean_error),
se_error = sd(mean_error)/sqrt(n()),
mean_corr = mean(mean_correct),
sd_corr = sd(mean_correct),
se_corr = sd(mean_correct)/sqrt(n())
) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1, "Yes","No")) %>%
ggplot(.) + aes(x = Judgment, y = mean_corr, fill = mentions_accuracy) +
geom_bar(stat = "summary", fun.y = "mean", position = "dodge") +
xlab("Self-Reported Consideration of Accuracy") + ylab("Proportion Correct Answer Reported") + labs(fill = "Judgment Type") + theme_classic() + theme(legend.position = "bottom") + geom_errorbar(aes(ymin= mean_corr - se_corr, ymax= mean_corr + se_corr), position=position_dodge(width=0.9), width=.1) + geom_text(aes(label=round(mean_corr,digits=2)), position=position_dodge(width=.9), vjust=4) + facet_wrap(vars(Difficulty)) + scale_fill_manual(values=c("#f0f0f0","#636363"))
## `summarise()` has grouped output by 'ID', 'Judgment', 'Difficulty'. You can
## override using the `.groups` argument.
## `summarise()` has grouped output by 'Judgment', 'Difficulty'. You can override
## using the `.groups` argument.
## Warning: Ignoring unknown parameters: fun.y
ggsave(qualitative_correct2, file="Twitter-Exp3-Qual-Correct2.jpeg", width=8, height=4)
## No summary function supplied, defaulting to `mean_se()`
## No summary function supplied, defaulting to `mean_se()`
# contingency table and chi-square analyses
data %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 0, "no","yes")) %>%
count(ID,Judgment,mentions_accuracy) %>%
count(Judgment,mentions_accuracy) %>%
spread(mentions_accuracy,n)
## # A tibble: 3 × 3
## Judgment no yes
## <chr> <int> <int>
## 1 Accuracy 16 124
## 2 Interest 94 46
## 3 Like 84 56
contig_table <- matrix(c(16,94,84,124,46,56), ncol = 2)
dimnames(contig_table) <- list(judgment = c("Accuracy","Interest", "Like"),mentions_accuracy = c("Yes", "No"))
chisq.test(contig_table)
##
## Pearson's Chi-squared test
##
## data: contig_table
## X-squared = 103.53, df = 2, p-value < 2.2e-16
chisq.post.hoc(contig_table)
## Adjusted p-values used the fdr method.
## comparison raw.p adj.p
## 1 Accuracy vs. Interest 0.0000 0.0000
## 2 Accuracy vs. Like 0.0000 0.0000
## 3 Interest vs. Like 0.2637 0.2637
# do people who mention accuracy as a strategy reproduce fewer inaccuracies at test?
model_or_error1 <- data %>%
filter(Validity == "FALSE") %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",-.5,.5)) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1,-.5,.5)) %>%
glmer(Error ~ Difficulty*mentions_accuracy + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(model_or_error1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Error ~ Difficulty * mentions_accuracy + (1 + Difficulty | ID) +
## (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 8686.3 8747.3 -4335.2 8670.3 15112
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.8383 -0.3305 -0.2069 -0.1291 8.7045
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.7902 0.8889
## Difficulty 0.2983 0.5462 0.07
## Item (Intercept) 1.3017 1.1409
## Number of obs: 15120, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.8549 0.1484 -19.243 < 2e-16 ***
## Difficulty 0.2682 0.2839 0.944 0.3449
## mentions_accuracy 0.3082 0.1074 2.870 0.0041 **
## Difficulty:mentions_accuracy -0.9499 0.1307 -7.266 3.7e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt mntns_
## Difficulty 0.002
## mntns_ccrcy 0.009 0.028
## Dffclty:mn_ 0.040 -0.011 -0.055
emmeans(model_or_error1, ~ Difficulty*mentions_accuracy) %>%
pairs(., simple = "mentions_accuracy", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 0.783 0.129 Inf 6.083 <.0001
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) -0.167 0.123 Inf -1.361 0.1736
##
## Results are given on the log odds ratio (not the response) scale.
model_or_error2 <- data %>%
filter(Validity == "FALSE") %>%
filter(Judgment != "Accuracy") %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",-.5,.5)) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1,-.5,.5)) %>%
glmer(Error ~ Difficulty*mentions_accuracy + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(model_or_error2)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Error ~ Difficulty * mentions_accuracy + (1 + Difficulty | ID) +
## (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 6081.9 6139.6 -3033.0 6065.9 10072
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.7178 -0.3389 -0.2148 -0.1296 7.7353
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 0.8205 0.9058
## Difficulty 0.2808 0.5299 0.15
## Item (Intercept) 1.3076 1.1435
## Number of obs: 10080, groups: ID, 280; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.8239 0.1563 -18.063 < 2e-16 ***
## Difficulty 0.2804 0.2919 0.961 0.33680
## mentions_accuracy 0.3699 0.1397 2.649 0.00808 **
## Difficulty:mentions_accuracy -1.0986 0.1692 -6.492 8.49e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt mntns_
## Difficulty 0.003
## mntns_ccrcy -0.147 0.043
## Dffclty:mn_ 0.061 -0.120 -0.069
stdCoef.merMod(model_or_error2)
## stdcoef stdse
## (Intercept) 0.0000000 0.0000000
## Difficulty 0.4384433 0.4564729
## mentions_accuracy 0.5568306 0.2102164
## Difficulty:mentions_accuracy -0.8590165 0.1323260
emmeans(model_or_error2, ~ Difficulty*mentions_accuracy) %>%
pairs(., simple = "mentions_accuracy", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 0.919 0.168 Inf 5.464 <.0001
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) -0.179 0.158 Inf -1.134 0.2570
##
## Results are given on the log odds ratio (not the response) scale.
# do people who mention accuracy as a strategy produce more correct answers at test?
model_or_correct1 <- data %>%
filter(Validity == "FALSE") %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",.5,-.5)) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1,.5,-.5)) %>%
glmer(Correct ~ Difficulty*mentions_accuracy + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(model_or_correct1)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Correct ~ Difficulty * mentions_accuracy + (1 + Difficulty |
## ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 14133.8 14194.8 -7058.9 14117.8 15112
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -6.6863 -0.4614 0.1744 0.4883 6.4469
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 1.6052 1.2669
## Difficulty 1.4038 1.1848 -0.50
## Item (Intercept) 0.5009 0.7077
## Number of obs: 15120, groups: ID, 420; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.03388 0.10752 -0.315 0.75267
## Difficulty 3.03146 0.18482 16.402 < 2e-16 ***
## mentions_accuracy 0.80640 0.13342 6.044 1.5e-09 ***
## Difficulty:mentions_accuracy 0.39640 0.15324 2.587 0.00969 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt mntns_
## Difficulty -0.103
## mntns_ccrcy -0.048 0.034
## Dffclty:mn_ 0.055 -0.032 -0.385
emmeans(model_or_correct1, ~ Difficulty*mentions_accuracy) %>%
pairs(., simple = "mentions_accuracy", reverse = TRUE)
## Difficulty = -0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 0.608 0.178 Inf 3.424 0.0006
##
## Difficulty = 0.5:
## contrast estimate SE df z.ratio p.value
## 0.5 - (-0.5) 1.005 0.126 Inf 7.993 <.0001
##
## Results are given on the log odds ratio (not the response) scale.
model_or_correct2 <- data %>%
filter(Validity == "FALSE") %>%
filter(Judgment != "Accuracy") %>%
mutate(Difficulty = ifelse(Difficulty == "Easy",.5,-.5)) %>%
mutate(mentions_accuracy = ifelse(mentions_accuracy == 1,.5,-.5)) %>%
glmer(Correct ~ Difficulty*mentions_accuracy + (1 + Difficulty | ID) + (1 | Item), ., family = binomial, control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e5)))
summary(model_or_correct2)
## Generalized linear mixed model fit by maximum likelihood (Laplace
## Approximation) [glmerMod]
## Family: binomial ( logit )
## Formula: Correct ~ Difficulty * mentions_accuracy + (1 + Difficulty |
## ID) + (1 | Item)
## Data: .
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e+05))
##
## AIC BIC logLik deviance df.resid
## 9565.5 9623.3 -4774.8 9549.5 10072
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -4.5804 -0.4773 0.1813 0.5019 7.2030
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## ID (Intercept) 1.6283 1.2760
## Difficulty 1.4138 1.1890 -0.55
## Item (Intercept) 0.4482 0.6695
## Number of obs: 10080, groups: ID, 280; Item, 72
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.1423 0.1170 1.216 0.224
## Difficulty 2.9258 0.1871 15.640 < 2e-16 ***
## mentions_accuracy 1.1388 0.1707 6.673 2.51e-11 ***
## Difficulty:mentions_accuracy 0.1254 0.1956 0.641 0.522
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Dffclt mntns_
## Difficulty -0.150
## mntns_ccrcy 0.197 -0.021
## Dffclty:mn_ -0.025 0.139 -0.392
Demographics (incl social media use)
# age
data %>%
summarise(mean(age))
## # A tibble: 1 × 1
## `mean(age)`
## <dbl>
## 1 39.5
# gender
data %>%
count(gender) %>%
mutate(n = n/72)
## # A tibble: 4 × 2
## gender n
## <chr> <dbl>
## 1 Female 192
## 2 Male 226
## 3 Non-binary/third gender 1
## 4 Prefer not to answer 1
# prop of sample who uses social media apps
data %>%
rename(social_use = social_media_use) %>%
mutate(use_twitter = ifelse(grepl("Twitter", social_use),1,0)) %>%
mutate(use_facebook = ifelse(grepl("Facebook", social_use),1,0)) %>%
mutate(use_reddit = ifelse(grepl("Reddit", social_use),1,0)) %>%
mutate(use_youtube = ifelse(grepl("Youtube", social_use),1,0)) %>%
mutate(use_snapchat = ifelse(grepl("Snapchat", social_use),1,0)) %>%
mutate(use_instagram = ifelse(grepl("Instagram", social_use),1,0)) %>%
mutate(use_pinterest = ifelse(grepl("Pinterest", social_use),1,0)) %>%
summarise(
across(use_twitter:use_pinterest, mean))
## # A tibble: 1 × 7
## use_twitter use_facebook use_reddit use_youtube use_snapchat use_instagram
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.698 0.743 0.638 0.871 0.207 0.643
## # … with 1 more variable: use_pinterest <dbl>
# avg number of different apps used
data %>%
mutate(social_use_num = as.numeric((str_count(social_media_use, ',') + 1))) %>%
summarise(mean(social_use_num))
## # A tibble: 1 × 1
## `mean(social_use_num)`
## <dbl>
## 1 4.15
# count number of hours spent on social per day
data %>%
count(use_social) %>%
mutate(n = n/72) %>%
arrange(n) %>%
mutate(prop = n/420)
## # A tibble: 9 × 3
## use_social n prop
## <chr> <dbl> <dbl>
## 1 5–6 hours per day 9 0.0214
## 2 More than 6 hours per day 9 0.0214
## 3 4–5 hours per day 16 0.0381
## 4 Less than 10 minutes per day 21 0.05
## 5 3–4 hours per day 34 0.0810
## 6 2–3 hours per day 60 0.143
## 7 10–30 minutes per day 68 0.162
## 8 31–60 minutes per day 88 0.210
## 9 1–2 hours per day 115 0.274