如何获取survdiff返回的p值

13

我正在使用R survival包,其中的survdiff函数。我想知道如何从返回值中获取p值。

> diff = survdiff(Surv(Time, Censored) ~ Treatment+Gender, data = dat)
> diff
Call:
survdiff(formula = Surv(Time, Censored) ~ Treatment + Gender, 
    data = dat)

                            N Observed Expected (O-E)^2/E (O-E)^2/V
Treatment=Control, Gender=M 2        1     1.65  0.255876  0.360905
Treatment=Control, Gender=F 7        3     2.72  0.027970  0.046119
Treatment=IND, Gender=M     5        2     2.03  0.000365  0.000519
Treatment=IND, Gender=F     6        2     1.60  0.100494  0.139041

 Chisq= 0.5  on 3 degrees of freedom, p= 0.924 

我希望使用某些函数来获得p值0.924。谢谢。

3个回答

10

在survdiff类中并没有存储p值,因此必须在输出时动态计算。要重新生成p值,可以使用卡方分布函数:"pchisq"。

diff = survdiff(Surv(Time, Censored) ~ Treatment+Gender, data = dat)
pchisq(diff$chisq, length(diff$n)-1, lower.tail = FALSE)

why lower.tail = FALSE? - Ömer An
@Omer An,看到了吗?pchisq:lower.tail逻辑;如果为TRUE(默认),概率是P [X≤x],否则为P [X>x]。 - Dave2e
是的,你为什么要获取 P[X > x] - Ömer An
1
另请参阅 Github 上的 print.survdiff 代码。https://github.com/cran/survival/blob/2a61538b1c71f7b05adf45448b8a68bdb33d41cb/R/print.survdiff.S#L21 - esel
1
经过5年的时间,我明白这与以下内容相同:1 - pchisq(diff$chisq, length(diff$n)-1, lower.tail = TRUE) - Ömer An

6
函数print.survdiff中显示p值的代码为:
cat("\n Chisq=", format(round(x$chisq, 1)), " on", df, 
            "degrees of freedom, p=", format(signif(1 - pchisq(x$chisq, 
                df), digits)), "\n")

代码如下:

if (is.matrix(x$obs)) {
            otmp <- apply(x$obs, 1, sum)
            etmp <- apply(x$exp, 1, sum)
        }         else {
            otmp <- x$obs
            etmp <- x$exp
        }
        df <- (sum(1 * (etmp > 0))) - 1

在参数列表中将“digits”设置为3,因此使用surv.diff帮助页面上的示例:

x <- survdiff(Surv(time, status) ~ pat.karno + strata(inst), data=lung) 
cat( "p=", format(signif(1 - pchisq(x$chisq, 
                 df), digits)) )
#p= 0.00326 

回应评论:在这个例子中,第二个代码块简化为:

 df <- with(x,    (sum(1 * (apply(x$exp, 1, sum) > 0))) - 1 )
> df
[1] 7

感谢您的详细解释! - tsznxyz
我应该将df设置为什么吗?我一直收到这个错误:pchisq(survdiffRes $ chisq,df)中的错误: 数学函数的非数字参数 - JobHunter69

4

使用broom包中的glance()函数非常容易获取p值。

diff = survdiff(Surv(Time, Censored) ~ Treatment+Gender, data = dat)

broom::glance(diff)$p.value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接