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);