Prep

Load the following packages and data (download the data from the OSF link provided via email). If you need to install any packages, do so with the install.packages() function or the Packages tab in the lower-right window in RStudio.

We are setting the locale to “ko” for Korean, as some Korean transcriptions are included in the data file; this will only apply to the current R session.

library(tidyverse)
library(broom)
library(car)
library(sjPlot)
locale("ko")
<locale>
Numbers:  123,456.78
Formats:  %AD / %AT
Timezone: UTC
Encoding: UTF-8
<date_names>
Days:   일요일 (일), 월요일 (월), 화요일 (화), 수요일 (수), 목요일 (목), 금요일 (금), 토요일 (토)
Months: 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월
AM/PM:  오전/오후
#read compiled data
d <- read_tsv("comp_acc_correlate_data.tsv")
Rows: 198 Columns: 63── Column specification ───────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr  (5): Speaker, Gender, L1, transcript, trans_clean
dbl (58): EIT, Comprehensibility, Accentedness, SA_Comprehensibility, SA_Accentedness, Satisfaction, Value,...
ℹ 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.

Creating some useful labels

Names for variables we use for analyses don’t always look the prettiest when making plots or tables. This bit of code takes a manual approach to creating a set of ‘clean’ variable names that can be mapped on to our data. I recommend just copying and pasting this chunk of code.

# labels
speech_vars <- c("substitution_rate", "syllstr_error_rate", "pitch_CV", 
                 "inton_error_rate",
                 "gram_error_rate", "eojeol_per_clause", "clauses_per_ASunit",
                 "lex_error_rate", "R", "speech_rate", "sp_rate", 
                 "fp_rate", "repair_rate")

var_labels <- c("Substitution Rate", "Syllable Error Rate", "Pitch Variation (CV)",
                "Intonation Error Rate",
                "Morphosyntactic Error Rate", "Eojeol/clause", "Clauses/AS-unit",
                "Lexical Error Rate", "Guiraud's Index", "Speech Rate", "Silent Pause Rate",
                "Filled Pause Rate", "Repair Rate")

speech_var_tbl <- tibble(speech_vars, var_labels)

Regression Models for L2 Korean Comprehensibility

We’ll start with a very simple model - essentially a null, intercept only model.

cm0 <- lm(scale(Comprehensibility) ~ 1, data = d)

We can look at the results using the command summary(cm0). The plot(cm0) command will allow us to view diagnostic plots; it’s also a good idea to look at a histogram of the model residuals.

hist(resid(cm0))

These residuals look mostly normal, but left-skewed. Probably not a big problem; this really just reflects the mean falling above the midpoint of the possible score range, to an extent.

For this project, my colleagues and I had selected a number of variables that could influence listener perceptions of comprehensibility and/or accentedness, according to the literature (mostly on other languages/L2s). After looking at bivariate correlations, we focus on a model that includes all of our speech stream variables.

cm1_r <- lm(Comprehensibility ~ substitution_rate + syllstr_error_rate +
            pitch_CV + inton_error_rate + 
            gram_error_rate + eojeol_per_clause +
            clauses_per_ASunit + lex_error_rate + R + 
            speech_rate + sp_rate + fp_rate + repair_rate, data = d)

In the code below, I’m using the scale() function to standardize all variables. This produces standardized coefficients, which are more directly comparable.

cm1 <- lm(scale(Comprehensibility) ~ scale(substitution_rate) + scale(syllstr_error_rate) +
            scale(pitch_CV) + scale(inton_error_rate) + 
            scale(gram_error_rate) + scale(eojeol_per_clause) +
            scale(clauses_per_ASunit) + scale(lex_error_rate) + scale(R) + 
            scale(speech_rate) + scale(sp_rate) + scale(fp_rate) + scale(repair_rate), data = d)

Again, we can use summary() to quickly review results and plot() to check diagnostics for cm1. We can also take a look at the residuals:

hist(resid(cm1))

These residuals actually look a bit nicer!

We should also check the collinearity of predictor variables. We can do this by examining Variance Inflation Factors (VIF).

vif(cm1)
 scale(substitution_rate) scale(syllstr_error_rate)           scale(pitch_CV)   scale(inton_error_rate) 
                 1.573087                  1.218167                  1.083517                  1.436281 
   scale(gram_error_rate)  scale(eojeol_per_clause) scale(clauses_per_ASunit)     scale(lex_error_rate) 
                 1.165567                  1.374712                  1.196704                  1.245655 
                 scale(R)        scale(speech_rate)            scale(sp_rate)            scale(fp_rate) 
                 2.120915                  2.526126                  1.278925                  1.111976 
       scale(repair_rate) 
                 1.269782 

Values under 4 are good; so we’re in good shape.

The sjPlot package gives us some nice tools for formatting tables:

tab_model(cm1)
Warning: Argument 'df_method' is deprecated. Please use 'ci_method' instead.

Let’s do some plotting of this model to allow some visual comparisons. First, getting nicer variable names:

cm1_coefs <- tidy(cm1, conf.int = T) %>%
  filter(grepl("^scale*", term)) %>%
  mutate(speech_var = str_sub(term, start = 7L, end = -2L)) %>%
  left_join(speech_var_tbl, by = c("speech_var" = "speech_vars"))

And now a plot:

cm1_coefs %>% 
  ggplot(aes(x = reorder(var_labels, estimate), y = estimate))+
  geom_point(size = 5)+
  geom_errorbar(aes(ymin = conf.low, ymax = conf.high), width = .2)+
  geom_hline(yintercept = 0, linetype = 2)+
  scale_y_continuous(breaks = c(-.3, -.2, -.1, 0, .1, .2, .3, .4, .5))+
  labs(x = NULL, y = 'Standardized Estimate')+
  coord_flip()+
  theme_bw()+
  theme(axis.text = element_text(size = 18))

LS0tDQp0aXRsZTogIlFSREcgLSBEb2luZyBMaW5lYXIgUmVncmVzc2lvbiBpbiBSIg0KYXV0aG9yOiAiRGFuIElzYmVsbCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgUHJlcA0KDQpMb2FkIHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYW5kIGRhdGEgKGRvd25sb2FkIHRoZSBkYXRhIGZyb20gdGhlIE9TRiBsaW5rIHByb3ZpZGVkIHZpYSBlbWFpbCkuIElmIHlvdSBuZWVkIHRvIGluc3RhbGwgYW55IHBhY2thZ2VzLCBkbyBzbyB3aXRoIHRoZSBgaW5zdGFsbC5wYWNrYWdlcygpYCBmdW5jdGlvbiBvciB0aGUgKlBhY2thZ2VzKiB0YWIgaW4gdGhlIGxvd2VyLXJpZ2h0IHdpbmRvdyBpbiBSU3R1ZGlvLg0KDQpXZSBhcmUgc2V0dGluZyB0aGUgbG9jYWxlIHRvICJrbyIgZm9yIEtvcmVhbiwgYXMgc29tZSBLb3JlYW4gdHJhbnNjcmlwdGlvbnMgYXJlIGluY2x1ZGVkIGluIHRoZSBkYXRhIGZpbGU7IHRoaXMgd2lsbCBvbmx5IGFwcGx5IHRvIHRoZSBjdXJyZW50IFIgc2Vzc2lvbi4NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoc2pQbG90KQ0KbG9jYWxlKCJrbyIpDQoNCiNyZWFkIGNvbXBpbGVkIGRhdGENCmQgPC0gcmVhZF90c3YoImNvbXBfYWNjX2NvcnJlbGF0ZV9kYXRhLnRzdiIpDQpgYGANCg0KIyBDcmVhdGluZyBzb21lIHVzZWZ1bCBsYWJlbHMNCg0KTmFtZXMgZm9yIHZhcmlhYmxlcyB3ZSB1c2UgZm9yIGFuYWx5c2VzIGRvbid0IGFsd2F5cyBsb29rIHRoZSBwcmV0dGllc3Qgd2hlbiBtYWtpbmcgcGxvdHMgb3IgdGFibGVzLiBUaGlzIGJpdCBvZiBjb2RlIHRha2VzIGEgbWFudWFsIGFwcHJvYWNoIHRvIGNyZWF0aW5nIGEgc2V0IG9mICdjbGVhbicgdmFyaWFibGUgbmFtZXMgdGhhdCBjYW4gYmUgbWFwcGVkIG9uIHRvIG91ciBkYXRhLiBJIHJlY29tbWVuZCBqdXN0IGNvcHlpbmcgYW5kIHBhc3RpbmcgdGhpcyBjaHVuayBvZiBjb2RlLg0KDQpgYGB7cn0NCiMgbGFiZWxzDQpzcGVlY2hfdmFycyA8LSBjKCJzdWJzdGl0dXRpb25fcmF0ZSIsICJzeWxsc3RyX2Vycm9yX3JhdGUiLCAicGl0Y2hfQ1YiLCANCiAgICAgICAgICAgICAgICAgImludG9uX2Vycm9yX3JhdGUiLA0KICAgICAgICAgICAgICAgICAiZ3JhbV9lcnJvcl9yYXRlIiwgImVvamVvbF9wZXJfY2xhdXNlIiwgImNsYXVzZXNfcGVyX0FTdW5pdCIsDQogICAgICAgICAgICAgICAgICJsZXhfZXJyb3JfcmF0ZSIsICJSIiwgInNwZWVjaF9yYXRlIiwgInNwX3JhdGUiLCANCiAgICAgICAgICAgICAgICAgImZwX3JhdGUiLCAicmVwYWlyX3JhdGUiKQ0KDQp2YXJfbGFiZWxzIDwtIGMoIlN1YnN0aXR1dGlvbiBSYXRlIiwgIlN5bGxhYmxlIEVycm9yIFJhdGUiLCAiUGl0Y2ggVmFyaWF0aW9uIChDVikiLA0KICAgICAgICAgICAgICAgICJJbnRvbmF0aW9uIEVycm9yIFJhdGUiLA0KICAgICAgICAgICAgICAgICJNb3JwaG9zeW50YWN0aWMgRXJyb3IgUmF0ZSIsICJFb2plb2wvY2xhdXNlIiwgIkNsYXVzZXMvQVMtdW5pdCIsDQogICAgICAgICAgICAgICAgIkxleGljYWwgRXJyb3IgUmF0ZSIsICJHdWlyYXVkJ3MgSW5kZXgiLCAiU3BlZWNoIFJhdGUiLCAiU2lsZW50IFBhdXNlIFJhdGUiLA0KICAgICAgICAgICAgICAgICJGaWxsZWQgUGF1c2UgUmF0ZSIsICJSZXBhaXIgUmF0ZSIpDQoNCnNwZWVjaF92YXJfdGJsIDwtIHRpYmJsZShzcGVlY2hfdmFycywgdmFyX2xhYmVscykNCmBgYA0KDQojIFJlZ3Jlc3Npb24gTW9kZWxzIGZvciBMMiBLb3JlYW4gQ29tcHJlaGVuc2liaWxpdHkNCg0KV2UnbGwgc3RhcnQgd2l0aCBhIHZlcnkgc2ltcGxlIG1vZGVsIC0gZXNzZW50aWFsbHkgYSBudWxsLCBpbnRlcmNlcHQgb25seSBtb2RlbC4NCg0KYGBge3J9DQpjbTAgPC0gbG0oc2NhbGUoQ29tcHJlaGVuc2liaWxpdHkpIH4gMSwgZGF0YSA9IGQpDQpgYGANCg0KV2UgY2FuIGxvb2sgYXQgdGhlIHJlc3VsdHMgdXNpbmcgdGhlIGNvbW1hbmQgYHN1bW1hcnkoY20wKWAuIFRoZSBgcGxvdChjbTApYCBjb21tYW5kIHdpbGwgYWxsb3cgdXMgdG8gdmlldyBkaWFnbm9zdGljIHBsb3RzOyBpdCdzIGFsc28gYSBnb29kIGlkZWEgdG8gbG9vayBhdCBhIGhpc3RvZ3JhbSBvZiB0aGUgbW9kZWwgcmVzaWR1YWxzLg0KDQpgYGB7cn0NCmhpc3QocmVzaWQoY20wKSkNCmBgYA0KVGhlc2UgcmVzaWR1YWxzIGxvb2sgbW9zdGx5IG5vcm1hbCwgYnV0IGxlZnQtc2tld2VkLiBQcm9iYWJseSBub3QgYSBiaWcgcHJvYmxlbTsgdGhpcyByZWFsbHkganVzdCByZWZsZWN0cyB0aGUgbWVhbiBmYWxsaW5nIGFib3ZlIHRoZSBtaWRwb2ludCBvZiB0aGUgcG9zc2libGUgc2NvcmUgcmFuZ2UsIHRvIGFuIGV4dGVudC4NCg0KRm9yIHRoaXMgcHJvamVjdCwgbXkgY29sbGVhZ3VlcyBhbmQgSSBoYWQgc2VsZWN0ZWQgYSBudW1iZXIgb2YgdmFyaWFibGVzIHRoYXQgY291bGQgaW5mbHVlbmNlIGxpc3RlbmVyIHBlcmNlcHRpb25zIG9mIGNvbXByZWhlbnNpYmlsaXR5IGFuZC9vciBhY2NlbnRlZG5lc3MsIGFjY29yZGluZyB0byB0aGUgbGl0ZXJhdHVyZSAobW9zdGx5IG9uIG90aGVyIGxhbmd1YWdlcy9MMnMpLiBBZnRlciBsb29raW5nIGF0IGJpdmFyaWF0ZSBjb3JyZWxhdGlvbnMsIHdlIGZvY3VzIG9uIGEgbW9kZWwgdGhhdCBpbmNsdWRlcyBhbGwgb2Ygb3VyIHNwZWVjaCBzdHJlYW0gdmFyaWFibGVzLg0KDQpgYGB7cn0NCmNtMV9yIDwtIGxtKENvbXByZWhlbnNpYmlsaXR5IH4gc3Vic3RpdHV0aW9uX3JhdGUgKyBzeWxsc3RyX2Vycm9yX3JhdGUgKw0KICAgICAgICAgICAgcGl0Y2hfQ1YgKyBpbnRvbl9lcnJvcl9yYXRlICsgDQogICAgICAgICAgICBncmFtX2Vycm9yX3JhdGUgKyBlb2plb2xfcGVyX2NsYXVzZSArDQogICAgICAgICAgICBjbGF1c2VzX3Blcl9BU3VuaXQgKyBsZXhfZXJyb3JfcmF0ZSArIFIgKyANCiAgICAgICAgICAgIHNwZWVjaF9yYXRlICsgc3BfcmF0ZSArIGZwX3JhdGUgKyByZXBhaXJfcmF0ZSwgZGF0YSA9IGQpDQpgYGANCg0KDQpJbiB0aGUgY29kZSBiZWxvdywgSSdtIHVzaW5nIHRoZSBgc2NhbGUoKWAgZnVuY3Rpb24gdG8gc3RhbmRhcmRpemUgYWxsIHZhcmlhYmxlcy4gVGhpcyBwcm9kdWNlcyBzdGFuZGFyZGl6ZWQgY29lZmZpY2llbnRzLCB3aGljaCBhcmUgbW9yZSBkaXJlY3RseSBjb21wYXJhYmxlLg0KDQpgYGB7cn0NCmNtMSA8LSBsbShzY2FsZShDb21wcmVoZW5zaWJpbGl0eSkgfiBzY2FsZShzdWJzdGl0dXRpb25fcmF0ZSkgKyBzY2FsZShzeWxsc3RyX2Vycm9yX3JhdGUpICsNCiAgICAgICAgICAgIHNjYWxlKHBpdGNoX0NWKSArIHNjYWxlKGludG9uX2Vycm9yX3JhdGUpICsgDQogICAgICAgICAgICBzY2FsZShncmFtX2Vycm9yX3JhdGUpICsgc2NhbGUoZW9qZW9sX3Blcl9jbGF1c2UpICsNCiAgICAgICAgICAgIHNjYWxlKGNsYXVzZXNfcGVyX0FTdW5pdCkgKyBzY2FsZShsZXhfZXJyb3JfcmF0ZSkgKyBzY2FsZShSKSArIA0KICAgICAgICAgICAgc2NhbGUoc3BlZWNoX3JhdGUpICsgc2NhbGUoc3BfcmF0ZSkgKyBzY2FsZShmcF9yYXRlKSArIHNjYWxlKHJlcGFpcl9yYXRlKSwgZGF0YSA9IGQpDQpgYGANCg0KQWdhaW4sIHdlIGNhbiB1c2UgYHN1bW1hcnkoKWAgdG8gcXVpY2tseSByZXZpZXcgcmVzdWx0cyBhbmQgYHBsb3QoKWAgdG8gY2hlY2sgZGlhZ25vc3RpY3MgZm9yIGBjbTFgLiBXZSBjYW4gYWxzbyB0YWtlIGEgbG9vayBhdCB0aGUgcmVzaWR1YWxzOg0KDQpgYGB7cn0NCmhpc3QocmVzaWQoY20xKSkNCmBgYA0KVGhlc2UgcmVzaWR1YWxzIGFjdHVhbGx5IGxvb2sgYSBiaXQgbmljZXIhDQoNCldlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBjb2xsaW5lYXJpdHkgb2YgcHJlZGljdG9yIHZhcmlhYmxlcy4gV2UgY2FuIGRvIHRoaXMgYnkgZXhhbWluaW5nIFZhcmlhbmNlIEluZmxhdGlvbiBGYWN0b3JzIChWSUYpLg0KDQpgYGB7cn0NCnZpZihjbTEpDQpgYGANCg0KVmFsdWVzIHVuZGVyIDQgYXJlIGdvb2Q7IHNvIHdlJ3JlIGluIGdvb2Qgc2hhcGUuDQoNClRoZSBgc2pQbG90YCBwYWNrYWdlIGdpdmVzIHVzIHNvbWUgbmljZSB0b29scyBmb3IgZm9ybWF0dGluZyB0YWJsZXM6DQoNCmBgYHtyfQ0KdGFiX21vZGVsKGNtMSkNCmBgYA0KTGV0J3MgZG8gc29tZSBwbG90dGluZyBvZiB0aGlzIG1vZGVsIHRvIGFsbG93IHNvbWUgdmlzdWFsIGNvbXBhcmlzb25zLiBGaXJzdCwgZ2V0dGluZyBuaWNlciB2YXJpYWJsZSBuYW1lczoNCg0KYGBge3J9DQpjbTFfY29lZnMgPC0gdGlkeShjbTEsIGNvbmYuaW50ID0gVCkgJT4lDQogIGZpbHRlcihncmVwbCgiXnNjYWxlKiIsIHRlcm0pKSAlPiUNCiAgbXV0YXRlKHNwZWVjaF92YXIgPSBzdHJfc3ViKHRlcm0sIHN0YXJ0ID0gN0wsIGVuZCA9IC0yTCkpICU+JQ0KICBsZWZ0X2pvaW4oc3BlZWNoX3Zhcl90YmwsIGJ5ID0gYygic3BlZWNoX3ZhciIgPSAic3BlZWNoX3ZhcnMiKSkNCmBgYA0KDQpBbmQgbm93IGEgcGxvdDoNCg0KYGBge3J9DQpjbTFfY29lZnMgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHZhcl9sYWJlbHMsIGVzdGltYXRlKSwgeSA9IGVzdGltYXRlKSkrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDUpKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY29uZi5sb3csIHltYXggPSBjb25mLmhpZ2gpLCB3aWR0aCA9IC4yKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLS4zLCAtLjIsIC0uMSwgMCwgLjEsIC4yLCAuMywgLjQsIC41KSkrDQogIGxhYnMoeCA9IE5VTEwsIHkgPSAnU3RhbmRhcmRpemVkIEVzdGltYXRlJykrDQogIGNvb3JkX2ZsaXAoKSsNCiAgdGhlbWVfYncoKSsNCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpDQpgYGANCg0K