การคำนวณค่า P ด้วยตนเองจาก t-value ใน t-test


48

ฉันมีชุดข้อมูลตัวอย่างที่มี 31 ค่า ฉันใช้การทดสอบสองทางโดยใช้ R เพื่อทดสอบว่าค่าเฉลี่ยจริงเท่ากับ 10:

t.test(x=data, mu=10, conf.level=0.95)

เอาท์พุท:

t = 11.244, df = 30, p-value = 2.786e-12
alternative hypothesis: true mean is not equal to 10 
95 percent confidence interval:
 19.18980 23.26907 
sample estimates:
mean of x 
 21.22944 

ตอนนี้ฉันกำลังพยายามทำสิ่งเดียวกันด้วยตนเอง:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = dt(t.value, df=length(lengths-1))

ค่า t ที่คำนวณโดยใช้วิธีนี้เหมือนกับเอาต์พุตโดยฟังก์ชัน t-test R อย่างไรก็ตามค่า p ออกมาเป็น 3.025803e-12

ความคิดเห็นใดที่ฉันทำผิด

ขอบคุณ!

แก้ไข

นี่คือรหัส R เต็มรวมถึงชุดข้อมูลของฉัน:

# Raw dataset -- 32 observations
data = c(21.75, 18.0875, 18.75, 23.5, 14.125, 16.75, 11.125, 11.125, 14.875, 15.5, 20.875,
            17.125, 19.075, 25.125, 27.75, 29.825, 17.825, 28.375, 22.625, 28.75, 27, 12.825, 
            26, 32.825, 25.375, 24.825, 25.825, 15.625, 26.825, 24.625, 26.625, 19.625)

# Student t-Test
t.test(x=data, mu=10, conf.level=0.95)

# Manually calculate p-value
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data)))
p.value = dt(t.value, df=length(data) - 1)

คำตอบ:


43

ใช้ptและทำให้มันสองด้าน

> 2*pt(11.244, 30, lower=FALSE)
[1] 2.785806e-12

1
ฉันคิดว่ามีรายละเอียดขาดหายไป: เมื่อใดจึงควรใช้ lower = F - โปรดดูคำถามของฉันที่นี่: stats.stackexchange.com/questions/133091/…
vonjd

3
ค่าต้องเป็นค่าบวกดังนั้นหากใช้สิ่งนี้กับตัวแปรที่อาจเป็นค่าลบให้ตัดabsคำ
แอรอน - คืนสถานะโมนิก้า

3
สำหรับการทดสอบสองแบบคุณกำลังมองหาความน่าจะเป็นที่ค่านั้นน้อยกว่า -11.244 หรือมากกว่า +11.244 lower = F บอกให้ R คำนวณความน่าจะเป็นของค่าที่มากกว่าพารามิเตอร์แรก มิฉะนั้นจะให้ความน่าจะเป็นของค่าที่น้อยกว่าพารามิเตอร์แรก คุณสามารถทำได้ 2 * pt (-11.244, 30) โดยส่วนตัวแล้วฉันมักจะทำ 2 * pt (-abs (q), df = n-1) เป็นค่าเริ่มต้น R ถึงล่าง = T
Ashic

9

ฉันโพสต์สิ่งนี้เป็นความคิดเห็น แต่เมื่อฉันต้องการเพิ่มอีกเล็กน้อยในการแก้ไขมันยาวเกินไปดังนั้นฉันจึงย้ายมันลงมาที่นี่

แก้ไข : สถิติทดสอบและ df ของคุณถูกต้อง คำตอบอื่น ๆ บันทึกปัญหาเกี่ยวกับการคำนวณพื้นที่หางในการเรียกpt()และเพิ่มสองเท่าสำหรับสองหางซึ่งแก้ไขความแตกต่างของคุณ อย่างไรก็ตามฉันจะทิ้งการอภิปราย / ความคิดเห็นไว้ก่อนหน้านี้เพราะมันทำให้ประเด็นที่เกี่ยวข้องโดยทั่วไปเกี่ยวกับค่า p ในหางที่รุนแรง:

อาจเป็นไปได้ว่าคุณไม่ได้ทำอะไรผิดและยังคงมีความแตกต่าง แต่ถ้าคุณโพสต์ตัวอย่างที่ทำซ้ำได้อาจเป็นไปได้ที่จะตรวจสอบเพิ่มเติมว่าคุณมีข้อผิดพลาดหรือไม่ (พูดใน df)

สิ่งเหล่านี้คำนวณจากการประมาณค่าซึ่งอาจไม่แม่นยำเป็นพิเศษในบริเวณท้ายสุด

หากทั้งสองสิ่งไม่ได้ใช้การประมาณแบบเดียวกันพวกเขาอาจไม่เห็นด้วยอย่างใกล้ชิด แต่การขาดข้อตกลงนั้นไม่สำคัญ (สำหรับบริเวณท้ายที่แน่นอนซึ่งมีจำนวนที่มีความหมายมากไปกว่านั้น ความถูกต้อง) คุณมีกฎเกณฑ์ที่แน่นอนความเป็นอิสระที่แน่นอนความแปรปรวนคงที่หรือไม่

2×10123×10120.0001


6

วิธีที่ดีที่สุดในการคำนวณด้วยตนเองคือ:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = 2*pt(-abs(t.value), df=length(data)-1)

1


0

ฉันชอบคำตอบของ @Aaron ที่จัดเตรียมไว้พร้อมกับabsความคิดเห็น ฉันพบว่าการยืนยันที่สะดวกคือการเรียกใช้

pt(1.96, 1000000, lower.tail = F) * 2

0.04999607ซึ่งอัตราผลตอบแทน

ที่นี่เราใช้คุณสมบัติที่รู้จักกันดีว่า 95% ของพื้นที่ภายใต้การแจกแจงแบบปกติเกิดขึ้นที่ ~ 1.96 ส่วนเบี่ยงเบนมาตรฐานดังนั้นผลลัพธ์ของ ~ 0.05 ให้ค่า p ของเรา ฉันใช้ 1000000 ตั้งแต่เมื่อ N มีขนาดใหญ่การแจกแจงแบบ t เกือบจะเหมือนกับการแจกแจงแบบปกติ การทำเช่นนี้ทำให้ฉันรู้สึกสบายใจในโซลูชันของ @ Aaron

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.