[英]Do R classes change numeric values?
由於我在這里已經遇到過類似的問題,所以我遇到了另一個問題: stats::t.test
返回的p-value < 2.2e-16
。 但是從數學中我得到p_value <- 2 * pt(-abs(t), df) # [1] 1.929352e-17
。 怎么了?
我剛剛開始按照那里的建議進行調試:
debug(stats:::t.test.default)
vals <- data.frame(a = c(4, 2, 4, 7, 3, 4, 8, 8, 3, 0, 1, 5, 4, 6, 4, 8, 7,
9, 6, 6, 3, 6, 7, 4),
b = c(5, 7, 6, 13, 12, 6, 14, 16, 4, 2, 7, 7, 4, 8, 9, 9,
11, 13, 12, 8, 3, 8, 7, 7))
stats::t.test(x = vals)
# One Sample t-test
# data: vals
# t = 13.214, df = 47, p-value < 2.2e-16
然后逐步走到第98行,
其中pval
評估為1.929352e-17
,這是我期望的。 這一直保持不變,直到第112行,其中將類設置為class(rval) <- "htest"
。
怎么了? 類會改變值嗎? 不幸的是,我不知道如何理解/調試第112行后面的代碼。
不會。類不會更改值,但它們會更改其打印方式。 由於返回的類是htest
對象,因此使用stats:::print.htest()
繪制結果。 為了使內容更美觀,此函數將數字格式化,以便它們具有合理的小數位數。 它使用format.pval
函數使p值看起來很漂亮。 在p值變得很小之后,顯示所有數字並沒有多大意義,因此R只是在某個時候告訴您它小於certian值。 例如
format.pval(1e-20)
# [1] "< 2.22e-16
“真實”值仍存儲在對象中
x <- stats::t.test(x = vals)
x$p.value
# [1] 1.929352e-17
這是R中非常常見的模式,其中僅print()
賦值並不一定顯示那里的“真正”內容。 這只是該對象的漂亮展示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.