2016-12-27 6 views
0

spBayesSurvパッケージの関数indeptCoxphを理解しようとしています。 この関数は、ベイジアン比例ハザードモデルに適合します。私はRコードの部分とCoxモデルの理論を理解することにちょっと固執しています。Rのパッケージサンプルコードにぶつかって - モデルに合うデータをシミュレートする

私は著者の例(下記)に取り組んでいます。 彼らは最初にシミュレートされた生存時間のデータを持っています。 ラムダの値が exp(sum(xi * betaT))であることを除いて、CDF F(t)= 1- exp(-λ* t) の指数分布から生存時間をシミュレートしているようです。 ) ではなく、定数です。データをシミュレートするために、パラメータβTはその真の値である固定の定数値を与えられ、xiは予測データである。

質問1 - この定義/形式のラムダは、Cox Hazardモデルのためですか? この例では、著者は生存分布について特別な前提を設定していますか?

## Generate survival times t 

u = pnorm(z); 
t = rep(0, ntot); 
for (i in 1:ntot){ 
t[i] = Finv(u[i], x[i]); 
} 
tTrue = t; #plot(x,t); 

関数FINV(:私は(もちろん、それが終わりに与えられた、以前のコードに依存して)生存時間データを生成するコードの次の重要な部分を理解するで立ち往生してい

質問2- u、xi)は、F(t)= uを満たす生存時間tの値を得ます。ここで、xiは予測変数です。私はなぜあなたが通常のCDFから来なければならないのか本当に分かりません。それらは、多変量正規分布(3つの成分を有する)から単一の引力として「z」を生成し、uは、標準CDF値u = pnorm(z)のベクトルである。 u、z、tとlambdaの関係を明らかにすることができれば、このように "u"を生成する必要があるのか​​どうかは分かりません。 "z"の共分散行列は、コード内の2つの行ベクトルs1とs2から作成者によって生成されますが、生存時間データ "tを持つモデルにちょうど適合していれば、s1、s2の役割を混乱させるでしょう"と予測変数" x "を含む。

著者コード:

############################################################### 
# A simulated data: Cox PH 
############################################################### 

rm(list=ls()) 
library(survival) 
library(spBayesSurv) 
library(coda) 
library(MASS) 
## True parameters 
betaT = c(-1); 
theta1 = 0.98; theta2 = 100000; 
## generate coordinates: 
## npred is the # of locations for prediction 
n = 100; npred = 30; ntot = n + npred; 
ldist = 100; wdist = 40; 
s1 = runif(ntot, 0, wdist); s2 = runif(ntot, 0, ldist); 
s = rbind(s1,s2); #plot(s[1,], s[2,]); 
## Covariance matrix 
corT = matrix(1, ntot, ntot); 
for (i in 1:(ntot-1)){ 
for (j in (i+1):ntot){ 
dij = sqrt(sum((s[,i]-s[,j])^2)); 
corT[i,j] = theta1*exp(-theta2*dij); 
corT[j,i] = theta1*exp(-theta2*dij); 
} 
} 
## Generate x 
x = runif(ntot,-1.5,1.5); 
## Generate transformed log of survival times 
z = mvrnorm(1, rep(0, ntot), corT); 
## The CDF of Ti: Lambda(t) = t; 
Fi = function(t, xi){ 
res = 1-exp(-t*exp(sum(xi*betaT))); 
res[which(t<0)] = 0; 
res 
} 
## The pdf of Ti: 
fi = function(t, xi){ 
res=(1-Fi(t,xi))*exp(sum(xi*betaT)); 
res[which(t<0)] = 0; 
res 
} 
#integrate(function(x) fi(x, 0), -Inf, Inf) 
## true plot 
xx = seq(0, 10, 0.1) 
#plot(xx, fi(xx, -1), "l", lwd=2, col=2) 
#lines(xx, fi(xx, 1), "l", lwd=2, col=3) 

## The inverse for CDF of Ti 
Finvsingle = function(u, xi) { 
res = uniroot(function (x) Fi(x, xi)-u, lower=0, upper=5000); 
res$root 
} 
Finv = function(u, xi) {sapply(u, Finvsingle, xi)}; 

## Generate survival times t 
u = pnorm(z); 
t = rep(0, ntot); 
for (i in 1:ntot){ 
t[i] = Finv(u[i], x[i]); 
} 
tTrue = t; #plot(x,t); 

答えて

1

実際、データは、空間コピュラコックスPHモデルの枠組みの中で生成されます。セクション4.1のthe supplemental material of Zhou et al. (2015)を読むと便利です。非空間的なPHモデルに適合しているので、s1とs2を使わずにデータ生成手順をサンプリングすることができます。新しい例のhttps://stats.stackexchange.com/questions/253368/bayesian-survival-analysisを参照してください。

この新しい例では、f0oft(t)およびS0oft(t)は、それぞれベースライン生存関数です。共変量xを有する対象が与えられると、Sioft(t,x)およびfioft(t,x)は、その対象の生存および密度である。 Finv(u,x)は、Fioft(t,x)=1-Sioft(t,x)の逆関数です。つまり、Finv(u,x)は、Fioft(t,x)=u w.r.t tの解です。

生存データを生成するために、我々は最初の共変量を生成することができます。各共変量ベクトルX、真の生存期間tTを考えると

x1 = rbinom(ntot, 1, 0.5); x2 = rnorm(ntot, 0, 1); X = cbind(x1, x2); 

は理論的根拠がある。ここ

u = runif(ntot); 
    tT = rep(0, ntot); 
    for (i in 1:ntot){ 
     tT[i] = Finv(u[i], X[i,]); 
    } 

として生成することができますそれがT | x〜F(t、x)ならば、F(T、x)〜ユニフォーム(0,1)である。

関連する問題