In this brief tutorial, we’ll review some basic R functions we’ve
learned and learn how to do some simple simulation of data.
library(tidyverse)
Let’s imagine a pretest-posttest design with an experimental and
control group. We’ll say that the treatment involves learning vocabulary
while reading with interactive glosses. The control group gets no
glosses.
Since we’re simulating, we can have lots of participants for free
(yay!). Let’s make a list of 100 participants.
ID <- 1:100
Now let’s put them into groups. First we’ll make the labels using the
rep() function and join them with c():
group <- c(rep("treatment", 50), rep("control", 50))
Now we’ll make a data frame with both variables together (a tibble,
actually):
d <- tibble(ID, group)
Let’s imagine that at the pretest, there’s really no systematic
difference between the two groups in their vocabulary knowledge. And for
simplicity’s sake, we’ll imagine that our vocabulary measure is a test
with 100 possible points. These are learners, so they shouldn’t have
extremely high scores to start out.
set.seed(2021) #use any number - this is just for reproducibility
d$pretest <- rnorm(100, m = 30, sd = 5)
Let’s take a look at the score distribution:
d %>% ggplot(aes(x=pretest))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()

Let’s see if the groups look any different:
d %>% ggplot(aes(x=pretest))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()+
facet_wrap(~group, nrow = 1)

And a numeric summary….
d %>% group_by(group) %>% summarise(mean = mean(pretest),
sd = sd(pretest),
range = range(pretest))
`summarise()` has grouped output by 'group'. You can override using the `.groups` argument.
Now we’ll generate a posttest score, but let’s imagine that the
treatment is quite effective - students reading with interactive glosses
learn a lot more vocabulary than those without.
d$posttest <- c((rnorm(50, m = 50, sd = 7)+7), rnorm(50, m = 50, sd = 7))
Now let’s take a look at the posttest histograms:
d %>% ggplot(aes(x=posttest))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()

d %>% ggplot(aes(x=posttest))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()+
facet_wrap(~group, nrow = 1)

d %>% group_by(group) %>% summarise(mean = mean(posttest),
sd = sd(posttest),
range = range(posttest))
`summarise()` has grouped output by 'group'. You can override using the `.groups` argument.
Let’s make this data tidy by putting it in long format:
d <- d %>% pivot_longer(pretest:posttest, names_to = "time", values_to = "vocab")
d <- d %>% mutate(time = factor(time, levels = c("pretest", "posttest")))
Take a look at the data - you should now see two rows per
participant. This will open up some neat plotting options for us.
d %>% ggplot(aes(x=vocab))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()+
facet_wrap(~group+time, nrow = 2)

Or this…
d %>% ggplot(aes(x=vocab, fill = time))+
geom_histogram(binwidth = 5)+
scale_x_continuous(limits = c(0, 100))+
theme_bw()+
facet_wrap(~group, nrow = 2)

And to summarize numerically:
d %>% group_by(group, time) %>% summarise(mean = mean(vocab),
sd = sd(vocab),
min = min(vocab),
max = max(vocab))
`summarise()` has grouped output by 'group'. You can override using the `.groups` argument.
LS0tDQp0aXRsZTogIlNpbXVsYXRpb24gUHJhY3RpY2UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpJbiB0aGlzIGJyaWVmIHR1dG9yaWFsLCB3ZSdsbCByZXZpZXcgc29tZSBiYXNpYyBSIGZ1bmN0aW9ucyB3ZSd2ZSBsZWFybmVkIGFuZCBsZWFybiBob3cgdG8gZG8gc29tZSBzaW1wbGUgc2ltdWxhdGlvbiBvZiBkYXRhLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCkxldCdzIGltYWdpbmUgYSBwcmV0ZXN0LXBvc3R0ZXN0IGRlc2lnbiB3aXRoIGFuIGV4cGVyaW1lbnRhbCBhbmQgY29udHJvbCBncm91cC4gV2UnbGwgc2F5IHRoYXQgdGhlIHRyZWF0bWVudCBpbnZvbHZlcyBsZWFybmluZyB2b2NhYnVsYXJ5IHdoaWxlIHJlYWRpbmcgd2l0aCBpbnRlcmFjdGl2ZSBnbG9zc2VzLiBUaGUgY29udHJvbCBncm91cCBnZXRzIG5vIGdsb3NzZXMuDQoNClNpbmNlIHdlJ3JlIHNpbXVsYXRpbmcsIHdlIGNhbiBoYXZlIGxvdHMgb2YgcGFydGljaXBhbnRzIGZvciBmcmVlICh5YXkhKS4gTGV0J3MgbWFrZSBhIGxpc3Qgb2YgMTAwIHBhcnRpY2lwYW50cy4NCg0KYGBge3IgZWNobz1UUlVFfQ0KSUQgPC0gMToxMDANCmBgYA0KDQpOb3cgbGV0J3MgcHV0IHRoZW0gaW50byBncm91cHMuIEZpcnN0IHdlJ2xsIG1ha2UgdGhlIGxhYmVscyB1c2luZyB0aGUgYHJlcCgpYCBmdW5jdGlvbiBhbmQgam9pbiB0aGVtIHdpdGggYGMoKWA6DQoNCmBgYHtyfQ0KZ3JvdXAgPC0gYyhyZXAoInRyZWF0bWVudCIsIDUwKSwgcmVwKCJjb250cm9sIiwgNTApKQ0KYGBgDQoNCk5vdyB3ZSdsbCBtYWtlIGEgZGF0YSBmcmFtZSB3aXRoIGJvdGggdmFyaWFibGVzIHRvZ2V0aGVyIChhIHRpYmJsZSwgYWN0dWFsbHkpOg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJ30NCmQgPC0gdGliYmxlKElELCBncm91cCkNCmBgYA0KDQpMZXQncyBpbWFnaW5lIHRoYXQgYXQgdGhlIHByZXRlc3QsIHRoZXJlJ3MgcmVhbGx5IG5vIHN5c3RlbWF0aWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzIGluIHRoZWlyIHZvY2FidWxhcnkga25vd2xlZGdlLiBBbmQgZm9yIHNpbXBsaWNpdHkncyBzYWtlLCB3ZSdsbCBpbWFnaW5lIHRoYXQgb3VyIHZvY2FidWxhcnkgbWVhc3VyZSBpcyBhIHRlc3Qgd2l0aCAxMDAgcG9zc2libGUgcG9pbnRzLiBUaGVzZSBhcmUgbGVhcm5lcnMsIHNvIHRoZXkgc2hvdWxkbid0IGhhdmUgZXh0cmVtZWx5IGhpZ2ggc2NvcmVzIHRvIHN0YXJ0IG91dC4NCg0KYGBge3J9DQpzZXQuc2VlZCgyMDIxKSAjdXNlIGFueSBudW1iZXIgLSB0aGlzIGlzIGp1c3QgZm9yIHJlcHJvZHVjaWJpbGl0eQ0KDQpkJHByZXRlc3QgPC0gcm5vcm0oMTAwLCBtID0gMzAsIHNkID0gNSkNCmBgYA0KDQpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgc2NvcmUgZGlzdHJpYnV0aW9uOg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeD1wcmV0ZXN0KSkrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCkpKw0KICB0aGVtZV9idygpDQpgYGANCg0KTGV0J3Mgc2VlIGlmIHRoZSBncm91cHMgbG9vayBhbnkgZGlmZmVyZW50Og0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeD1wcmV0ZXN0KSkrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCkpKw0KICB0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5ncm91cCwgbnJvdyA9IDEpDQpgYGANCg0KQW5kIGEgbnVtZXJpYyBzdW1tYXJ5Li4uLg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHByZXRlc3QpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZChwcmV0ZXN0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UocHJldGVzdCkpDQpgYGANCg0KTm93IHdlJ2xsIGdlbmVyYXRlIGEgcG9zdHRlc3Qgc2NvcmUsIGJ1dCBsZXQncyBpbWFnaW5lIHRoYXQgdGhlIHRyZWF0bWVudCBpcyBxdWl0ZSBlZmZlY3RpdmUgLSBzdHVkZW50cyByZWFkaW5nIHdpdGggaW50ZXJhY3RpdmUgZ2xvc3NlcyBsZWFybiBhIGxvdCBtb3JlIHZvY2FidWxhcnkgdGhhbiB0aG9zZSB3aXRob3V0Lg0KDQpgYGB7cn0NCmQkcG9zdHRlc3QgPC0gYygocm5vcm0oNTAsIG0gPSA1MCwgc2QgPSA3KSs3KSwgcm5vcm0oNTAsIG0gPSA1MCwgc2QgPSA3KSkNCmBgYA0KDQpOb3cgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHBvc3R0ZXN0IGhpc3RvZ3JhbXM6DQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4PXBvc3R0ZXN0KSkrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCkpKw0KICB0aGVtZV9idygpDQpgYGANCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHg9cG9zdHRlc3QpKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1KSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSkrDQogIHRoZW1lX2J3KCkrDQogIGZhY2V0X3dyYXAofmdyb3VwLCBucm93ID0gMSkNCmBgYA0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBvc3R0ZXN0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QocG9zdHRlc3QpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZShwb3N0dGVzdCkpDQpgYGANCg0KTGV0J3MgbWFrZSB0aGlzIGRhdGEgdGlkeSBieSBwdXR0aW5nIGl0IGluIGxvbmcgZm9ybWF0Og0KDQpgYGB7cn0NCmQgPC0gZCAlPiUgcGl2b3RfbG9uZ2VyKHByZXRlc3Q6cG9zdHRlc3QsIG5hbWVzX3RvID0gInRpbWUiLCB2YWx1ZXNfdG8gPSAidm9jYWIiKQ0KDQpkIDwtIGQgJT4lIG11dGF0ZSh0aW1lID0gZmFjdG9yKHRpbWUsIGxldmVscyA9IGMoInByZXRlc3QiLCAicG9zdHRlc3QiKSkpDQpgYGANCg0KVGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgLSB5b3Ugc2hvdWxkIG5vdyBzZWUgdHdvIHJvd3MgcGVyIHBhcnRpY2lwYW50LiBUaGlzIHdpbGwgb3BlbiB1cCBzb21lIG5lYXQgcGxvdHRpbmcgb3B0aW9ucyBmb3IgdXMuDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4PXZvY2FiKSkrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrDQogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCkpKw0KICB0aGVtZV9idygpKw0KICBmYWNldF93cmFwKH5ncm91cCt0aW1lLCBucm93ID0gMikNCmBgYA0KDQpPciB0aGlzLi4uDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4PXZvY2FiLCBmaWxsID0gdGltZSkpKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApKSsNCiAgdGhlbWVfYncoKSsNCiAgZmFjZXRfd3JhcCh+Z3JvdXAsIG5yb3cgPSAyKQ0KYGBgDQoNCkFuZCB0byBzdW1tYXJpemUgbnVtZXJpY2FsbHk6DQoNCmBgYHtyfQ0KZCAlPiUgZ3JvdXBfYnkoZ3JvdXAsIHRpbWUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4odm9jYWIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZCh2b2NhYiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4odm9jYWIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4KHZvY2FiKSkNCmBgYA0K