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
ch # Time window 中に レコードが 1 つも存在しない場合、スコアは NA となることに注意# 分布の確認
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)
df <- data.frame(
id = sample(seq(100), size = 10000, replace = TRUE),
code = sample_diag(n = 100)) |> # generate ICD-10 code at random
tibble() |>
arrange(id, code)
# CCI の疾患の集計
charlson_df <- df |>
comorbidity(id = "id", code = "code",
map = "charlson_icd10_quan", assign0 = FALSE)
# CCI の計算
cci_df <- charlson_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 の疾患の集計
elixhauser_df <- df |>
comorbidity(id = "id", code = "code",
map = "elixhauser_icd10_quan", assign0 = FALSE)
# ECI の計算
eci_df <- elixhauser_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)
icd9codes <- c("0011", "001.1", "316", "29383", "E9808", "V90")
icd_map(icd9codes)[1] "A001" "A001" "F54" "F0630" "" ""
method で 4 つの変換方法を指定可能
icd パッケージ現在 CRAN に収載されておらず、上記のパッケージで代替できる機能を使う理由は見当たらないが、ICD code から傷病名を付与する explain_code() は便利である。
CRAN にないため、GitHub からインストールする。
remotes::install_github("jackwasey/icd")
# icd を初めて使う場合は以下を実行する
icd::set_icd_data_dir()explain_code()library(icd)
df_icd10 <- tibble(icdcode = c("A00", "A000", "C63.0", "C64"))
df_icd10 |>
mutate(name = explain_code(icdcode))coder はシンプルな関数群と、豊富なリファレンスがあることより一押しcomorbidity は、CCI 算出が目的であれば十分icd は explain_code() が他のパッケージで代替できない関数となっているtouch が便利