基于 ICD-10 标准的抑郁症严重程度 R 代码

问题描述 投票:0回答:1

我正在尝试根据 ICD-10 标准和 MDI(重度抑郁量表)的数据提出抑郁症严重程度的 R 代码。该问卷由 12 个问题组成(mdi_1、mdi_2、mdi_3、 mdi_4、mdi_5、mdi_6、mdi_7、mdi_8a、mdi_8b、mdi_9、mdi_10a、mdi_10b)。前三个问题描述了主要标准(粗体),其余问题描述了次要标准。对于问题 8 (a,b) 和 10 (a,b),仅计算较高的值。

ICD-10 轻度抑郁症标准规定,至少 2 个主要标准(即问题 1-3)必须评分至少 4 分,其余 7 项中的 2 或 3 项必须评分至少 3 分。

我目前正在尝试通过映射每个可能的条件来用

dplyr
mutate
case_when
来实现这一点,但我想知道是否有更简洁的方法。

其他抑郁症严重程度类别的工作原理类似,因此通过针对“轻度抑郁症”的简洁解决方案,我可以将其适应其余类别。

谢谢您的帮助!

df |> 
  mutate(mdi_cat =
           case_when(
                 # Check if at least 2 out of the first 3 questions have a score of at least 4
                 (mdi_1 >= 4 & mdi_2 >= 4) | (mdi_1 >= 4 & mdi_3 >= 4) | (mdi_2 >= 4 & mdi_3 >= 4) &
                 # Check if 2 or 3 of the remaining 7 questions have a score of at least 3
                 ((mdi_4 >= 3 & mdi_5 >= 3) | (mdi_4 >= 3 & mdi_6 >= 3) | (mdi_4 >= 3 & mdi_7 >= 3) | ...
                  (mdi_4 >= 3 & mdi_5 >= 3 & mdi_6 >= 3) | (mdi_4 >= 3 & mdi_5 >= 3 & mdi_7 >= 3) | ... 
                  ) ~ "mild",
                 TRUE ~ "no" 
               ))```
r dplyr case tidy icd
1个回答
0
投票

您可以使用

across()
rowSums()
来确定满足最低分数或分数条件的问题数量,而不是检查每个可能的条件。然后您可以轻松检查个人是否满足这两个条件。第一步,我使用
pmax
将 a/b 问题折叠到一个包含最高分数的新列中。

使用一些虚假的随机示例数据:

set.seed(123)

n <- 10
max_pt <- 6

df <- data.frame(
  mdi_1 = sample(max_pt, n, replace = TRUE),
  mdi_2 = sample(max_pt, n, replace = TRUE),
  mdi_3 = sample(max_pt, n, replace = TRUE),
  mdi_4 = sample(max_pt, n, replace = TRUE),
  mdi_5 = sample(max_pt, n, replace = TRUE),
  mdi_8a = sample(max_pt, n, replace = TRUE),
  mdi_8b = sample(max_pt, n, replace = TRUE),
  mdi_10a = sample(max_pt, n, replace = TRUE),
  mdi_10b = sample(max_pt, n, replace = TRUE)
)

library(dplyr, warn=FALSE)

df |> 
  mutate(
    mdi_8 = pmax(mdi_8a, mdi_8b),
    mdi_10 = pmax(mdi_10a, mdi_10b)
  ) |> 
  mutate(
    # Number of first three questions with at least 4 points
    n_mdi_cat1 = rowSums(across(any_of(paste0("mdi_", 1:3)), ~ .x >= 4)),
    # Number of other questions with at least 3 points
    n_mdi_cat2 = rowSums(across(any_of(paste0("mdi_", 4:10)), ~ .x >= 3)),
    mdi_cat = case_when(
      n_mdi_cat1 >= 2 & n_mdi_cat2 >= 2 ~ "mild",
      .default = "no"
    )
  )
#>    mdi_1 mdi_2 mdi_3 mdi_4 mdi_5 mdi_8a mdi_8b mdi_10a mdi_10b mdi_8 mdi_10
#> 1      3     6     1     1     4      5      4       1       1     5      1
#> 2      6     1     5     3     5      2      4       2       6     4      6
#> 3      3     2     3     5     5      1      6       4       1     6      4
#> 4      2     3     2     4     3      1      6       5       3     6      5
#> 5      2     5     2     2     6      3      3       5       6     3      6
#> 6      6     3     1     5     1      1      6       6       4     6      6
#> 7      3     3     6     1     2      6      6       3       1     6      3
#> 8      5     1     3     1     5      5      1       1       6     5      6
#> 9      4     4     4     2     5      1      6       4       6     6      6
#> 10     6     1     6     3     4      2      2       6       3     2      6
#>    n_mdi_cat1 n_mdi_cat2 mdi_cat
#> 1           1          2      no
#> 2           2          4    mild
#> 3           0          4      no
#> 4           0          4      no
#> 5           1          3      no
#> 6           1          3      no
#> 7           1          2      no
#> 8           1          3      no
#> 9           3          3    mild
#> 10          2          3    mild
© www.soinside.com 2019 - 2024. All rights reserved.