在R中计算Likert量表数据不同类别间的Spearman相关矩阵
问题描述
我有一个包含两列的数据集:一列是Likert顺序量表的答案(因子类型),另一列是每个问题的类别。数据示例如下:
df # A tibble: 50 × 2 answers Cat <fct> <chr> 1 Very Satisfied A 2 Satisfied A 3 Very Satisfied B 4 Average B 5 Dissatisfied C 6 Average A 7 Very Satisfied A 8 Very Satisfied B 9 Satisfied B 10 Very Dissatisfied C
数据集结构:
structure(list(answers = structure(c(5L, 1L, 4L, 5L, 4L, 2L, 5L, 2L, 5L, 2L, 5L, 5L, 3L, 3L, 5L, 4L, 5L, 5L, 2L, 1L, 4L, 3L, 4L, 2L, 5L, 5L, 5L, 5L, 3L, NA, 4L, 1L, 4L, 4L, 2L, 2L, 2L, 1L, 4L, 3L, 5L, 2L, 1L, 3L, 1L, 5L, 1L, 1L, 4L, 3L, 4L, 2L, 5L, 3L, 1L, 2L, 4L, 5L, 1L, NA), levels = c("Very Dissatisfied", "Dissatisfied", "Average", "Satisfied", "Very Satisfied"), class = "factor"), Cat = c("A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C", "A", "A", "B", "B", "C", "C")), row.names = c(NA, -60L), class = c("tbl_df", "tbl", "data.frame"))
需要计算类别A、B、C之间的Spearman相关矩阵,结果为3×3矩阵且主对角线值为1。
解决方案
步骤1:将长格式数据转换为宽格式
原数据是长格式,每个类别(A/B/C)的答案分散在多行中。首先按观测组将数据转换为宽格式,让每一行对应一组A、B、C的答案:
library(dplyr) library(tidyr) # 创建分组标识:每6行(A,A,B,B,C,C)为一组 df <- df %>% mutate(group_id = rep(1:(nrow(.)/6), each=6)) %>% # 每个组内保留每个类别的第一个非NA答案 group_by(group_id, Cat) %>% summarise(answers = first(na.omit(answers)), .groups = "drop") %>% # 转换为宽格式 pivot_wider(names_from = Cat, values_from = answers)
步骤2:将因子转换为数值型
Likert因子的水平顺序已匹配量表逻辑,直接转换为数值即可:
df_num <- df %>% mutate(across(A:C, as.numeric)) %>% select(-group_id) # 移除分组标识列
步骤3:计算Spearman相关矩阵
使用cor()函数指定Spearman方法,同时处理缺失值:
spearman_cor <- cor(df_num, method = "spearman", use = "complete.obs") print(spearman_cor)
运行后会得到一个3×3矩阵,主对角线值为1,其余为A与B、A与C、B与C之间的Spearman相关系数。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

