0

別のR初心者の質問。

私は、生存分析を使用する必要があるプロジェクトに取り組んでいます。具体的には、離散単位の生存分析を使用する必要があります (したがって、DV が連続的であると仮定する Cox 回帰やその他の方法は問題外です)。

データセットを長い形式に変換しました。(STEP 1) 最後に変数 ("q") =1 を見つけて打ち切り DV ("dv") を作成する必要があります。(STEP 2) time+1 で "dv" を "0" として記録します。(STEP 3) time+2...n で「dv」を「NA」として再コーディングします。(STEP 4) "dv"=NA の場合のすべての観測 (行) を削除します。

これを行う前に、デフォルトで「1」に割り当てられている DV を作成する必要があるようです。ステップ 3 の後、私のデータは次のようになります。

 id  time q  dv   
 1    1   1   1
 1    2   0   1
 1    3   1   1
 1    4   0   0
 1    5   0   NA
 1    6   0   NA
 2    1   1   1
 2    2   1   1
 2    3   0   0
 2    4   0   NA
 2    5   0   NA
 2    6   0   NA

「q」は時間の経過とともに「0」または「1」の間で変化する可能性があることに注意してください (時間 = 2 での id=1 の観察を参照)。ただし、生存分析の性質上、「dv」は変化しません。私がする必要があるのは、「q」が「1」と「0」の間で変化する最後の時間を見つけ、それに応じて打ち切られる変数を作成することです。ステップ 4 の後、データは次のようになります。

 id  time q  dv   
 1    1   1   1
 1    2   0   1
 1    3   1   1
 1    4   0   0
 2    1   1   1
 2    2   1   1
 2    3   0   0

可能な限りのすべての助けをありがとう!

4

1 に答える 1

0

これは意図したよりも冗長になりましたが、長い形式のスニペットの役割を果たします。

提供されたデータから始めますが、longではなくwideを使用します。

zz <- textConnection("id  time q  dv   
1    1   1   1
1    2   0   1
1    3   1   1
1    4   0   0
1    5   0   NA
1    6   0   NA
2    1   1   1
2    2   1   1
2    3   0   0
2    4   0   NA
2    5   0   NA
2    6   0   NA
")
d <- read.table(zz, header = TRUE)
d$dv <- NULL
close(zz)

# start out with wide instead of long
dw <- reshape(d, direction='wide', timevar="time", sep="") 
dw
##   id q1 q2 q3 q4 q5 q6
## 1  1  1  0  1  0  0  0
## 7  2  1  1  0  0  0  0

幅の広い行/観測ごとに適切な「dv」変数を生成する関数を使用します。

censor <- function(periods) {
  n <- length(periods)
  cperiods <- periods*1:n # multiply to get positions
  n.obs <- max(cperiods) # position of last q=1, and one q=0  
  periods[(n.obs+1):n] <- NA # NA's for periods outside observed range
  n.cens <- n - n.obs - 1 # number censored
  c(rep(1, n.obs-1), 0, rep(NA, n.cens+1)) # fill "dv" accordingly
}

上記の関数を適用すると、適切に打ち切られたワイドデータセットが得られます。

#censored()を適用し、ワイドフォーマットでdv変数を作成します
dw.censored <-data.frame(t(apply(dw、1、FUN = censor)))
dw.censored
##   X1 X2 X3 X4 X5 X6 X7
## 1  1  1  1  0 NA NA NA
## 7  1  1  0 NA NA NA NA

ここで、長い形式に戻ります(美的な形式、順序付けなど)

dl.censored <- reshape(dw.censored, varying = 1:7, timevar = "time", 
                       sep = "", direction = "long")
dl.censored <- dl.censored[order(dl.censored$id, dl.censored$time),]
dl.censored$dv <- dl.censored$X
rownames(dl.censored) <- dl.censored$X <- NULL
dl.censored

##    time id dv
## 1     1  1  1
## 2     2  1  1
## 3     3  1  1
## 4     4  1  0
## 5     5  1 NA
## 6     6  1 NA
## 7     7  1 NA
## 8     1  2  1
## 9     2  2  1
## 10    3  2  0
## 11    4  2 NA
## 12    5  2 NA
## 13    6  2 NA
## 14    7  2 NA

そしてNAなしで:

dl.censored <-na.omit(dl.censored)#NAなし
dl.censored
##    time id dv
## 1     1  1  1
## 2     2  1  1
## 3     3  1  1
## 4     4  1  0
## 8     1  2  1
## 9     2  2  1
## 10    3  2  0
于 2012-07-12T16:18:39.393 に答える