Code
library(tidyverse)
CCI: Charlson Comorbidity Index
GEMs: General Equivalence Mappings
医療情報 DB を用いた研究などでは、ICD code を使って疾患の特定を行うことが多い。
ここでは、ICD code のハンドリングや疾患名の付与、CCI の算出といった作業に便利な R パッケージを紹介する。
WHO から発出されている疾病の分類コード
コードの検索は例えばicd10data.com が便利である。
ICD-9, ICD-10 といったバージョン違いの他に、米国では ICD-10-CM が用いられるなど、それらの差異には注意が必要である。
事前準備として tidyverse を読み込んでおく。
library(tidyverse)
coder
パッケージrOpenSci プロジェクトに入っており、今後も開発が進んでいくことが期待される。
ICD code の他にも薬剤コードの一種である ATC code についても対応している。
library(coder)
サンプルデータとして ex_people
, ex_icd10
, ex_atc
が準備されている。
categorize()
coder
パッケージには、データフレームを結合する codify()
、併存疾患を抽出する classify()
、CCI を算出する index()
という関数があるが、基本的には categorize()
で一気に行う。
以下ではドキュメントを参考にしたサンプルコードを示す。
categorize(
x = ex_people, codedata = ex_icd10,
cc = "charlson", id = "name", code = "icd10")
Classification based on: icd10
x
には重複のない患者 ID 列を含むデータフレームを指定するcc
に入るオプションは以下で確認できるall_classcodes()
classcodes
: 算出するスコア
console
に ?charlson
などと入力してドキュメントを見ると、出自の文献を確認できるconsole
に elixhauser
などと入力して Classcodes object から対象疾患を確認できるregex
: 対応するコード(ICD-10 など)indices
: 重みづけの方法併存疾患を選択するための time window を指定したい場合は、以下のようにする。
<-
ch categorize(
x = ex_people, codedata = ex_icd10, cc = "charlson", id = "name", code = "icd10",
index = c("quan_original", "quan_updated"), # 同時に複数の重みづけで算出
codify_args = list(
date = "surgery", # ex_people 中の指標日にあたる列
code_date = "admission", # ex_icd10 中の診断日にあたる列
days = c(-90, -1) # Time window を指定(この例では1-90日前)
) )
Classification based on: icd10
# Time window 中に レコードが 1 つも存在しない場合、スコアは NA となることに注意 ch
# 分布の確認
|>
ch mutate(across(starts_with("quan"), ~replace_na(., 0))) |> # NA を 0 に変換
pivot_longer(cols = c(quan_original, quan_updated), names_to = "weight_method", values_to = "score") |>
ggplot() +
aes(score, fill = weight_method) +
geom_bar(position = "dodge", width = 0.5)
comorbidity
パッケージcomorbidity()
で ICD code から併存疾患を抽出し、score()
で CCI を算出する。
以下に vignette を改変したサンプルコードを示す。
library(comorbidity)
# サンプルデータ作成
set.seed(1)
<- data.frame(
df id = sample(seq(100), size = 10000, replace = TRUE),
code = sample_diag(n = 100)) |> # generate ICD-10 code at random
tibble() |>
arrange(id, code)
# CCI の疾患の集計
<- df |>
charlson_df comorbidity(id = "id", code = "code",
map = "charlson_icd10_quan", assign0 = FALSE)
# CCI の計算
<- charlson_df |>
cci_df mutate(id,
original_cci = score(charlson_df, weights = "charlson", assign0 = FALSE),
quan_cci = score(charlson_df, weights = "quan", assign0 = FALSE),
.keep = "none")
# Elixhauser Comorbidity Index: ECI の疾患の集計
<- df |>
elixhauser_df comorbidity(id = "id", code = "code",
map = "elixhauser_icd10_quan", assign0 = FALSE)
# ECI の計算
<- elixhauser_df |>
eci_df mutate(id,
vanwalraven_eci = score(elixhauser_df, weights = "vw", assign0 = FALSE),
sharma_eci = score(elixhauser_df, weights = "swiss", assign0 = FALSE),
.keep = "none")
touch
パッケージICD-9 と ICD-10 の相互変換を行うには、GEMs を用いる方法がある。R で実現するには touch
パッケージが唯一の選択肢である。
使用する際は RDocumentation がわかりやすい。
GEMs による ICD-9-CM → ICD-10-CM 変換には批判も多く存在するため、注意が必要
icd_map()
を使う。
library(touch)
<- c("0011", "001.1", "316", "29383", "E9808", "V90")
icd9codes
icd_map(icd9codes)
[1] "A001" "A001" "F54" "F0630" "" ""
method
で 4 つの変換方法を指定可能
icd
パッケージ現在 CRAN に収載されておらず、上記のパッケージで代替できる機能を使う理由は見当たらないが、ICD code から傷病名を付与する explain_code()
は便利である。
CRAN にないため、GitHub からインストールする。
::install_github("jackwasey/icd")
remotes
# icd を初めて使う場合は以下を実行する
::set_icd_data_dir() icd
explain_code()
library(icd)
<- tibble(icdcode = c("A00", "A000", "C63.0", "C64"))
df_icd10
|>
df_icd10 mutate(name = explain_code(icdcode))
coder
はシンプルな関数群と、豊富なリファレンスがあることより一押しcomorbidity
は、CCI 算出が目的であれば十分icd
は explain_code()
が他のパッケージで代替できない関数となっているtouch
が便利