Bagaimana cara melakukan ANOVA Tipe-III SS di R dengan kode kontras?

26

Harap berikan kode R yang memungkinkan seseorang untuk melakukan ANOVA antar-subyek dengan -3, -1, 1, 3 kontras. Saya mengerti ada perdebatan mengenai tipe Sum of Squares (SS) yang sesuai untuk analisis semacam itu. Namun, sebagai tipe standar SS yang digunakan dalam SAS dan SPSS (Tipe III) dianggap standar di daerah saya. Jadi saya ingin hasil analisis ini untuk mencocokkan dengan sempurna apa yang dihasilkan oleh program statistik tersebut. Agar diterima suatu jawaban harus langsung memanggil aov (), tetapi jawaban lain dapat dipilih (khususnya jika mudah dimengerti / digunakan).

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

Sunting: Harap dicatat, kontras yang saya minta bukanlah kontras linear atau polinomial yang sederhana tetapi merupakan kontras yang diturunkan oleh prediksi teoretis, yaitu jenis kontras yang dibahas oleh Rosenthal dan Rosnow.

russellpierce
sumber
5
Saya mengerti bahwa Anda memerlukan jumlah Tipe III, tetapi artikel ini ( stats.ox.ac.uk/pub/MASS3/Exegeses.pdf ) adalah bacaan yang bagus. Ini menggambarkan beberapa poin menarik.
suncoolsu
Mengenai pertanyaan Anda, Anda mungkin tertarik pada diskusi berikut: stats.stackexchange.com/questions/60362/... Pilihan antara ANOVA tipe I, II, dan III tidak semudah kelihatannya.
phx
Memutakhirkan pertanyaan Anda berguna karena memicu beberapa respons yang dipelajari, tetapi saya juga mencatat bahwa Anda setuju dengan responden yang pada dasarnya mengatakan bahwa premis pertanyaan itu salah. Saya harap saya meringkas posisi StaGuy dengan mengatakan bahwa perbedaan yang didefinisikan menurut definisi "tipe I" dan diskusi jenis lain hanya menjadi relevan ketika menilai statistik regresi parsial, mungkin yang paling penting ketika membiarkan "mesin melakukan mengemudi" menggunakan metode otomatis.
DWin
@DWin: Saya tidak yakin saya sepenuhnya mengikuti Anda. Seseorang dapat secara sah menggunakan tipe SS lainnya tanpa membiarkan 'mesin melakukan mengemudi' (setidaknya seperti yang saya pahami frasa itu). Saya mungkin agak berkarat di sini, tetapi jika ingatanku, tipe lain bisa relevan ketika tidak menggunakan regresi parsial. Misalnya, Tipe III SS tidak mem-parsial efek utama dari interaksi. Perbedaan antara kedua tipe itu penting karena tipe III tidak parsial sedangkan tipe I berbeda. Masalah sebagaimana dinyatakan hanya mencakup satu kontras dan oleh karena itu perbedaan antara jenis SS adalah / sedang diperdebatkan.
russellpierce
Pemahaman saya adalah bahwa alasan yang diberikan oleh SAS untuk memilih SSS tipe III (dan ini tampaknya mengapa orang berpikir bahwa tipe-III lebih disukai) adalah bahwa ia lebih baik mendukung proses seleksi mundur dan maju.
DWin

Jawaban:

22

Jumlah kuadrat tipe III untuk ANOVA sudah tersedia melalui Anova()fungsi dari paket mobil .

Pengkodean kontras dapat dilakukan dengan beberapa cara, menggunakan C(), contr.*keluarga (seperti yang ditunjukkan oleh @nico), atau langsung contrasts()fungsi / argumen. Ini dirinci dalam §6.2 (hal. 144-151) dari Statistik Terapan Modern dengan S (Springer, 2002, edisi ke-4). Perhatikan bahwa aov()ini hanyalah fungsi pembungkus untuk lm()fungsi tersebut. Sangat menarik ketika seseorang ingin mengontrol jangka waktu kesalahan model (seperti dalam desain dalam-subjek), tetapi jika tidak, keduanya menghasilkan hasil yang sama (dan apa pun cara Anda cocok dengan model Anda, Anda masih dapat menampilkan ANOVA atau LM- seperti ringkasan dengan summary.aovatau summary.lm).

Saya tidak punya SPSS untuk membandingkan dua output, tetapi sesuatu seperti

> library(car)
> sample.data <- data.frame(IV=factor(rep(1:4,each=20)),
                            DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> Anova(lm1 <- lm(DV ~ IV, data=sample.data, 
                  contrasts=list(IV=contr.poly)), type="III")
Anova Table (Type III tests)

Response: DV
            Sum Sq Df F value    Pr(>F)    
(Intercept)  18.08  1  21.815  1.27e-05 ***
IV          567.05  3 228.046 < 2.2e-16 ***
Residuals    62.99 76                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

layak untuk dicoba pada contoh pertama.

Tentang pengkodean faktor dalam R vs SAS: R menganggap tingkat dasar atau referensi sebagai tingkat pertama dalam urutan leksikografis, sedangkan SAS mempertimbangkan yang terakhir. Jadi, untuk mendapatkan hasil yang sebanding, Anda harus menggunakan contr.SAS()atau untuk relevel()faktor R Anda.

chl
sumber
1
Saya tidak berpikir jawaban ini menggunakan -3, -1,1,3 kontras yang saya tentukan juga tidak memberikan tes kontras 1 df.
russellpierce
@drknexus Ya, Anda benar. Menulis terlalu cepat. Sesuatu seperti Anova(lm(DV ~ C(IV, c(-3,-1,1,3),1), data=sample.data), type="III")harus lebih baik. Tolong beri tahu saya jika Anda setuju.
chl
Terima kasih! Kelihatannya oke saya akan memvalidasi itu terhadap SPSS besok dan kembali kepada Anda.
russellpierce
1
BTW, lihat paket ez ( cran.r-project.org/web/packages/ez/index.html ) untuk membungkus kode Anova ...
Tal Galili
2
@drknexus: Kalau saja ada permintaan fitur & masalah pengiriman halaman untuk ez ... github.com/mike-lawrence/ez/issues :)
Mike Lawrence
11

Ini mungkin terlihat seperti sedikit promosi diri (dan saya kira begitu). Tapi saya mengembangkan paket lsmeans untuk R (tersedia di CRAN) yang dirancang untuk menangani situasi seperti ini. Inilah cara kerjanya sebagai contoh:

> sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> sample.aov <- aov(DV ~ factor(IV), data = sample.data)

> library("lsmeans")
> (sample.lsm <- lsmeans(sample.aov, "IV"))
 IV    lsmean        SE df   lower.CL  upper.CL
  1 -3.009669 0.2237448 76 -3.4552957 -2.564043
  2 -3.046072 0.2237448 76 -3.4916980 -2.600445
  3  1.147080 0.2237448 76  0.7014539  1.592707
  4  3.049153 0.2237448 76  2.6035264  3.494779

> contrast(sample.lsm, list(mycon = c(-3,-1,1,3)))
 contrast estimate       SE df t.ratio p.value
 mycon    22.36962 1.000617 76  22.356  <.0001

Anda dapat menentukan kontras tambahan dalam daftar jika Anda mau. Untuk contoh ini, Anda akan mendapatkan hasil yang sama dengan kontras polinomial linier bawaan:

> con <- contrast(sample.lsm, "poly")
> con
 contrast   estimate        SE df t.ratio p.value
 linear    22.369618 1.0006172 76  22.356  <.0001
 quadratic  1.938475 0.4474896 76   4.332  <.0001
 cubic     -6.520633 1.0006172 76  -6.517  <.0001

Untuk mengonfirmasi ini, perhatikan bahwa "poly"spesifikasi mengarahkannya untuk menelepon poly.lsmc, yang menghasilkan hasil ini:

> poly.lsmc(1:4)
  linear quadratic cubic
1     -3         1    -1
2     -1        -1     3
3      1        -1    -3
4      3         1     1

Jika Anda ingin melakukan uji gabungan dari beberapa kontras, gunakan testfungsi dengan joint = TRUE. Sebagai contoh,

> test(con, joint = TRUE)

Ini akan menghasilkan tes "tipe III". Tidak seperti car::Anova()itu, ia akan melakukannya dengan benar terlepas dari pengkodean kontras yang digunakan pada tahap pemasangan model. Ini karena fungsi linier yang diuji ditentukan secara langsung daripada secara implisit melalui reduksi model. Fitur tambahan adalah bahwa kasus di mana kontras yang diuji secara linear tergantung terdeteksi, dan statistik uji yang benar dan derajat kebebasan dihasilkan.

rvl
sumber
7

Ketika Anda melakukan kontras, Anda melakukan kombinasi linier sel tertentu yang dinyatakan dalam konteks istilah kesalahan yang sesuai. Dengan demikian, konsep "Tipe SS" tidak bermakna dengan kontras. Setiap kontras pada dasarnya adalah efek pertama menggunakan Tipe I SS. "Jenis SS" berkaitan dengan apa yang sebagian atau dicatat oleh ketentuan lainnya. Sebagai kontras, tidak ada yang sebagian atau dicatat. Kontrasnya berdiri sendiri.

StatGuy
sumber
Anda benar sekali.
russellpierce
3

Fakta bahwa tes tipe III digunakan di tempat kerja Anda adalah alasan terlemah untuk tetap menggunakannya. SAS telah melakukan kerusakan besar pada statistik dalam hal ini. Tafsir Bill Venables, yang dirujuk di atas, adalah sumber yang bagus untuk ini. Katakan saja tidak untuk tipe III; ini didasarkan pada gagasan keseimbangan yang salah dan memiliki daya yang lebih rendah karena pembobotan sel yang konyol dalam kasus yang tidak seimbang.

Cara yang lebih alami dan tidak rentan kesalahan untuk mendapatkan kontras umum, dan untuk dapat menggambarkan apa yang Anda lakukan, disediakan oleh fungsi rmspaket R. contrast.rmsKontras bisa sangat kompleks tetapi bagi pengguna sangat sederhana karena mereka dinyatakan dalam perbedaan nilai prediktif. Tes dan kontras simultan didukung. Ini menangani efek regresi nonlinier, efek interaksi nonlinier, kontras parsial, semua jenis hal.

Frank Harrell
sumber
Itu semua baik dan baik untuk Anda sebagai orang yang bereputasi beralasan untuk mengatakan. Yang lain tidak memiliki pengaruh untuk tidak setuju dengan pengulas. Karena interpretasi statistik berbeda, Anda akan meminta orang baru untuk berpijak pada prinsip dan mengeluarkan biaya yang tidak masuk akal. Saya mengatakan bahwa sebagai seseorang yang mati bagian saya kali di atas bukit ini (dan serupa). Perubahan IMO di bagian depan ini adalah tanggung jawab penjaga gerbang, yaitu editor dan pengulas.
russellpierce
Orang-orang yang sangat pandai dengan data memiliki banyak pilihan pekerjaan dan mungkin memiliki pilihan untuk bekerja di bidang-bidang di mana keterampilan dan pendapat mereka dihormati.
Frank Harrell
1
... dan itulah yang saya lakukan sekarang. Tetapi orang-orang yang datang pada pertanyaan ini tidak akan sering dari kelas itu. Sama seperti saya tidak 7 tahun yang lalu. Saya hanya menganjurkan sedikit empati untuk pemula dan keadaan mereka.
russellpierce
2

Coba perintah Anova di perpustakaan mobil. Gunakan argumen type = "III", karena defaultnya adalah tipe II. Sebagai contoh:

library(car)
mod <- lm(conformity ~ fcategory*partner.status, data=Moore, contrasts=list(fcategory=contr.sum, partner.status=contr.sum))
Anova(mod, type="III")
jebyrnes
sumber
3
Saya tahu Moore ada di perpustakaan mobil, tetapi ketika data sampel disediakan, lebih mudah bagi penanya pertanyaan untuk memahami respons Anda jika Anda menggunakan data sampel.
russellpierce
0

Juga mempromosikan diri sendiri, saya menulis sebuah fungsi untuk ini: https://github.com/samuelfranssens/type3anova

Instal sebagai berikut:

library(devtools)
install_github(samuelfranssens/type3anova)
library(type3anova)

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

type3anova(lm(DV ~ IV, data = sample.data))

Anda juga perlu carmenginstal paket.

sam_f
sumber
Bagaimana Anda menerapkan ini pada bagian kontras dari pertanyaan?
russellpierce
1
Maaf, saya tidak membaca pertanyaan dengan benar. Fungsi saya hanya akan menyederhanakan melakukan Anova tipe III. Seperti StatGuy di atas, saya tidak melihat di mana SS berperan ketika menguji kontras tertentu.
sam_f