6

-msSurv-「ワイド」データセットに取り組んでいますが、間隔形式のデータを必要とする特定のパッケージ(ノンパラメトリック多状態モデルの場合)を使用したいと思います。

私の現在のデータセットは、個人ごとに1つの行で特徴付けられます。

dat <- read.table(text = "

   id    cohort   t0    s1     t1     s2      t2     s3    t3
    1      2      0      1     50      2      70     4     100
    2      1      0      2     15      3      100    0     0   

", header=TRUE)

ここcohortで、は時変共変量であり、s1-s3は時変共変量が時間の経過とともに取る値に対応しますs = 1,2,3,4(これらは、時間の経過とともに個人が訪れる別個の状態です)。カレンダーの時間はt1-で定義され、各個人のt3範囲はから0です。100

したがって、たとえば、個人1はカレンダー時間=50まで状態=1にとどまり、次に時間=70まで状態=2にとどまり、最後に時間100まで状態=4にとどまります。

取得したいのは、「間隔」形式のデータセットです。つまり、次のようになります。

id   cohort  t.start    t.stop   start.s   end.s          
1      2        0         50        1        2
1      2       50         70        2        4
1      2       70        100        4        4
2      1        0         15        2        3
2      1       15        100        3        3

例が十分に明確であることを願っています。そうでない場合は、お知らせください。さらに明確にするよう努めます。

この再形成をどのように自動化しますか?私には比較的多数の(シミュレートされた)個人がいて、約100万人いると考えてください。

助けてくれてありがとう。

4

1 に答える 1

6

私は理解したと思います。これは機能しますか?

require(data.table)
dt <- data.table(dat, key=c("id", "cohort"))
dt.out <- dt[,  list(t.start=c(t0,t1,t2), t.stop=c(t1,t2,t3), 
                     start.s=c(s1,s2,s3), end.s=c(s2,s3,s3)), 
                     by = c("id", "cohort")]

#    id cohort t.start t.stop start.s end.s
# 1:  1      2       0     50       1     2
# 2:  1      2      50     70       2     4
# 3:  1      2      70    100       4     4
# 4:  2      1       0     15       2     3
# 5:  2      1      15    100       3     0
# 6:  2      1     100      0       0     0

表示する出力が実際に正しく、必要なものである場合は、さらに2行で取得できます(おそらく最善の方法ではありませんが、それでも高速である必要があります)

# remove rows where start.s and end.s are both 0
dt.out <- dt.out[, .SD[start.s > 0 | end.s > 0], by=1:nrow(dt.out)]
# replace end.s values with corresponding start.s values where end.s == 0
# it can be easily done with max(start.s, end.s) because end.s >= start.s ALWAYS
dt.out <- dt.out[, end.s := max(start.s, end.s), by=1:nrow(dt.out)]
dt.out[, nrow:=NULL]

> dt.out
#    id cohort t.start t.stop start.s end.s
# 1:  1      2       0     50       1     2
# 2:  1      2      50     70       2     4
# 3:  1      2      70    100       4     4
# 4:  2      1       0     15       2     3
# 5:  2      1      15    100       3     3
于 2013-01-26T17:51:19.720 に答える