Menghitung nilai P secara manual dari nilai-t dalam uji-t

49

Saya memiliki dataset sampel dengan 31 nilai. Saya menjalankan uji dua sisi menggunakan R untuk menguji apakah rata-rata sebenarnya sama dengan 10:

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

Keluaran:

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 

Sekarang saya mencoba melakukan hal yang sama secara manual:

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

Nilai-t yang dihitung menggunakan metode ini sama dengan output oleh fungsi t-test R. Nilai p, bagaimanapun, keluar menjadi 3.025803e-12.

Ada ide yang saya lakukan salah?

Terima kasih!

SUNTING

Ini adalah kode R lengkap, termasuk dataset saya:

# 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)
herbps10
sumber

Jawaban:

43

Gunakan ptdan buat menjadi dua sisi.

> 2*pt(11.244, 30, lower=FALSE)
[1] 2.785806e-12
Aaron - Pasang kembali Monica
sumber
1
Saya pikir ada detail yang hilang: Kapan menggunakan lower = F? - Silakan lihat pertanyaan saya di sini: stats.stackexchange.com/questions/133091/…
vonjd
3
Nilai harus positif, jadi jika menggunakan ini dengan variabel yang bisa negatif, bungkus abs.
Aaron - Pasang kembali Monica
3
Untuk tes dua sisi, Anda mencari probabilitas bahwa nilainya kurang dari -11.244 atau lebih dari +11.244. lower = F memberitahu R untuk menghitung probabilitas nilai lebih dari parameter pertama. Jika tidak, ini memberi Anda kemungkinan nilainya kurang dari parameter pertama. Dengan demikian, Anda juga bisa melakukan 2 * pt (-11.244, 30). Secara pribadi, saya biasanya melakukan 2 * pt (-ab (q), df = n-1) sebagai R default menjadi lebih rendah = T.
ashic
9

Saya memposting ini sebagai komentar tetapi ketika saya ingin menambahkan sedikit lebih banyak di edit, itu menjadi terlalu lama sehingga saya memindahkannya ke sini.

Sunting : Statistik pengujian dan df Anda benar. Jawaban lain mencatat masalah dengan perhitungan area ekor pada panggilan ke pt(), dan penggandaan untuk dua-ekor, yang menyelesaikan perbedaan Anda. Namun demikian saya akan meninggalkan diskusi / komentar saya sebelumnya karena membuat poin yang relevan lebih umum tentang nilai-p di ekor ekstrim:

Mungkin saja Anda tidak melakukan kesalahan apa pun dan masih mendapatkan perbedaan, tetapi jika Anda memposting contoh yang dapat direproduksi, Anda dapat menyelidiki lebih lanjut apakah Anda memiliki kesalahan (misalnya dalam df).

Hal-hal ini dihitung dari perkiraan yang mungkin tidak terlalu akurat di bagian paling ekstrem.

Jika kedua hal tersebut tidak menggunakan perkiraan yang identik, mereka mungkin tidak setuju secara dekat, tetapi kurangnya kesepakatan tidak menjadi masalah (untuk wilayah ekor yang tepat sejauh itu menjadi angka yang bermakna, asumsi yang diperlukan harus berpegang pada derajat yang mengejutkan dari ketepatan). Apakah Anda benar-benar memiliki normalitas, kemandirian yang tepat, varian yang konstan?

2×10-123×10-120,0001

Glen_b
sumber
7

Cara terbaik untuk menghitungnya secara manual adalah:

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

1

vonjd
sumber
0

Saya sangat suka jawaban @ Harun yang diberikan, bersama dengan abskomentar. Saya menemukan konfirmasi berguna untuk dijalankan

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

yang menghasilkan 0.04999607.

Di sini, kami menggunakan properti terkenal bahwa 95% dari area di bawah distribusi normal terjadi pada ~ 1,96 standar deviasi, sehingga output ~ 0,05 memberikan nilai-p kami. Saya menggunakan 1000000 karena ketika N sangat besar, distribusi t hampir sama dengan distribusi normal. Menjalankan ini memberi saya kenyamanan dalam solusi @ Aaron.

ColoradoGranite
sumber