在 Cox PH 模型的模拟中获得所需百分比的删失观察

机器算法验证 r 优化 审查 cox模型
2022-03-24 06:20:54

这个问题来自:

如何模拟具有变化点的 Cox 比例风险模型并在 R 中对其进行编码(参见答案)

我想生成一个审查变量选择适当的值来创建所需的审查百分比例如 33%、55% 等。C=Exponential(θ)Yθ

为了在我为上一个问题所做的代码中包含这个审查变量,我将它添加到数据帧生成器中:

cen <- rexp(n,theta) # Censoring variable.

ycen <- pmin(Y, cen) # Censoring effect.
di <- as.numeric(Y <= cen)

...

if (surv.df) data.frame(Y,X,ycen,di) else cbind(Y,X,ycen,di)

做这样的事情(在上述模拟的背景下):

coxph(Surv(ycen, di)~X)

我应该选择哪个值?θ

1个回答

我不确定这是否能回答您的问题,但请在下面找到 Bender 等人的一些 R 代码。(2005 年)。他们描述了一种模拟 Cox PH 回归模型的方法,该模型具有给定的属性,例如被审查事件的比例(见行“ dat <- data.frame(T = T, X, event = rbinom(n, 1, 0.30))”,即所有事件的 70% 被审查)。

参考

本德尔、拉尔夫、托马斯·奥古斯丁和玛丽亚·布莱特纳。2005. 生成生存时间以模拟 Cox 比例风险模型。医学统计 24:1713-1723。

##' Generate survival data with $p$ (correlated) predictors
##'
##' 
##'
##' @title Generate survival data
##' @param n Sample size
##' @param beta Vector of coefficients
##' @param r Correlation between predictors
##' @param id.iter 
##' @param id.study
##' @return matrix with identification variables id.iter and id.study,
##'         T (survival time), event (0: censored),
##'         predictors X1 to X$p$
##' @author Bernd Weiss
##' @references Bender et al. (2005)
genSurvData <- function(n = 100000,
                        beta = c(0.8, 2.2, -0.5, 1.1, -1.4),
                        r = 0.1,
                        id.iter = NA,
                        id.study = NA){

    ## Scale parameter (the smaller lambda, the greater becomes T)
    lambda <- 0.000001#1.7

    ## Shape parameter
    nue <- 8.9#9.4

    ## Sample size
    n <- n

    ## Number of predictors
    p <- length(beta)

    ## Generate column vector of coefficients
    beta <- matrix(beta, ncol = 1)

    ## Generate correlated covariate vectors using a multivariate normal
    ## distribution with X ~ N(mu, S) and a given correlation matrix R, with:
    ## R: A p x p correlation matrix
    ## mu: Vector of means
    ## SD: Vector of standard deviations
    ## S: Variance-covariance matrix
    R <- matrix(c(rep(r, p^2)), ncol = p)
    diag(R) <- 1
    R
    mu <- rep(0, p)
    SD <- rep(1, p)
    S <- R * (SD %*% t(SD))
    X <- mvrnorm(n, mu, S)
    cov(X)
    cor(X)
    sqrt(diag(cov(X)))

    ## Calculate survival times
    T <- (-log(runif(n)) / (lambda * exp(X %*% beta)))^(1/nue)

    ## 30% (0.30) of all marriages are getting divorced, i.e. 70% of all
    ## observations are censored ("event = rbinom(n, 1, 0.30)")
    dat <- data.frame(T = T, X, event = rbinom(n, 1, 0.30))
    ## Also, all T's > 30 yrs are by definition censored and T is set to 30 yrs
    dat$event <- ifelse(dat$T >= 30, 0, dat$event)
        dat$T <- ifelse(dat$T >= 30, 30, dat$T)

    dat$id.iter <- id.iter
    dat$id.study <- id.study

    ## Reorder data frame: T, event, covariates
    tmp.names <- names(dat)
    dat <- dat[, c("id.iter", "id.study", "T", "event", tmp.names[grep("X", tmp.names)])]

    ## Returning a matrix speeds-up things a lot... lesson learned.
    dat <- as.matrix(dat)
    return(dat)
}


library(survival)
library(MASS)

dat <- genSurvData(n = 1000)
dat <- as.data.frame(dat)

survfit(Surv(time = T, event = event) ~ 1, data = dat)

coxph(Surv(time = T, event = event) ~ X1 + X2 + X3 +X4 +X5, data = dat)