Chapter 5 第五章 语言实验数据分析
5.5 课堂任务
# 数据处理函数大合集
library(tidyverse)
########################################
# ✔ dplyr 1.1.3 ✔ readr 2.1.4
# ✔ forcats 1.0.0 ✔ stringr 1.5.1
# ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
# ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
# ✔ purrr 1.0.2
#########################################任务5.2:数据整理
assim.clean = cm13.df%>%
# 除去练习数据
filter(., Procedure.Block. != "pracproc") %>%
# 选择需要的列并将变量名修改
select(., subject = "Subject",
stimuli = "tone.Trial.",
response = "SoundOut1.RESP",
response_rt = "SoundOut1.RT",
rating = "Slide1.RESP",
rating_rt = "Slide1.RT")%>%
# 除去被试未作答的试次
filter(., response !="")%>%
# 反应时为刺激播放后1000毫秒后的被试反应,原始数据从刺激播放开始记录,因此进行调整。
mutate(., response_rt = response_rt-1000)%>%
# 将被试的按键反应改写成相应的母语声调类别,修改刺激名称
mutate(response =dplyr:: recode(response,
f = "M55", g = "M35",
h = "M214", j = "M51"),
stimuli = dplyr:: recode(stimuli,
"33" = "T33", "21" = "T21",
"45" = "T45", "315" = "T315",
"241" = "T241"))如果有多个数据框需要进行相同的操作,我们可以复制上述代码。但是,这样会使得数据处理的脚本冗长。因此,我们可以将需要重复使用的代码块制作成自定义函数。
函数的基本结构:function_name 是你定义的函数名称。 function(arg1, arg2, …) 定义了函数的参数。 函数体包含了函数的逻辑和操作。 return(result) 是返回值,表示函数的输出。如果省略return,R会自动返回最后计算的值。
function_name <- function(arg1, arg2, ...) {
# 函数体
# 这里是你想让函数执行的代码
return(result)
}
# cleaning perception data
data.clean = function(rawdata){
filter(rawdata, Procedure.Block. != "pracproc") %>%
select(., subject = "Subject",
stimuli = "tone.Trial.",
response = "SoundOut1.RESP",
response_rt = "SoundOut1.RT",
rating = "Slide1.RESP",
rating_rt = "Slide1.RT")%>%
filter(., response !="")%>%
mutate(., response_rt = response_rt-1000)%>%
mutate(response =dplyr:: recode(response,
f = "M55", g = "M35",
h = "M214", j = "M51"),
stimuli = dplyr:: recode(stimuli,
"33" = "T33", "21" = "T21",
"45" = "T45", "315" = "T315",
"241" = "T241"))->clean_data
return(clean_data)
}
assim.clean2 = data.clean(cm13.df) 任务5.3:数据转化
下面我们希望能够先计算每个人在听到泰语五个声调时的选择模式和反应时。然后基于此计算出汉语普通话组的选择模式和反应时。
assim.individual = assim.clean %>%
#为每个反应计数
mutate(n = 1)%>%
# 计算每个人每个泰语声调及对应汉语声调反应的次数、评分和反应时均值
group_by(subject, stimuli, response)%>%
summarise(cat = sum(n),
response_rt = mean(response_rt, na.rm = TRUE),
rating = mean(rating, na.rm = TRUE))%>%
# 计算每个人每个泰语声调及对应汉语声调反应的比例
group_by(subject, stimuli)%>%
mutate(percent = cat/sum(cat))%>%
ungroup()
assim.group =
assim.individual%>%
# mutate(stimuli = as_factor(stimuli),
# response = as_factor(response),
# stimuli = fct_relevel(stimuli, "T45","T33","T21","T315","T241"),
# response = fct_relevel(response,
# "M55","M35","M214","M51"))%>%
group_by(stimuli,response)%>%
# 计算每组反应平均值和评分均值
summarise(cat.mean = round(sum(percent)/13, 3)*100,
rate.mean = round(mean(rating,na.rm = TRUE),1))%>%
gather(temp, score, ends_with(".mean")) %>%
# 将刺激和对应的反应均值和评分均值组合
unite(temp1, stimuli, temp, sep = "_")%>%
# 将表格进行转换,得到最终需要的感知同化模式图
spread(temp1, score)%>%
#change the order of columns
select("response" , "T45_cat.mean", "T45_rate.mean",
"T33_cat.mean" , "T33_rate.mean",
"T21_cat.mean","T21_rate.mean",
"T315_cat.mean", "T315_rate.mean",
"T241_cat.mean", "T241_rate.mean")任务5.4:可视化
上述表格包含两个分类变量(泰语刺激的声调类型以及汉语反应的声调类型)和两个连续变量(选择的百分比以及评分)。两个分类变量是自变量,两个连续变量是因变量,我们可以根据因变量不同分别作图。首先,我们可以为感知同化模式画一个堆叠柱状图。普通柱状图的横纵表表示一个分类变量,为了让柱状图可以表示两个分类变量,我们需要在每个柱子中加入不同的颜色来区分。
assim.individual %>%
group_by(stimuli,response)%>%
summarise(percent = round(sum(percent)/13, 3)*100)%>%
filter(percent>1)%>%
ggplot(aes(fill=response, y=percent, x=stimuli)) +
geom_bar( stat="identity")+
scale_fill_manual(
values=c("M55" = "black", "M35"="gray50",
"M214"="gray75", "M51"="white"),
name="Mandarin",
breaks=c("M55", "M35", "M214","M51"),
labels=c("M55", "M35", "M214","M51"))+
geom_bar(colour="black", stat="identity")+
xlab("Thai tones (stimuli)")+
ylab("Percentage of choice (%)") +
scale_y_continuous(expand = c(0, 0), limits = c(0, 101))+
labs(title = "Perceputal assimialtion of Thai tones by Mandarin listeners")+
theme_classic()+
theme(legend.title = element_text(size=12, face="bold"))+
theme(legend.text = element_text(size = 12, face = "bold"))+
theme(axis.text.x = element_text(face="bold", size=10))两个分类变量的另一种可视化方法是热力图。我们可以用泰语的刺激作为横轴,普通话声调类别作为纵轴,用色块的深浅表示评分的高低。
assim.individual %>%
group_by(stimuli,response)%>%
summarise(percent = round(sum(percent)/13, 3)*100,
# 计算评分的均值
rate.mean = round(mean(rating,na.rm = TRUE),1))%>%
mutate(text.color = (stimuli== response))%>%
# 构建xy轴
ggplot(aes(stimuli,response))+
# 构建热力图
geom_tile(aes(fill = percent))+
# 将评分作为标记填入,并设置相应的颜色、大小
geom_text(aes(label = round(percent, 1)),
color = "red",
size = 4) +
scale_colour_manual(values=c("black", "white"))+
scale_x_discrete(name = "Thai stimuli (%)")+
scale_y_discrete(name = "Mandarin responses (%)")+
scale_fill_gradient(name="%",low = "white", high = "black") +
theme(axis.text.x = element_text(face="bold", size=8),
axis.title.x = element_text(face="bold", size=10),
axis.title.y = element_text(face="bold", size=10),
#axis.title.y = element_blank(),
axis.text.y = element_text(face="bold", size=8),
#axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.ticks.x = element_blank())