基于R语言计算多评分者针对多问题的评分者间信度
评分者间信度计算相关问题
背景
我有5名评分者的转录文本评分数据,每名评分者需回答每份转录文本的最多12个问题,每个问题采用不同评分体系(如是/否、1-7分、This/That/Indeterminate)。
示例数据生成代码:
data.table(Rater = c("A","B","C","D","E"), Content = c("I","I","I","I","I","II","II","II","II","II"), Question1 = c("Yes","No","Yes","No","NA"), Question2 = c("1","3","5","7","NA"), Question3 = c("This","That","Indeterminate","This","Indeterminate"))
生成的数据如下:
Rater Content Question1 Question2 Question3 1: A I Yes 1 This 2: B I No 3 That 3: C I Yes 5 Indeterminate 4: D I No 7 This 5: E I NA NA Indeterminate 6: A II Yes 1 This 7: B II No 3 That 8: C II Yes 5 Indeterminate 9: D II No 7 This 10: E II NA NA Indeterminate
我需要计算评分者间信度(Inter-rater reliability),已知irr包的kappa2函数需要数据为长格式,示例格式如下:
Rater A B ... E Question1_Content_I Yes No ... NA Question2_Content_I 1 3 ... NA Question3_Content_I This That ... Ind. Question1_Content_II Yes No ... Ind. ...
问题与解答
1. 如何重新格式化数据以计算IRR分数(使用kappa2或其他函数)?melt函数是否可行?
完全可以用melt(来自data.table或reshape2)处理,步骤如下:
- 先用
melt将宽格式转长格式,把Question1、Question2等列合并为Question列,对应评分放入Score列,保留Rater和Content作为标识:# 基于data.table的melt操作 long_data <- melt(original_dt, id.vars = c("Rater", "Content"), measure.vars = patterns("Question"), variable.name = "Question", value.name = "Score") - 再用
dcast转成kappa2需要的宽格式,让每一行对应一个「问题+文本」组合,列对应不同评分者的分数:
最终得到的格式就和示例一致,满足wide_for_irr <- dcast(long_data, Question + Content ~ Rater, value.var = "Score")irr包函数的输入要求。
2. 针对不同类型的问题/评分,应使用哪些函数计算IRR分数?(若有要求,需对应何种数据格式?)
不同评分体系对应不同的IRR计算函数,核心匹配数据类型:
- 二分变量(是/否):2名评分者用
irr包的kappa2(Cohen's Kappa);多名评分者用kripp.alpha(Krippendorff's Alpha)或fleiss.kappa(Fleiss' Kappa)。数据需为宽格式,每一行是一个评分单元,列是各评分者的二分结果。 - 有序变量(1-7分):优先用
irr包的weighted.kappa(加权Kappa,考虑等级间距离),或kripp.alpha(支持有序权重)。数据为宽格式,需确保分数是数值型。 - 多分类变量(This/That/Indeterminate):2名评分者用
kappa2;多名评分者用fleiss.kappa或kripp.alpha。数据为宽格式,每一行是一个评分单元,列是各评分者的分类结果。
3. 是否必须为每个问题/评分单独计算IRR分数,还是可以计算跨所有问题的整体IRR?
建议按问题单独计算,因为每个问题的评分体系、测量维度不同,合并计算会混淆不同维度的信度,结果无实际意义。
如果一定要计算整体信度,只能把所有「问题+文本」的组合当作独立评分单元,但这要求所有问题的评分尺度本质测量同一构念——你的问题用了不同评分体系,这种情况不适用,强行合并会导致结果失真。
4. 如何处理部分评分者未回答全部问题的情况?
不同函数对缺失值的处理方式不同,对应解决方案:
kappa2:默认自动删除包含NA的行(即该评分单元只要有一个评分者缺失,就不纳入计算)。也可手动筛选无缺失的行:filtered_data <- wide_for_irr[complete.cases(wide_for_irr), ]kripp.alpha:支持直接处理缺失值,只需在函数中指定missing = "ignore",它会根据有效评分数量计算信度,无需提前删除行。fleiss.kappa:要求每个评分单元的有效评分数量一致,否则报错。可删除缺失过多的行,不推荐随意填充缺失值,优先保留有效样本。
内容的提问来源于stack exchange,提问作者Nick Byrd
相关产品推荐
相关产品推荐

