首页 > 解决方案 > 在 survdiff 中获得更高的 pvalue 精度

问题描述

我正在使用生存包运行 survdiff,p 值为 0.02。我希望看到它具有更高的精度(即 0.02xxxx)。有没有我可以传递的参数来指定 pvalue 的长度。我阅读了生存包的文档,但没有找到任何关于如何指定它的说明。

survdiff(surv_object~access_sam2$Area_mTLSHL)

标签: r

解决方案


学分。

类对象的 p 值的计算"survdiff"并不完全显而易见。我必须查看print该类对象的方法中发生了什么,以了解计算自由度的方式。

下面的代码是代码的简化,print.survdiff因此学分转到

citation("survival")
#
#Therneau T (2015). _A Package for Survival Analysis
#in S_. version 2.38, <URL:
#https://CRAN.R-project.org/package=survival>.
#
#Terry M. Therneau, Patricia M. Grambsch (2000).
#_Modeling Survival Data: Extending the Cox Model_.
#Springer, New York. ISBN 0-387-98784-3.
#
#To see these entries in BibTeX format, use
#'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or
#set 'options(citation.bibtex.max=999)'.

代码本身可以在源代码中看到或通过运行

getAnywhere("print.survdiff")

现在解决问题的问题。

我编写了一个通用pvalue函数,以便更轻松地为 function 返回的类的对象调用方法survdiff。该示例取自该功能的帮助页面。
返回值是一个有 3 个成员的命名列表,名称是不言自明的。其中之一chisq是重复返回的值survdiff。为了完整起见,我将其包括在内。

pvalue <- function(x, ...) UseMethod("pvalue")
pvalue.survdiff <- function (x, ...) 
{
  if (length(x$n) == 1) {
    df <- 1
    pval <- pchisq(x$chisq, 1, lower.tail = FALSE)
  } else {
    if (is.matrix(x$obs)) {
      otmp <- rowSums(x$obs)
      etmp <- rowSums(x$exp)
    } else {
      otmp <- x$obs
      etmp <- x$exp
    }
    df <- sum(etmp > 0) - 1
    pval <- pchisq(x$chisq, df, lower.tail = FALSE)
  }
  list(chisq = x$chisq, p.value = pval, df = df)
}

srv <- survdiff(Surv(futime, fustat) ~ rx, data = ovarian)

pvalue(srv)
#$chisq
#[1] 1.06274
#
#$p.value
#[1] 0.3025911
#
#$df
#[1] 1

推荐阅读