개요
소프트웨어 의료기기의 신뢰도 검사를 하던 중 Bland-Altman Plot에 대해 알게되어 자료를 조사하다가 논문을 찾아보게 되어 내용에 대한 정리와 해당 지표들을 Python으로 표현하는 방법에 대해 간단히 정리한다.
오늘 작성하게 될 글은 각각의 평가지표에 대한 내용의 초점 보다는 Python으로 표현하는 방법에 대해 초점을 둔다.
서론
임상이나 의학에 대한 연구에서 질병 진단 또는 환자의 예후 추정을 위해 적절한 측정법 또는 검사법을 통해 임상적 결정을 내리는 과정을 거친다.
검사법은 정확도(타당도)와 신뢰도(일관성, 반복성, 재현성, 일치도) 에 측면에 있어 평가를 진행한다. 이때 신뢰도를 측정하는데 사용되는 지표들이 Bland-Altman Plot, ICC가 존재한다.
본론
1) 급내상관계수 (Intraclass correlation coefficient, ICC)
반복성과 재현성을 평가할 때 사용되는 흔한 지표로 측정된 값들의 총 변동 중에 개인간 변동에 의해 야기된 부분에 대한 추정치이다.
$$ ICC = {V_b\over V_T} = {V_B \over V_b+V_e} \qquad(1)$$
$V_T$ : 총 변동(total variance), $V_b$와 $V_e$ 의 총합
$V_b$ : 일반적인 신뢰도 연구에서는 개인간 변동(variance between individuals)
$V_e$ : 개인내 변동(variance within individuals), 원하지 않은 변동, 오차, 동일 대상에 대한 여러 측정값들 간 분산의 추정치
ICC의 결과값은 0~1사이의 값을 갖으며 각각의 범위의 해석은 일반적인 상관계수 지표와 비슷하다( 0.40미만은 좋지 않음(poor), 0.4–0.6은 보통(fair), 0.6–0.75는 좋음(good), 0.75–1.00은 매우 좋음(excellent) 등으로 분류).
ICC는 각각의 측정값 결과에 따라 산출하는 방법이 다르다 해당 사항에 대해서는 논문을 직접 참고 하는편이 정보전달 측면에서 확실하다고 생각된다.
절대적인 기준은 없고, 단위가 없는 지표이므로 오차의 실제 크기와 상관이 없어서 연구에서 나타난 오차가 임상적으로 받아들일 수 있는 수준인가 하는 관점에서 해석하기 어렵다.
1-1) Python을 통한 ICC 산출 방법
python에서 ICC를 산출하기 위해 pingouin 통계 패키지를 사용한다.
1. 먼저 먼저 Pingouin을 설치한다.
$ pip install pingouin
2. 데이터셋을 불러들인다.
4명의 심사 위원이 평가 한 와인 품질의 ICC 측정에 대한 데이터이다.
import pingouin as pg
data = pg.read_dataset('icc')
data.head()
""
Wine Judge Scores
0 1 A 1
1 2 A 1
2 3 A 3
3 4 A 6
4 5 A 6
""
3. 클래스 내 상관 계수 계산
다음 코드를 사용하여 클래스 내 상관 계수를 계산한다
icc = pg.intraclass_corr(data=data, targets='Wine', raters='Judge',ratings='Scores').round(3)
icc.set_index("Type")
""
Description ICC F df1 df2 pval CI95%
Type
ICC1 Single raters absolute 0.728 11.680 7 24 0.0 [0.43, 0.93]
ICC2 Single random raters 0.728 11.787 7 21 0.0 [0.43, 0.93]
ICC3 Single fixed raters 0.729 11.787 7 21 0.0 [0.43, 0.93]
ICC1k Average raters absolute 0.914 11.680 7 24 0.0 [0.75, 0.98]
ICC2k Average random raters 0.914 11.787 7 21 0.0 [0.75, 0.98]
ICC3k Average fixed raters 0.915 11.787 7 21 0.0 [0.75, 0.98]
""
Output dataframe:
- Type: ICC type
- Description: description of the ICC
- ICC: intraclass correlation
- F: F statistic
- df1: numerator degree of freedom
- df2: denominator degree of freedom
- pval: p-value
- CI95%: 95% confidence intervals around the ICC
총 여섯가지의 ICC가 산출 되었고, 이는 다음과 같이 각각의 타입의 조합을 통해 계산이 진행된다.
- Model: One-Way Random Effects, Two-Way Random Effects, or Two-Way Mixed Effects
- Type of Relationship: Consistency or Absolute Agreement
- Unit: Single rater or the mean of raters
2) Bland-Altman Plot
Bland-Altman Plot 은 동일 대상에 대한 두 번에 걸쳐 측정한 값을 통해 각각의 짝마다,평균과 차이를 계산한 다음 평균을 X측, 차이를 y축으로 하는 산점도를 말한다.
이는 반복성과 재현성 평가에서 뿐만 아니라 서로 다른 두 검사법에 의한 측정값들 간의 불일치 양상을 상펴보기에 유용하다고 한다.
일반적으로 X축에 대해 평행한 세개의 가로선을 표현하는데 이는 불일치의 정도를 요약하는 값이다.
각각의 가로선은 중앙은 평균차이, 상한선은 95% 일치한계 상한값 , 하한선은 95% 일치한계 하한값을 나타낸다.
- 중앙선 : 층정값의 짝 간 차이의 평균(0으로부터 이 값까지의 거리는 두 검사법(또는 평가자) 간 바이어스의 추정치)
- 95% 일치한계 상한값 (upper LOA) : 평균 + 1.96 * Sd
- 95% 일치한계 하한값(lower LOA) : 평균 -1.96 * Sd
평균 차이와 95% LOA는 측정값의 전 범위에 걸쳐 바이어스와 변동이 균일한 경우에만 의마가 있고한다.
Bland-Altman의 해석은 세 단계로 살펴본다.
1) 먼저 x측 값(참값이나 측정값 짝의 평균)의 크기에 따른 불일치의 분포 양상 확인
2) 두 검사법(또는 평가자) 간 일치/불일치를 나타 내는 지표들을 정량화하여 제시하고 해석
3) 마지막으로는 95% LOA의 값과 범위를 평가
2-1) Python을 통한Bland-Altman Plot 산출 방법
1. 먼저 먼저 statsmodels을 설치한다.
$ pip install statsmodels
2. 데이터셋을 생성한다.
생물 학자가 두 개의 다른 도구 (A와 B)를 사용하여 동일한 20 개의 다른 개구리 세트의 무게를 그램으로 측정한 데이터이다.
import pandas as pd
df = pd.DataFrame({'A': [5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9,
10, 11, 13, 14, 14, 15, 18, 22, 25],
'B': [4, 4, 5, 5, 5, 7, 8, 6, 9, 7, 7, 11,
13, 13, 12, 13, 14, 19, 19, 24]})
df.head()
""
A B
0 5 4
1 5 4
2 5 5
3 6 5
4 6 5
""
3.블랜드-알트만 플롯 만들기
다음 코드를 사용하여 블랜드-알트만 플롯을 만듭니다.
import statsmodels.api as sm
import matplotlib.pyplot as plt
f, ax = plt.subplots(1, figsize = (8,5))
sm.graphics.mean_diff_plot(df.A, df.B, ax = ax)
plt.show()
결론
해당 글은 신뢰도를 평가하는 지표로 ICC와 Bland-Altman을 그리는 방법에 대해 설명하고 각각의 평가지표를 라이브러리를 통해 Python으로 구현해보았다. 하지만 평가지표에 대한 자세한 내용에 대해 아직까지 공부가 부족하여 추후에 추가적으로 상세하게 공부하여 블로그에 글을 남기고자 한다.
Ref
1) How to Calculate Intraclass Correlation Coefficient in Python
3) regression model의 성능 지표로 쓰일 수 있는 bland altman plot 그리기
4)논문
'Statistics' 카테고리의 다른 글
확률 기초 (0) | 2021.03.29 |
---|