使用 mstate 进行 R 多状态分析

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

我正在尝试使用 mstate 包使用以下代码构建一个用于 R 中多状态分析的数据框:

tmat <- transMat(x = list( c(2, 10), c(3, 10), c(4, 10), c(5, 10), c(6, 10), c(7, 10), c(8, 10), c(9, 10), c(10), c()),
                 names = c("start", "aki_1", "rec_1", "aki_2", "rec_2", "aki_3", "rec_3", "aki_4", "rec_4", "death"))

tmat
from    start aki_1 rec_1 aki_2 rec_2 aki_3 rec_3 aki_4 rec_4 death
  start    NA     1    NA    NA    NA    NA    NA    NA    NA     2
  aki_1    NA    NA     3    NA    NA    NA    NA    NA    NA     4
  rec_1    NA    NA    NA     5    NA    NA    NA    NA    NA     6
  aki_2    NA    NA    NA    NA     7    NA    NA    NA    NA     8
  rec_2    NA    NA    NA    NA    NA     9    NA    NA    NA    10
  aki_3    NA    NA    NA    NA    NA    NA    11    NA    NA    12
  rec_3    NA    NA    NA    NA    NA    NA    NA    13    NA    14
  aki_4    NA    NA    NA    NA    NA    NA    NA    NA    15    16
  rec_4    NA    NA    NA    NA    NA    NA    NA    NA    NA    17
  death    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA

dlong <- msprep(time = c(NA, "aki_1_time",  "rec_1_time", "aki_2_time",  "rec_2_time", 
                         "aki_3_time",  "rec_3_time", "aki_4_time",  "rec_4_time", "death_time"),
                status = c(NA, "aki_1_status",  "rec_1_status", "aki_2_status",  "rec_2_status", 
                           "aki_3_status",  "rec_3_status", "aki_4_status",  "rec_4_status", "death_status"),
                data = d, id = "subject", trans = tmat)

但是,msprep 不断返回:时间[,-startings] 错误:维数不正确。我检查过,所有变量都存在于数据集中,拼写正确,并且没有缺失值。另外,我相信转移矩阵指定正确。

我认为这可能与起始状态“start”有关,为此我在时间和状态上都填写了 NA,但这是根据 Rdocumentation 应该完成的方式。

数据集如下所示:

    subject aki_1_status aki_1_time rec_1_status rec_1_time aki_2_status aki_2_time rec_2_status rec_2_time aki_3_status aki_3_time rec_3_status rec_3_time
1 1            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2
2 2            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2
3 4            1        6.1            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2
4 5            1        2.1            1       10.1            0       90.2            0       90.2            0       90.2            0       90.2
5 6            1        3.1            1       11.1            1       31.1            1       47.1            0       90.2            0       90.2
6 8            1        1.1            0       90.2            0       90.2            0       90.2            0       90.2            0       90.2
  aki_4_status aki_4_time rec_4_status rec_4_time death_status death_time
1            0       90.2            0       90.2            0       90.2
2            0       90.2            0       90.2            0       90.2
3            0       90.2            0       90.2            1       11.2
4            0       90.2            0       90.2            0       90.2
5            0       90.2            0       90.2            0       90.2
6            0       90.2            0       90.2            1        2.2  



有人有解决办法吗?

r survival-analysis
1个回答
0
投票

这可能是一个错误?如果您查看

mstate:::msprepEngine
的代码,它假设
time
参数是一个矩阵。然而,在最后一次迭代中,当只有一行时,
time
变成一个向量(表示矩阵的最后一行)。

我可以通过在

msprepEngine
函数中添加一行,将
time
更改回矩阵(就在调用
Recall
之前)来防止错误。

所以

msprepEngine
的最后两行变成:

if (!is.matrix(time)) 
    time <- matrix(time, nrow = 1)
Recall(time = time[, -startings], status = status[, -startings], 
    id = id, starttime = newtime, startstate = newstate, 
    trans = trans[-startings, -startings], originalStates = originalStates[-startings], 
    longmat = longmat)

然后函数运行,我得到:

> dlong
An object of class 'msdata'

Data:
   subject from to trans Tstart Tstop time status
1        1    1  2     1    0.0  90.2 90.2      0
2        1    1 10     2    0.0  90.2 90.2      0
3        2    1  2     1    0.0  90.2 90.2      0
4        2    1 10     2    0.0  90.2 90.2      0
5        4    1  2     1    0.0   6.1  6.1      1
6        4    1 10     2    0.0   6.1  6.1      0
7        4    2  3     3    6.1  11.2  5.1      0
8        4    2 10     4    6.1  11.2  5.1      1
9        5    1  2     1    0.0   2.1  2.1      1
10       5    1 10     2    0.0   2.1  2.1      0
11       5    2  3     3    2.1  10.1  8.0      1
12       5    2 10     4    2.1  10.1  8.0      0
13       5    3  4     5   10.1  90.2 80.1      0
14       5    3 10     6   10.1  90.2 80.1      0
15       6    1  2     1    0.0   3.1  3.1      1
16       6    1 10     2    0.0   3.1  3.1      0
17       6    2  3     3    3.1  11.1  8.0      1
18       6    2 10     4    3.1  11.1  8.0      0
19       6    3  4     5   11.1  31.1 20.0      1
20       6    3 10     6   11.1  31.1 20.0      0
21       8    1  2     1    0.0   1.1  1.1      1
22       8    1 10     2    0.0   1.1  1.1      0
23       8    2  3     3    1.1   2.2  1.1      0
24       8    2 10     4    1.1   2.2  1.1      1

但是我不知道这是否是正确的输出!您可以检查它或联系软件包作者。

© www.soinside.com 2019 - 2024. All rights reserved.