如何在 R 中只打印 4 位而不是科学记数法的 p 值?我尝试使用选项(数字 = 3,scipen = 12),但它不起作用......这是一个例子......
>options(digits=3, scipen=12)
>Oi <- c(A=321, B=712, C=44)
>Ei <- c(A=203, B=28, C=6)
>chisq.test(Oi, p=Ei,rescale.p=T)"
如何在 R 中只打印 4 位而不是科学记数法的 p 值?我尝试使用选项(数字 = 3,scipen = 12),但它不起作用......这是一个例子......
>options(digits=3, scipen=12)
>Oi <- c(A=321, B=712, C=44)
>Ei <- c(A=203, B=28, C=6)
>chisq.test(Oi, p=Ei,rescale.p=T)"
不太确定你想要什么。感谢您提供可重现的示例:输出是
cc <- chisq.test(Oi,p=Ei,rescale.p=TRUE)
print(cc)
Chi-squared test for given probabilities
data: Oi
X-squared = 3090, df = 2, p-value < 0.00000000000000022
检查对象的结构会发现,在这种情况下,p 值已下溢到恰好为零:
List of 9
$ statistic: Named num 3090
..- attr(*, "names")= chr "X-squared"
$ parameter: Named num 2
..- attr(*, "names")= chr "df"
$ p.value : num 0
$ method : chr "Chi-squared test for given probabilities"
$ data.name: chr "Oi"
$ observed : Named num [1:3] 321 712 44
..- attr(*, "names")= chr [1:3] "A" "B" "C"
$ expected : Named num [1:3] 922.5 127.2 27.3
..- attr(*, "names")= chr [1:3] "A" "B" "C"
$ residuals: Named num [1:3] -19.8 51.8 3.2
..- attr(*, "names")= chr [1:3] "A" "B" "C"
$ stdres : Named num [1:3] -52.29 55.2 3.25
..- attr(*, "names")= chr [1:3] "A" "B" "C"
- attr(*, "class")= chr "htest"
我认为,如果您想从该测试中获得确切的 p 值,则必须采取一些措施:
(pval <- pchisq(3090,2,lower.tail=FALSE,log.p=TRUE))
[1] -1545
所以这大约是 10^ pval/log(10)
= 10^(-671) [R 的最小可表示值通常在 1e-308 左右,请参阅.Machine$double.xmin
]
我也不确定你想要什么,但我猜你正在寻找类似 <0.0001 的东西,类似于 SAS 输出的东西。我会使用这个format.pval
函数,或者可能printCoefmat
,这取决于你有多少测试。 eps
是公差;低于该值的值打印为< [eps]
.
Oi <- c(A=321, B=712, C=44)
Ei <- c(A=203, B=28, C=6)
tt <- chisq.test(Oi, p=Ei,rescale.p=T)
format.pval(tt$p.value, eps=0.0001)
# [1] "<0.0001"
ttp <- data.frame(Chisq=tt$statistic, p.value=tt$p.value)
rownames(ttp) <- "Oi vs Ei"
printCoefmat(ttp, has.Pvalue=TRUE, eps.Pvalue=0.0001)
# Chisq p.value
# Oi vs Ei 3090 <0.0001 ***
# ---
# Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1