我正在尝试使用 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
有人有解决办法吗?
这可能是一个错误?如果您查看
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
但是我不知道这是否是正确的输出!您可以检查它或联系软件包作者。