前言

起初听到这个我是不理解的,这不是统计学常识吗?划分三个程度:* ,** ,***。
头儿咋还要精确到小数位,不是画蛇添足吗?不了解归不了解,该干还是要干。


目录

  • 前言
  • 一、P值
  • 二、生存分析
  • 三、“锦上添花”
  • 3.1 计算P值
  • 3.2 带-次方的调整P值
  • 3.3 不带次方的调整P值
  • 3.4 小数点后无0的调整P值
  • 四、用两个if解决

一、P值

关于显著性检验偷懒,找到一篇很典型的抛硬币可以回顾或预习,浅谈p值(p-value是什么)

P值

P值解释

统计意义

>0.05

碰巧出现的可能性大于5%,不能否定原假设

无统计学差异

<0.05

碰巧出现的可能性小于5%,可以否定原假设

有统计学差异

<0.01

碰巧出现的可能性小于1%,可以否定原假设

有显著统计学差异

<0.001

碰巧出现的可能性小于0.1%,可以否定原假设

有极其显著统计学差异

二、生存分析

关于生存分析上篇有提过,单分组直接删掉循环即可,用for循环批量生存分析

像这样的生存曲线可以接受,但是“你这个不行,要看到具体P值”
虽然说不难,但是确实是有点迷惑行为,不过还得开整。

r语言零假设检验均值是否为0 r语言假设检验p值_数位

三、“锦上添花”

3.1 计算P值

继续用我的循环来记录,单分组把 data[,i] 换成具体分组变量即可

#survfit构建完生存模型后,用survdiff计算生存差异
    surv_diff <- survdiff(Surv(data$time, data$status) ~ data[,i], data = data)
    p.value <- 1 - pchisq(surv_diff$chisq, length(surv_diff$n) -1)#提p值

r语言零假设检验均值是否为0 r语言假设检验p值_r语言零假设检验均值是否为0_02

若直接添加到图上是这样的,预言一波“你这个不行,P值太长了”

r语言零假设检验均值是否为0 r语言假设检验p值_for循环_03

3.2 带-次方的调整P值

像这种带-次方的可以缩小数位

lastnum <- substr(p.value, nchar(p.value) - 1 + 1, nchar(p.value))
    lastnum <- as.numeric(lastnum)

r语言零假设检验均值是否为0 r语言假设检验p值_r语言零假设检验均值是否为0_04


r语言零假设检验均值是否为0 r语言假设检验p值_for循环_05

再预言一波“你这个不行,太短了很奇怪”

3.3 不带次方的调整P值

小数点后三个0直接取有效小数

r语言零假设检验均值是否为0 r语言假设检验p值_数位_06


这里取三位

p.value <- signif(p.value,3)

r语言零假设检验均值是否为0 r语言假设检验p值_r语言_07

3.4 小数点后无0的调整P值

像这种情况直接开摆就行了,P值0.05好歹也有一个0,做批量分析时这种直接不要了,所以显示多少位没啥区别

r语言零假设检验均值是否为0 r语言假设检验p值_数位_08

四、用两个if解决

交差的全部代码

surv_diff <- survdiff(Surv(data$time, data$status) ~ data[,i], data = data)#计算提取p值
    p.value <- 1 - pchisq(surv_diff$chisq, length(surv_diff$n) -1)#打印p值
    
    lastnum <- substr(p.value, nchar(p.value) - 1 + 1, nchar(p.value))#提取次方数
    lastnum
    lastnum <- as.numeric(lastnum)#转换数值类型
    lastnum
    if(lastnum<4)
    {pvalue <- round(p.value,lastnum)}else
    {pvalue <- round(p.value,3)}
    if(pvalue<1)
    {p.value <- signif(p.value,3)}else
    {p.value <- pvalue}

然后画图改p值

pval=p.value

这样在循环出的每一张生存曲线的P值小数位都刚好合适了

r语言零假设检验均值是否为0 r语言假设检验p值_开发语言_09