See on R-i kood, millega on analüüsitud kõnetempo ja soravuse andmeid Eesti Rakenduslingvistika Ühingu aastaraamatus ilmunud artikli tarvis.
library(tidyverse)
library(gridExtra)
teema <- theme_bw() +
theme(plot.title = element_text(hjust = 0.5, size = 12),
axis.text = element_text(size = 8),
axis.title = element_text(size = 8),
strip.text = element_text(size = 10),
legend.text = element_text(size = 10),
legend.title = element_text(size = 10))
Teke ja foneetikakorpuse andmestikus on andmed kogutud kõnevoorude kaupa (lokaalne kõnetempo). Artiklis analüüsime globaalset kõnetempot, selleks teisendame andmed nii, et ühelt kõnelejalt oleks üks rida ühe faili kohta. Samuti siin artiklis analüüsime ainult dialooge, nii et filtreerime välja failid, kus on rohkem kui kaks vestlejat. Siin
Koodiblokk mis, loeb teke andmed:
teke <- read.delim("teke_voorud.csv", encoding = "UTF-8")
teke$sugu <- toupper(teke$sugu)
# vastavalt faili kogukestusele
teke %>%
group_by(fail, koneleja) %>%
reframe(faili_kogukestus = (faili_kogukestus_ms/1000),
vanus = vanus,
sugu = sugu,
silpide_arv = sum(silpide_arv),
sonade_arv = sum(sõnade_arv),
poolikute_arv = sum(poolikute_arv),
venituste_arv = sum(venituste_arv),
korduste_arv =sum(korduste_arv),
disf_arv = sum(poolikute_arv+korduste_arv+venituste_arv),
kestus = sum((kestus_ms)/1000)) %>%
distinct() %>%
filter(!is.na(sugu), !is.na(vanus)) %>%
group_by(fail) %>%
mutate(prop = kestus/faili_kogukestus) %>%
ungroup() -> tmp
tmp <- data.frame(tmp,
kaaskoneleja = character(nrow(tmp)),
kaaskoneleja_sugu = character(nrow(tmp)),
kaaskoneleja_vanus = numeric(nrow(tmp)),
kaaskoneleja_kestus = numeric(nrow(tmp)),
kaaskoneleja_silpide_arv = numeric(nrow(tmp)),
kaaskoneleja_sonade_arv = numeric(nrow(tmp)),
kaaskoneleja_disf_arv = numeric(nrow(tmp)))
for(f in unique(tmp$fail)){
tmp2 <- tmp[tmp$fail==f,]
for(k in tmp2$koneleja){
tmp2[tmp2$koneleja != k,]$koneleja %>%
unique() %>% paste(., collapse = "_") -> tmp$kaaskoneleja[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$sugu %>%
unique() %>% ifelse(length(.) > 1, "mõlemad", .) -> tmp$kaaskoneleja_sugu[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$vanus %>%
mean() -> tmp$kaaskoneleja_vanus[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$silpide_arv %>%
mean() -> tmp$kaaskoneleja_silpide_arv[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$sonade_arv %>%
mean() -> tmp$kaaskoneleja_sonade_arv[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$kestus %>%
mean() -> tmp$kaaskoneleja_kestus[tmp$fail==f&tmp$koneleja==k]
tmp2[tmp2$koneleja != k,]$disf_arv %>%
mean() -> tmp$kaaskoneleja_disf_arv[tmp$fail==f&tmp$koneleja==k]
}
}
tmp %>%
filter(!nchar(kaaskoneleja)>3, vanus>9, kaaskoneleja_vanus>9) -> teke2
# faktoriseerime muutujad
teke2$koneleja <- factor(teke2$koneleja)
teke2$sugu <- factor(teke2$sugu)
teke2$fail <- factor(teke2$fail)
Salvestame globaalse kõnetempo andmestiku
save(teke2, file = "teke_globaalne_konetempo.Rda")
Salvestame globaalse kõnetempo andmed
save(fonkorp2, file = "fonkorp_globaalne_konetempo.Rda")
Kui eelnevat mitte jookustada, siis võib alustada siit ja lugeda sisse kolm globaalse kõnetempo andmestikku.
Teke
load("teke_globaalne_konetempo.Rda")
Foneetika korpus
load("fonkorp_globaalne_konetempo.Rda")
Põhjatuule korpuse andmed
###Teismeliste korpus
TeKE koosneb teismeliste omavahelistest vestlustest, mis on salvestatud diktofoniga (enamasti keelejuhtide kodudes). Korpus on käsitsi transkribeeritud, märgitud on kõnevooru piirid, sõnad üldiselt tavaortograafias mõningate täpsustavate lisamärkidega. Siin ettekandes kasutame seda osa TeKE-st,
EKSKFK (Lippus et al. 2021) koosneb
mono-, dia- ja trialoogidest, mis on käsitsi märgendatud erinevatel
lingvistilistel tasanditel: märgitud on sõnade, silpide ja häälikute
piirid, häälelaadi, venitusi, üneeme jpm. Salvestused on suures osas
läbi viidud foneetika labori vaikses salvestusruumis.
Siin ettekandes kasutame seda osa foneetika korpusest,
Korpus koosneb Põhjatuule ja päikese loetud tekstist. Suuresti samad keelejuhid, kes osalevad EKSKFK, aga oleme seda teksti palunud lugeda ka muudes katsetes osalejatel. Korpus on osaliselt märgendatud (umbes 90 salvestust), märgitud on sõnade ja häälikute piirid. Salvestused on suures osas läbi viidud foneetika labori vaikses salvestusruumis.
Keskmiselt üle 5 silbi sekundis, poistel aeglasem.
teke2 %>%
group_by(sugu) %>%
summarise(tempo = mean(silpide_arv/kestus))
## # A tibble: 2 × 2
## sugu tempo
## <fct> <dbl>
## 1 M 5.18
## 2 N 5.43
teke2 %>% summarise(tempo = (silpide_arv/kestus)) %>% summary()
## tempo
## Min. :3.004
## 1st Qu.:4.697
## Median :5.348
## Mean :5.355
## 3rd Qu.:6.010
## Max. :7.437
Testime vanuse & soo efekti GAM mudeliga
library(mgcv)
#mod <- bam((silpide_arv/kestus) ~ sugu + s(vanus, by = sugu, k=5) + s(koneleja, bs = "re"), data = teke2, subset = !(sugu == "M" & vanus == 13))
mod <- bam((silpide_arv/kestus) ~ vanus + sugu + s(koneleja, bs = "re"), data = teke2)
#mod <- bam((silpide_arv/kestus) ~ vanus + s(koneleja, bs = "re"), data = teke2, subset = sugu == "M" & vanus != 13)
summary(mod)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## (silpide_arv/kestus) ~ vanus + sugu + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.86847 0.48852 5.872 0.0000000519 ***
## vanus 0.16148 0.03342 4.833 0.0000046586 ***
## suguN 0.34985 0.16949 2.064 0.0415 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 64.8 83 5.075 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.777 Deviance explained = 86.4%
## fREML = 162.4 Scale est. = 0.16489 n = 172
#concurvity(mod)
#qqnorm(resid(mod))
#qqline(resid(mod))
#par(mfrow = c(2,2))
#plot(mod, all.terms = T)
Meestel on keskmiselt madalam kõnetempo. Naistel püsib kõnetempo stabiilselt.
mod <- bam((silpide_arv/kestus) ~ sugu + s(vanus, by = sugu) + s(koneleja, bs = "re"), data = fonkorp2)
summary(mod)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## (silpide_arv/kestus) ~ sugu + s(vanus, by = sugu) + s(koneleja,
## bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.59834 0.08044 57.164 < 0.0000000000000002 ***
## suguN 0.34985 0.11130 3.143 0.00264 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(vanus):suguM 1.439 1.561 5.991 0.0221 *
## s(vanus):suguN 1.000 1.000 0.191 0.6639
## s(koneleja) 102.010 137.000 3.684 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.779 Deviance explained = 92.2%
## fREML = 158.21 Scale est. = 0.11219 n = 164
#plot(mod, select = 1)
Täiskasvanutel loetud kõnes kõnetempo spontaansest veidi aeglasem, vanusega aeglustub, meestel ja naistel olulist vahet pole.
pohja$sugu <- factor(pohja$sugu)
pohja$ID <- factor(pohja$ID)
#mod <- bam(sprate ~ sugu + s(vanus, by = sugu, k=5) + s(ID, bs = "re"), data = pohja)
mod <- bam(sprate ~ vanus + s(ID, bs = "re"), data = pohja)
summary(mod)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## sprate ~ vanus + s(ID, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.029573 0.125517 40.071 < 0.0000000000000002 ***
## vanus -0.015441 0.002965 -5.208 0.000000696 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(ID) 127.9 145 8.379 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.842 Deviance explained = 91.9%
## fREML = 170.4 Scale est. = 0.059059 n = 265
# plot(mod, select = 1)
# library(itsadug)
# plot_smooth(mod, view = "vanus")
Kolme paneeliga vanuse efekti joonis
teke2 %>%
mutate(kõnetempo = (silpide_arv/kestus), subkorp = "Teismelised") %>%
select(subkorp, kõneleja = koneleja, vanus, sugu, kõnetempo) -> tmp1
fonkorp2 %>%
mutate(kõnetempo = (silpide_arv/kestus), subkorp = "Täisk. vestlus") %>%
select(subkorp, kõneleja = koneleja, vanus, sugu, kõnetempo) -> tmp2
pohja %>%
mutate(subkorp = "Täisk. loetud") %>%
select(subkorp, kõneleja = ID, vanus, sugu, kõnetempo = sprate) -> tmp3
koond1 <- rbind(tmp1,tmp2,tmp3)
koond1$subkorp <- factor(koond1$subkorp, levels=c( "Teismelised", "Täisk. vestlus", "Täisk. loetud"))
joonis2 <- koond1 %>%
ggplot(aes(x = vanus, y = kõnetempo, color = sugu, pch = sugu)) +
geom_point(alpha = 0.6, size = 2) +
#geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) +
geom_smooth(method = "lm") +
facet_grid(cols=vars(subkorp), scales = "free_x") + #space="free"
labs(y = "Kõnetempo (silpi/sek)") +
ylim(2,8)+
teema +
scale_color_manual(values = c("#CB8F0D", "#198D81"))+
# scale_shape_manual(values = c(25,2))+
NULL
joonis2
koond1 %>%
group_by(subkorp) %>%
summarise(mean(kõnetempo))
## # A tibble: 3 × 2
## subkorp `mean(kõnetempo)`
## <fct> <dbl>
## 1 Teismelised 5.35
## 2 Täisk. vestlus 4.74
## 3 Täisk. loetud 4.37
pdf(file = "konetempo_RLY2024_joonis2.pdf", width = 4.7, height = 2.6)
joonis2
dev.off()
Tugev seos vestluspartnerite kõnetempo vahel.
teke2 %>%
mutate(subkorp = "Teismelised",
konetempo = silpide_arv/kestus,
soravus = disf_arv/kestus,
soravus2 = disf_arv/sonade_arv*100,
vanusevahe = kaaskoneleja_vanus - vanus,
partneri_konetempo = kaaskoneleja_silpide_arv/kaaskoneleja_kestus,
partneri_soravus = kaaskoneleja_disf_arv/kaaskoneleja_kestus,
partneri_soravus2 = kaaskoneleja_disf_arv/kaaskoneleja_sonade_arv*100) %>%
select(subkorp, koneleja, sugu, vanus,
partneri_sugu = kaaskoneleja_sugu,
partneri_vanus = kaaskoneleja_vanus,
konetempo,
soravus,
soravus2,
partneri_konetempo,
partneri_soravus,
partneri_soravus2,
vanusevahe) -> teke3
teke3$sugu <- factor(teke3$sugu)
teke3$partneri_sugu <- factor(teke3$partneri_sugu)
mod01<- bam( konetempo ~ vanus + s(koneleja, bs = "re"), data = teke3)
mod02<- bam( konetempo ~ partneri_konetempo + s(koneleja, bs = "re"), data = teke3)
mod <- bam( konetempo ~ partneri_konetempo +vanus + s(koneleja, bs = "re"), data = teke3)
mod1 <- bam( konetempo ~ sugu +vanus + s(koneleja, bs = "re"), data = teke3)
mod2 <- bam( konetempo ~ partneri_konetempo +vanusevahe+ s(koneleja, bs = "re"), data = teke3)
mod3 <- bam( konetempo ~ sugu +vanusevahe+ s(koneleja, bs = "re"), data = teke3)
AIC(mod,mod01, mod1, mod3)
## df AIC
## mod 63.70681 198.1210
## mod01 69.53718 232.6078
## mod1 69.40605 230.6907
## mod3 72.70982 234.7822
summary(mod)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## konetempo ~ partneri_konetempo + vanus + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.36687 0.41453 3.297 0.00131 **
## partneri_konetempo 0.53540 0.06024 8.888 0.0000000000000134 ***
## vanus 0.08011 0.02736 2.928 0.00415 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 58.67 84 2.822 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.814 Deviance explained = 88%
## fREML = 134.4 Scale est. = 0.13769 n = 172
#plot(mod)
Üldiselt on kõnetempo seotud vestluspartneri kõnetempoga, huvitav on, et vastassoost paaridel on seos tugevam.
fonkorp2 %>%
mutate(subkorp = "Täiskasvanud",
partneri_konetempo = kaaskoneleja_silpide_arv/kaaskoneleja_kestus,
partneri_soravus = kaaskoneleja_disf_arv/kaaskoneleja_kestus,
partneri_soravus2 = kaaskoneleja_disf_arv/kaaskoneleja_sonade_arv*100,
vanusevahe = kaaskoneleja_vanus - vanus,
konetempo = silpide_arv/kestus,
soravus = disf_arv/kestus,
soravus2 = disf_arv/sonade_arv*100) %>%
select(subkorp, koneleja, sugu, vanus,
partneri_sugu = kaaskoneleja_sugu,
partneri_vanus = kaaskoneleja_vanus,
konetempo,
soravus,
soravus2,
partneri_konetempo,
partneri_soravus,
partneri_soravus2,
vanusevahe) -> fonkorp3
mod <- bam( konetempo ~ partneri_konetempo+ vanus+sugu+ s(koneleja, bs = "re"), data = fonkorp3)
mod1 <- bam( konetempo ~ partneri_konetempo* vanus*sugu+ s(koneleja, bs = "re"), data = fonkorp3)
mod2 <- bam( konetempo ~ partneri_konetempo+ vanus*sugu+ s(koneleja, bs = "re"), data = fonkorp3)
mod3 <- bam( konetempo ~ partneri_konetempo* vanus+sugu+ s(koneleja, bs = "re"), data = fonkorp3)
AIC(mod,mod1,mod2,mod3)
## df AIC
## mod 111.1351 118.8358
## mod1 112.9233 117.8681
## mod2 109.5618 125.1140
## mod3 111.3403 121.0139
summary(mod2)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## konetempo ~ partneri_konetempo + vanus * sugu + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.544140 0.340956 10.395 0.0000000000000068 ***
## partneri_konetempo 0.382420 0.060007 6.373 0.0000000321935634 ***
## vanus -0.019430 0.005369 -3.619 0.00062 ***
## suguN -0.269333 0.294835 -0.914 0.36474
## vanus:suguN 0.014601 0.007258 2.012 0.04886 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 100.7 137 3.401 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.817 Deviance explained = 93.5%
## fREML = 147.17 Scale est. = 0.092819 n = 164
koond2 <- rbind (teke3, fonkorp3)
koond2$subkorp <- factor(koond2$subkorp, levels=c("Teismelised", "Täiskasvanud"))
joonis3 <- koond2 %>%
ggplot(aes(x = partneri_konetempo, y = konetempo, color = sugu, pch = sugu)) +
geom_point(alpha = 0.6, size = 2) +
#geom_smooth(method = "gam", formula = y ~ s(x, bs = "cs", k = 3)) +
geom_smooth(method = "lm") +
facet_grid(cols=vars(subkorp)) + #space="free", scales = "free_x"
labs(y = "Kõnetempo (silpi/sek)", x="Vestluspartneri kõnetempo (silpi/sek)") +
#ylim(2,8)+
teema +
scale_color_manual(values = c("#CB8F0D", "#198D81"))+
# scale_shape_manual(values = c(25,2))+
NULL
joonis3
pdf(file = "konetempo_RLY2024_joonis3.pdf", width = 4.7, height = 2.6)
joonis3
dev.off()
Soravuse hindamiseks lugesime kokku takerdumisetele viitavad
märgendid, mida mõlemas korpuses on märgendatud:
- pooleli jäänud sõnad,
- sõnakordused,
- venitused.
Arvutame soravuse mõõdiku 2 erineval viisil: - soravus = takerduste arv / kõneleja kõnevoorude kestus - soravus2 = takerduste arv / sõnade arv * 100
Poistel on takerdumisi rohkem, aga vanusega langeb tüdrukutega samale tasemele.
Testime ka alternatiivselt arvutatud soravust
mod1 <- bam(soravus ~ vanus + s(koneleja, bs = "re"), data = teke3)
mod2 <- bam(soravus ~ vanus+sugu + s(koneleja, bs = "re"), data = teke3)
mod3 <- bam(soravus ~ vanus*sugu + s(koneleja, bs = "re"), data = teke3)
summary(mod3)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## soravus ~ vanus * sugu + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.371850 0.060857 6.110 0.0000000117 ***
## vanus -0.014846 0.004322 -3.435 0.000806 ***
## suguN -0.201271 0.071927 -2.798 0.005954 **
## vanus:suguN 0.010835 0.005086 2.130 0.035096 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 43.34 82 1.554 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.592 Deviance explained = 70.3%
## fREML = -246.25 Scale est. = 0.0018717 n = 172
AIC(mod1,mod2,mod3)
## df AIC
## mod1 55.42182 -545.7742
## mod2 50.56607 -548.7531
## mod3 49.33413 -548.8901
Soravus2
mod <- bam(soravus2 ~ vanus + s(koneleja, bs = "re"), data = teke3)
mod1 <- bam(soravus2 ~ vanus+sugu + s(koneleja, bs = "re"), data = teke3)
mod2 <- bam(soravus2 ~ vanus*sugu + s(koneleja, bs = "re"), data = teke3)
AIC(mod, mod1, mod2)
## df AIC
## mod 53.20513 636.7725
## mod1 47.18383 630.2558
## mod2 46.66142 630.4613
summary(mod1)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## soravus2 ~ vanus + sugu + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.91933 0.99655 9.954 < 0.0000000000000002 ***
## vanus -0.33224 0.06847 -4.852 0.00000351 ***
## suguN -1.66413 0.35343 -4.708 0.00000644 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 42.14 83 1.42 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.605 Deviance explained = 70.7%
## fREML = 327.8 Scale est. = 1.7898 n = 172
Tulemused näitavad, et kaks soravuse arvutamise viisi annavad väga sarnased tulemused, aga soravus ajaühiku kohta seostub mudelis paremini kirjeldavate tunnustega.
pdf(file = "konetempo_RLY2024_joonis5.pdf", width = 3.7, height = 2.6)
joonis5
dev.off()
Täiskasvanutel vanusega muutusi pole, meestel takerdumisi rohkem.
mod0 <- bam( soravus ~ s(koneleja, bs = "re"), data = fonkorp3)
mod1a <- bam( soravus ~ sugu+ s(koneleja, bs = "re"), data = fonkorp3)
mod1b <- bam( soravus ~ partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3)
mod2 <- bam( soravus ~ sugu+partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3)
mod3 <- bam( soravus ~ sugu*partneri_soravus+ s(koneleja, bs = "re"), data = fonkorp3)
mod4 <- bam( soravus ~ s(partneri_soravus)+ s(koneleja, bs = "re"), data = fonkorp3)
mod5 <- bam( soravus ~ s(partneri_soravus, by=sugu)+ s(koneleja, bs = "re"), data = fonkorp3)
AIC(mod0, mod1a, mod1b, mod2, mod3, mod4, mod5)
## df AIC
## mod0 65.13931 -357.8396
## mod1a 63.92609 -357.0657
## mod1b 63.47528 -417.9727
## mod2 61.46934 -417.2943
## mod3 63.36678 -420.4588
## mod4 63.44335 -412.4818
## mod5 62.99913 -425.4324
summary(mod5)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## soravus ~ s(partneri_soravus, by = sugu) + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.222344 0.005775 38.5 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(partneri_soravus):suguM 2.919 3.427 16.588 < 0.0000000000000002 ***
## s(partneri_soravus):suguN 1.000 1.000 27.965 0.000000776 ***
## s(koneleja) 52.270 138.000 0.694 0.000602 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.579 Deviance explained = 72.4%
## fREML = -193.33 Scale est. = 0.0031152 n = 164
#qqnorm(resid(mod5))
#qqline(resid(mod5))
# plot(mod5, select=1)
# library(itsadug)
# plot_diff(mod5, view = "partneri_soravus", comp = list(sugu= c("M", "N")))
# plot_smooth(mod5, view = "partneri_soravus", cond = list(sugu="M"), col="blue")
# plot_smooth(mod5, view = "partneri_soravus", cond = list(sugu="N"), add=T, col=2)
mod0 <- bam( soravus2 ~ s(koneleja, bs = "re"), data = fonkorp3)
mod1a <- bam( soravus2 ~ sugu+ s(koneleja, bs = "re"), data = fonkorp3)
mod1b <- bam( soravus2 ~ partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3)
mod2 <- bam( soravus2 ~ sugu+partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3)
mod3 <- bam( soravus2 ~ sugu*partneri_soravus2+ s(koneleja, bs = "re"), data = fonkorp3)
mod4 <- bam( soravus2 ~ s(partneri_soravus2)+ s(koneleja, bs = "re"), data = fonkorp3)
mod5 <- bam( soravus2 ~ s(partneri_soravus2, by=sugu)+ s(koneleja, bs = "re"), data = fonkorp3)
AIC(mod0, mod1a, mod1b, mod2, mod3, mod4, mod5)
## df AIC
## mod0 64.76198 872.5641
## mod1a 62.61601 870.2245
## mod1b 61.78111 847.2545
## mod2 59.31575 845.2620
## mod3 60.85073 844.5049
## mod4 61.78111 847.2545
## mod5 66.85364 847.1106
summary(mod2)
##
## Family: gaussian
## Link function: identity
##
## Formula:
## soravus2 ~ sugu + partneri_soravus2 + s(koneleja, bs = "re")
##
## Parametric coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.92246 0.69626 8.506 0.00000000000011 ***
## suguN -1.53274 0.56387 -2.718 0.00764 **
## partneri_soravus2 0.37584 0.06606 5.689 0.00000010984987 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df F p-value
## s(koneleja) 52.68 137 0.78 0.000089 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.519 Deviance explained = 68%
## fREML = 432.33 Scale est. = 7.4451 n = 164
Ka täiskasvanutel käituvad soravuse mõõdikud väga sarnaselt, aga seosed seletavate tunnustega on ajaühiku kohta arvestades tugevamad.
joonis4 <- koond2 %>%
ggplot(aes(x = vanus, y = soravus, color = sugu, pch = sugu)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm") +
facet_grid(cols=vars(subkorp), scales = "free_x") + #space="free"
labs(y = "Kõneleja soravus (takerdumisi/sek)", x="Vanus (aastad)") +
teema +
scale_color_manual(values = c("#CB8F0D", "#198D81"))+
NULL
joonis4
koond2 %>%
group_by(subkorp) %>%
summarise(mean(soravus2))
## # A tibble: 2 × 2
## subkorp `mean(soravus2)`
## <fct> <dbl>
## 1 Teismelised 4.27
## 2 Täiskasvanud 8.36
pdf(file = "konetempo_RLY2024_joonis4.pdf", width = 4.7, height = 2.6)
joonis4
dev.off()
# heli ja spektrogrammi näite plottimiseks
library(rPraat)
library(phonTools)
naited <- data.frame(file=c("SKK004-003_M", "SKK004-003_M", "SKK007-003_M", "SKK007-003_M", "SKK007-003_M"),
alg = c(114.24961977135679, 1534.32751409178, 1075.2475339625817, 1528.4117838178388, 2258.1593359601507),
lop = c(115.89897865844941, 1537.1660475406088, 1079.2431638835158, 1530.756380617994, 2263.914321834238))
naited <- naited[4,] # võtame ainult 4. näite
for(f in unique(naited$file)) {
snd <- snd.read(paste0("/Users/partel/ownCloud/EKSKFK/SKK0_WAV/", f, ".wav"))
tg <- tg.read(paste0("/Users/partel/ownCloud/EKSKFK/SKK0_TG/", f, ".TextGrid"))
for(nd in which(naited$file==f)){
#lõika jupp
start = naited$alg[nd]
stop = naited$lop[nd]
snd2 <- snd.cut0(snd, Start = start, End = stop)
tg2 <- tg.cut0(tg, start, stop)
tg2 <- tg2[c("sõnad", "häälikud", "silbid")]
# skaleerime heli 0-1 vahemikku
snd3 <- (snd2$sig+max(abs(snd2$sig))) / (2*max(abs(snd2$sig)))
# spektrogramm; # spec objektis on maatriks read = aeg, tulbad = sagedus, väärtus=intensiivsus
spec <- spectrogram(as.vector(snd2$sig), fs = snd2$fs, colors = F,show = F)$spectrogram
spec2 <- spec[,which(as.numeric(colnames(spec))<=5000)]
# põhitoon
# f0 <- pitchtrack(as.vector(snd2$sig), f0range = c(60,600), fs = snd2$fs, show = F)
# f0 <- pitchtrack(as.vector(snd2$sig), f0range = quantile(f0$f0, probs = c(0.25,0.75)) * c(0.75,2), fs = snd2$fs, show = F,minacf = 0.85)
# joonistab ploti, kus esimesel real on skaleeritud helilaine, siis on spektrogramm ning selle all textgridi kihid
#pdf(file = paste0("naited_",f, nd, ".pdf"), width = 10, height = 5)
#png(filename = paste0("naited_",f, nd, ".png"), width = 1400, height = 800)
par(mar=c(0.1,4.5,0.1,0.1))
plot(1, type="n", xaxs="i", ylim=c(-length(names(tg2)),4), xlim=c(0, max(snd2$t)), axes=F, ylab="", xlab="")
lines((snd3+3)~snd2$t)
# plotib spektrogrammi
for (i in 1:ncol(spec2)){
tmp <- spec2[,i]; tmp[tmp<(-60)] <- -60
värv = gray(level = (tmp/-60), alpha = 0.6)
points(x= as.numeric(rownames(spec2))/1000, y = rep(i/100+0.03, nrow(spec2)), col=värv, pch=20, cex=0.1)
}
# joonistab f0 spektrogrammi peale sinisega
# points(y=(f0$f0/100), x=(f0$time/1000), pch=20, cex=0.2, col="blue")
# plotib textgridi
for(k in names(tg2)){
kiht <- tg2[[k]]
jrk <- which(names(tg2) == k)
mtext(side = 2, at = -jrk+0.5, text = k, las=1, line=0.5)
for(i in 1:length(kiht$t1)){
#segm_col = if(kiht$label[i]=="" | substr(kiht$label[i],1,1) %in% c(".","#")) {"white"} else {"light blue"}
xt = c(kiht$t1[i], kiht$t2[i], kiht$t2[i], kiht$t1[i], kiht$t1[i])
polygon(x=xt, y= -c(jrk-1,jrk-1,jrk,jrk,jrk-1), border =1)
text(x= (kiht$t1[i]+(kiht$t2[i]-kiht$t1[i])/2), y=-jrk+0.5, labels = gsub("//_","\n//_",kiht$label[i]), cex=1)
}}
#dev.off()
}
}