参考资料

Fleiss Kappa的定义

Fleiss Kappa的原论文因为要付费才能阅读,我这里就不放链接了

Fleiss' kappa - Wikipediahttps://en.wikipedia.org/wiki/Fleiss%27_kappa

Fleiss Kappa相关统计量 Z值,p值,95%置信区间

属性一致性分析 的 kappa 统计量的方法和公式 - Minitab请选择您所选的方法或公式。https://support.minitab.com/zh-cn/minitab/20/help-and-how-to/quality-and-process-improvement/measurement-system-analysis/how-to/attribute-agreement-analysis/attribute-agreement-analysis/methods-and-formulas/kappa-statistics/#testing-significance-of-fleiss-kappa-unknown-standard刘伟. 属性值测量系统的相关性研究[D].南京理工大学,2010.https://kns.cnki.net/kcms2/article/abstract?v=30M9_8jKqe0eeyUFGF2Hn7wI0LSs-Y73fT2Qnj25ZztRFGn-k7w38HpuuprNL7uDobRQegHTkIu0rsYpWZAWQXSLhgCo5vf_lwfoH8muLibc8UPwv_ZzuvwiTEcRGaXb&uniplatform=NZKPT&language=CHSFleiss' kappa in SPSS Statistics | Laerd Statisticshttps://statistics.laerd.com/spss-tutorials/fleiss-kappa-in-spss-statistics.php

第一个和第二个链接提供了计算公式,第三个链接是SPSS的计算Fleiss Kappa的图文教程,没有涉及公式推理。

前情提要

网上关于Fleiss Kappa的资料比较多,但是相关统计量,如Z值和P值的资料比较少。维基百科只提供了Fleiss Kappa的计算方法,没有提及相关统计量的计算。

期间找了很多工具,如SPSS,Minitab和SPSSAU。SPSS和Minitab是付费软件,SPSSAU是免费的在线分析平台。但SPSSAU只允许5万条及以下的数据进行分析,而我的数据量超过了5万条。

找遍全网好像没有人公开计算Fleiss Kappa相关统计量的代码,而可以计算这些统计量的软件要么是付费的,要么是存在数据量的限制,我就想能不能自己实现一个计算工具。

Fleiss Kappa原理

关于Fleiss Kappa的原理部分,我觉得还是看维基百科比较好,他写的比较清楚,还提供了数据示例。下面是关于Fleiss Kappa的计算代码。

import numpy as np
def fleiss_kappa(data: np.array):"""Calculates Fleiss' kappa coefficient for inter-rater agreement.Args:data: numpy array of shape (subjects, categories), where each element representsthe number of raters who assigned a particular category to a subject.Returns:kappa: Fleiss' kappa coefficient."""subjects, categories = data.shapen_rater = np.sum(data[0])p_j = np.sum(data, axis=0) / (n_rater * subjects)P_e_bar = np.sum(p_j ** 2)P_i = (np.sum(data ** 2, axis=1) - n_rater) / (n_rater * (n_rater - 1))P_bar = np.mean(P_i)K = (P_bar - P_e_bar) / (1 - P_e_bar)

subjects是样本数量,相当于维基百科中的N

categories是类别数量,相当于维基百科中的k

n_rater是投票者的数量,相当于维基百科中的n

data是输入的矩阵,第i行j列的元素是维基百科中的

这里我提供维基百科的公式截图,可以对照看一下

相关统计量的计算

下图是Minitab提供的公式,链接我放在了博客开头

z值算出来后,p-value和95%置信区间就水到渠成了。

在代码中我使用tmp进行了替换,简化了表达式

    tmp = (1 - P_e_bar) ** 2var = 2 * (tmp - np.sum(p_j * (1 - p_j) * (1 - 2 * p_j))) / (tmp * subjects * n_rater * (n_rater - 1))# standard errorSE = np.sqrt(var) Z = K / SEp_value = 2 * (1 - norm.cdf(np.abs(Z)))ci_bound = 1.96 * SE / subjectslower_ci_bound = K - ci_boundupper_ci_bound = K + ci_bound

下面是完整代码

import numpy as np
from scipy.stats import normdef fleiss_kappa(data: np.array):"""Calculates Fleiss' kappa coefficient for inter-rater agreement.Args:data: numpy array of shape (subjects, categories), where each element representsthe number of raters who assigned a particular category to a subject.Returns:kappa: Fleiss' kappa coefficient."""subjects, categories = data.shapen_rater = np.sum(data[0])p_j = np.sum(data, axis=0) / (n_rater * subjects)P_e_bar = np.sum(p_j ** 2)P_i = (np.sum(data ** 2, axis=1) - n_rater) / (n_rater * (n_rater - 1))P_bar = np.mean(P_i)K = (P_bar - P_e_bar) / (1 - P_e_bar)tmp = (1 - P_e_bar) ** 2var = 2 * (tmp - np.sum(p_j * (1 - p_j) * (1 - 2 * p_j))) / (tmp * subjects * n_rater * (n_rater - 1))# standard errorSE = np.sqrt(var) Z = K / SEp_value = 2 * (1 - norm.cdf(np.abs(Z)))ci_bound = 1.96 * SE / subjectslower_ci_bound = K - ci_boundupper_ci_bound = K + ci_boundprint("Fleiss Kappa: {:.3f}".format(K))print("Standard Error: {:.3f}".format(SE))print("Z: {:.3f}".format(Z))print("p-value: {:.3f}".format(p_value))print("Lower 95% CI Bound: {:.3f}".format(lower_ci_bound))print("Upper 95% CI Bound: {:.3f}".format(upper_ci_bound))print()

这个函数只能处理格式形如维基百科示例的数据,对于其他格式的数据,需要相关的转换函数。

这里提供了两个转换函数,和对应的测试数据

def transform(*raters):"""Transforms the ratings of multiple raters into the required data format for Fleiss' Kappa calculation.Args:*raters: Multiple raters' ratings. Each rater's ratings should be a list or array of annotations.Returns:data: numpy array of shape (subjects, categories), where each element represents the number of raterswho assigned a particular category to a subject."""assert all(len(rater) == len(raters[0]) for rater in raters), "Lengths of raters are not consistent."subjects = len(raters[0])categories = max(max(rater) for rater in raters) + 1data = np.zeros((subjects, categories))for i in range(subjects):for rater in raters:data[i, rater[i]] += 1return datadef tranform2(weighted):"""Transforms weighted data into the required data format for Fleiss' Kappa calculation.Args:weighted: List of weighted ratings. Each row represents [rater_0_category, rater_1_category, ..., rater_n_category, weight].Returns:data: numpy array of shape (subjects, categories), where each element represents the number of raterswho assigned a particular category to a subject."""n_rater = len(weighted[0]) - 1raters = [[] for _ in range(n_rater)]for i in range(len(weighted)):for j in range(len(raters)):raters[j] = raters[j] + [weighted[i][j] for _ in range(weighted[i][n_rater])]data = transform(*raters)return datadef test():# Example data provided by wikipedia https://en.wikipedia.org/wiki/Fleiss_kappadata = np.array([[0, 0, 0, 0, 14],[0, 2, 6, 4, 2],[0, 0, 3, 5, 6],[0, 3, 9, 2, 0],[2, 2, 8, 1, 1],[7, 7, 0, 0, 0],[3, 2, 6, 3, 0],[2, 5, 3, 2, 2],[6, 5, 2, 1, 0],[0, 2, 2, 3, 7]])fleiss_kappa(data)# need transformrater1 = [1, 2, 2, 1, 2, 2, 1, 1, 3, 1, 2, 2]rater2 = [1, 2, 1, 2, 1, 2, 3, 2, 3, 2, 3, 1]rater3 = [1, 2, 2, 1, 3, 3, 3, 2, 1, 2, 3, 1]data = transform(rater1, rater2, rater3)fleiss_kappa(data)# The first row indicates that both rater 1 and 2 rated as category 0, this case occurs 8 times.# need transform2weighted_data = [[0, 0, 8],[0, 1, 2],[0, 2, 0],[1, 0, 0],[1, 1, 17],[1, 2, 3],[2, 0, 0],[2, 1, 5],[2, 2, 15]]data = tranform2(weighted_data)fleiss_kappa(data)test()

代码准确性

对于测试的3个数据,我同时使用了SPSSAU和SPSS进行统计分析,它们的结果和我代码计算结果一致。

对于我自身的42万条数据,使用SPSS和我代码计算的结果一致。

代码和测试数据已上传到github,欢迎下载和打星

Fleiss-Kappa/ at main · Lucienxhh/Fleiss-Kappa · GitHubhttps://github.com/Lucienxhh/Fleiss-Kappa

Python实现Fleiss Kappa一致性分析,并计算Z值和p值等相关统计量相关推荐

  1. python 连续三个数满足条件_计算满足条件的连续值数(Pandas Dataframe)

    这是一个带有^{}-# https://stackoverflow.com/a/52718782/ @Divakar def maxisland_start_len_mask(a, fillna_in ...

  2. matlab kappa计算,计算R中fleiss kappa的置信区间

    2 个答案: 答案 0 :(得分:1) kappam.fleiss函数和concordance函数之间的区别在于,第一个用于详细评估者,第二个用于摘要数据.在Wikipedia页面上查看以下示例: D ...

  3. R语言使用epiDisplay包的kap函数(kap.2.raters函数)计算Kappa统计量的值(总一致性、期望一致性)、对两个评分对象的结果进行一致性分析、评分的类别为多个类别

    R语言使用epiDisplay包的kap函数(kap.2.raters函数)计算Kappa统计量的值(总一致性.期望一致性).对两个评分对象的结果进行一致性分析.评分的类别为多个类别 目录

  4. R语言使用epiDisplay包的kap函数(kap.m.raters)计算Kappa统计量的值(总一致性、期望一致性)、对多个评分对象的结果进行一致性分析、评分的类别为多个类别

    R语言使用epiDisplay包的kap函数(kap.m.raters)计算Kappa统计量的值(总一致性.期望一致性).对多个评分对象的结果进行一致性分析.评分的类别为多个类别 目录

  5. R语言epiDisplay包的kap函数计算Kappa统计量的值(总一致性、期望一致性)、对多个评分对象的结果进行一致性分析、评分的类别为多个类别、如果评分中包含缺失值则标准误及其相关统计量则无法计算

    R语言使用epiDisplay包的kap函数(kap.m.raters)函数计算Kappa统计量的值(总一致性.期望一致性).对多个评分对象的结果进行一致性分析.评分的类别为多个类别.如果评分中包含缺 ...

  6. R语言使用epiDisplay包的kap函数(kap.ByCategory)函数计算Kappa统计量的值(总一致性、期望一致性)、对多个评分对象的结果进行一致性分析、评分的类别为多个类别

    R语言使用epiDisplay包的kap函数(kap.ByCategory)函数计算Kappa统计量的值(总一致性.期望一致性).对多个评分对象的结果进行一致性分析.评分的类别为多个类别 目录

  7. FLeiss Kappa系数和Kappa系数的Python实现

    Kappa系数和Fleiss Kappa系数是检验实验标注结果数据一致性比较重要的两个参数,其中Kappa系数一般用于两份标注结果之间的比较,Fleiss Kappa则可以用于多份标注结果的一致性检测 ...

  8. Excel计算Fleiss Kappa分数

    这个分数是用来评估多名评估员对于一系列观测样本的评估的一致性.Fleiss Kappa分越高,说明分歧越小,大家做出的判断都差不多,反之分数越低,分歧越大. 维基百科上的分数和对应解释,一般0.8以上 ...

  9. Python数据分析高薪实战第八天 数据计算统计与分析

    17 如何快速实现数据的批量计算? 接下来我们会进入一个全新的模块:数值类数据分析.在这个部分,我们会学习数据分析中常用的数学方法以及 Python 中处理数值数据的神器:NumPy. 在完成了本部分 ...

最新文章

  1. 图神经网络从入门到入门
  2. Spring基础专题——第九章(基础注解编程——上)
  3. 针对深度学习(神经网络)的AI框架调研
  4. I.MX6ULL镜像文件
  5. 初识github之注册和基本概念
  6. 数组排序并找出元素索引--Where do I belong-FCC
  7. 前端路由的两种实现原理
  8. 建阳有计算机学校吗,建阳有哪几所中专技校
  9. 电脑排行榜笔记本_2019联想笔记本电脑排行榜
  10. git解决 “fatal: Could not read from remote repository.“
  11. pytorch dropout代码解读
  12. 如何使用FL Studio效果器制作镶边音效
  13. Hexo,自定义博客主题
  14. Easyui三级目录菜单+手风琴+spring mvc
  15. 什么是增量绩效管理?华为是如何做
  16. 2021-07-27 Vue修改主页
  17. RPG Maker的引擎分析(一)
  18. 【电路设计】基于变压器的DC/DC变换电路(含Multisim仿真)
  19. 评价类问题解决方法及模型汇总
  20. 2020年非上海生源应届普通高校毕业生落户材料办理流程及注意事项

热门文章

  1. 威布尔分析在产品失效模式评估中的应用举例
  2. bat 执行带中文路径的解决方法 附加pc微信双开bat
  3. APX2500会给手机带来一场视界革命么?
  4. matlab多自由度弹簧响应,用matlab编程实现法计算多自由度体系的动力响应..doc
  5. 几何公差(GDT)基础知识公差带
  6. php视频和声音不同步,视频画面与声音不一致怎么办 视频声音比画面慢|调节画面与声音同步的方法...
  7. linux服务器视频转换,Linux系统下视频转换软件使用方法
  8. 什么是原始股?如何购买原始股?
  9. android midi 格式开发总结(1)
  10. Visual Studio 2010 中文旗舰版下载