Anda di halaman 1dari 167

MODUL 1 DISTRIBUSI UNTUK DATA KATEGORI

Data kategori setidaknya terdiri atas dua hal yaitu data yang diukur pada skala nominal yang apabila diberikan nilai maka nilainya hanya berfungsi sebagai simbol dan tidak menyatakan urutan dan data yang diukur pada skala nominal yang apabila diberikan nilai memberikan arti urutan tetapi bukan nilai numerik tetapi hanya berupa simbol. Variabel kategori terkadang disebut juga variabel diskrit karena nilainya hanya diperoleh dengan cara mencacah. Dalam Agresti (2007) tiga distribusi utama yang dapat digunakan untuk data kategori yaitu: 1. Binomial yaitu distribusi yang menyatakan banyaknya percobaan yang saling bebas dari percobaan bernoulli yang memiliki hasil biner (terdiri hanya dua kategori: sukses atau gagal). Peluang sukses (p) adalah tetap untuk setiap percobaan dan variabel X menyatakan banyaknya sukses dari seluruh percobaan (n). 2. Multinomial merupakan perluasan dari distribusi binomial akan tetapi mempunyai hasil percobaan lebih dari dua. 3. Poisson adalah distribusi yang menyatakan banyaknya peristiwa yang terjadi dalam waktu yang lama (jangka panjang) yang setiap kejadiannya saling bebas. Dengan kata lain Distribusi Poisson dapat dikatakan sebagai distribusi untuk peristiwa yang jarang terjadi. 1.1 Distribusi Peluang Diskrit dalam R Software R come mendukung banyak distribusi peluang baik diskrit yaitu Poisson, negative binomial, geometric, hypergeometric, dan uniform diskrit. Selain itu juga ada beberapa distribusi-distribusi peluang khusus yang dapat diperoleh dari website CRAN seperti negatifbinomial yang terdapat pada fungsi rnegbin() paket MASS, beta-binomial terdapat pada paket rmutil dan gnlm dan masih banyak lagi. Setiap distribusi peluang mempunyai fungsi untuk memperoleh peluang kumulatif, nilai densitas dan kuantil. Selain itu juga bisa membangkitkan data (random data) dari distribusi 1

tersebut. Berikut adalah beberapa fungsi yang dapat digunakan untuk menghitung nilai-nilai dari distribusi di dalam R. Distribusi Binomial dengan peluang sukses p dan banyak percobaan n. > dbinom(x, n, p) # menghitung nilai peluang pada saat P(X = x) > pbinom(x, n, p) # menghitung nilai peluang kumulatif P(X <= x) > qbinom(p, n, p) # menghitung nilai kuantil ke p > rbinom(N, n, p) # membangkitkan data sebanyak N dari distribusi Binomial

Distribusi Poisson dengan parameter lambda > dpois(x, lambda) # menghitung nilai peluang pada saat P(X = x) > ppois(x, lambda) # menghitung nilai peluang kumulatif P(X <= x) > qpois(p, lambda) # menghitung nilai kuantil ke p > rpois(N, lambda) # membangkitkan data sebanyak N dari distribusi Poisson

Distribusi Multinomial dengan vektor peluang p > dmultinom(x, p) > rmultinom(n, size, prob)

Contoh: > dbinom(3, size=10, prob=0.25) # P(X = 3) untuk distribusi binomial

dengan n=10 dan peluang sukses 0.25 > pbinom(3, size=10, prob=0.25) # P(X <=3) untuk distribusi binomial

dengan n = 10 dan peluang sukses 0.25

1.2 Pengujian Proporsi satu Sampel

Berguna untuk menentukan proporsi suatu sampel, dan menguji apakah proporsi sampel sama dengan proporsi yang dihipotesiskan. Dalam software R untuk pengujian proporsi satu sampel maupun lebih dari satu sampel dapat menggunakan fungsi prop.test. Dalam fungsi prop.test hanya variabel atau kelompok (apabila lebih dari satu sampel) dengan banyak sukses 2

dan gagal terhingga yang digunakan. Banyak sukses dan gagal harus bernilai positif dan tidak lebih besar dari banyaknya percobaan dan nilai setiap sel harus bertipe integer. Jika nilai peluang sukses p tidak didefinisikan dan terdiri lebih dari satu kelompok maka hipotesisi nol yang digunakan adalah proporsi tiap kelompok adalah sama. Apabila ada dua kelompok, hipotesis alternatif adalah bahwa peluang sukses pada kelompok satu lebih kecil, tidak sama atau lebih besar dari peluang sukses pada kelompok kedua dengan derajat kepercayaan sebesar nilai conf.level. Apabila ada lebih dari dua kelompok hipotesis alternatif yang digunakan selalu tidak sama atau "two.sided". Jika hanya ada satu kelompok maka hipotesis nol yang digunakan dalam pengujian adalah sama dengan nilai 'p' atau 0.5 apabila nilai 'p' tidak didefinisikan. Hipotesis alternatif hipotesis alternatif adalah bahwa peluang sukses pada kelompok satu lebih kecil, tidak sama atau lebih besar dari 'p' atau '0.5' apabila nilai 'p' tidak didefinisikan. Selang kepercayaan untuk proporsi dihitung dengan derajat kepercayaan sebesar conf.level. Penjelasan mengenai fungsi prop.test adalah sebagi berikut > prop.test(x, n, p = NULL, alternative = c("two.sided", "less", "greater"), conf.level = 0.95, correct = TRUE)

Keterangan:

x: adalah vektor banyak sukses atau berupa tabel satu dimensi dengan dua taraf atau tabel dua dimensi (atau matriks) dengn dua kolom berisi banyak sukses dan gagal. n: adalah vektor banyaknya percobaan, diabaikan apabila 'x' adalah matriks atau tabel. p: adalah vektor peluang sukses. Panjang vektor p harus sama dengan banyaknya kelompok yang bersesuaian dengan vektor x dan nilainya harus lebih besar dari nol dan lebih kecil dari 1. alternative: adalah hipotesis alternatif yang digunakan yaitu "two.sided" (default) untuk tidak sama, "greater" untuk lebih besar atau "less"

untuk lebih kecil. Dapat pula menggunakan huruf inisialnya saja. Opsi ini hanya digunakan untuk pengujian satu sampel dengan hipotesis sama dengan nilai tertentu, atau pada pengujian kesamaan dua proporsi.

conf.level: adalah derajat kepercayaan yang digunakan. Nilainya harus antara 0 dan 1. Opsi ini hanya digunakan untuk pengujian satu sampel dengan hipotesis sama dengan nilai tertentu, atau pada pengujian kesamaan dua proporsi.

correct: berisi TRUE atau FALSE yang mengindikasikan 'Yates' continuity correction yang digunakan apabila memungkinkan.

Nilai-nilai yang dapat diperoleh dari fungsi ini adalah

statistic: adalah nilai statistik uji chi-kuadrat Pearson's .

parameter: adalah derajat kebebasan yang digunakan pada statistik uji yang mengikuti distribusi chi-kuadrat.

p.value: adalah nilai 'p-value' pengujian.

estimate: adalah vektor dengan proporsi sampel x/n.

conf.int: adalah selang kepercayaan untuk proporsi satu sampel atau untuk perbedaan proporsi dua sampel Selang kepercayaan untuk proporsi dihitung dengan derajat kepercayaan sebesar conf.level yang telah didefinisikan.

null.value: adalah nilai spesifik p pada hipotesis nol.

alternative: adalah hipotesis alternatif yang digunakan.

method: adalah metode yang digunakan dan melliputi Yates' continuity correction yang digunakan.

data.name: adalah nama dari data yang digunakan.

Contoh Pengamat ekonomi memiliki dugaan bahwa 70% perusahaan besar di Indonesia dimiliki oleh warga negara asing. Untuk membuktikan dugaannya, diambil sampel acak 210 perusahaan yang digolongkan perusahaan besar. Dari 210 perusahaan besar sebanyak 130 perusahaan dimiliki oleh Orang Asing. Dengan tingkat signifikansi sebesar 0.05 Lakukan pengujian hipotesisnya! > prop.test(130, 210, 0.7, conf.level=0.95) 1-sample proportions test with continuity correction data: 130 out of 210, null probability 0.7 X-squared = 6.1735, df = 1, p-value = 0.01297 alternative hypothesis: true p is not equal to 0.7 95 percent confidence interval:

0.5493720 0.6842925 sample estimates: p 0.6190476

Karena p-value lebih kecil dari 0.05 maka hipotesis ditolak. Artinya, proporsi sampel tidak sama dengan 0.7 sehingga kesimpulannya tidak cukup alasan untuk setuju dengan pendapat ahli ekonomi tersebut dengan keyakinan 95%. Pengujian proporsi dalam software R merupakan pengujian proporsi menggunakan uji chi-kuadrat. Pendekatan lain untuk menguji proporsi adalah menggunakan statistik uji Z. Secara default R tidak menyediakan uji proporsi menggunakan statiistik Z. tetapi dalam R dimungkinkan untuk membuat fungsi yang dapat digunakan untuk menguji proporsi dengan statistik uji Z. Berikut adalah contoh pembuatan fungsi pengujian proporsi satu sampel. > ztes.prop<-function(x,n,p,conf.level){ > prop=x/n > alpha=1-conf.level > zstar=qnorm(1-alpha/2) > SE=(prop*(1-prop)/n)^0.5 > zhitung=(prop-p)/SE > pvalue=1-pnorm(abs(zhitung)) > BB=(prop1-prop2)-zstar*SE

> BA=(prop1-prop2)+zstar*SE > Ringkasan<data. frame(n=c(n),sukses=c(x),proporsi=c(prop),StandarError=c(SE), > zhitung=c(zhitung),pvalue=c(pvalue),BatasAtas=c(BA),BatasBawah=c(BB)) > Ringkasan$Kesimpulan<-ifelse(Ringkasan$pvalue>=0.05,c("H0 Diterima"),c("Ho Ditolak")) > print(Ringkasan) >}

Fungsi tersebut dapat dipanggil dengan cara sebagai berikut: > ztes.prop(130,210,0.7,0.95) # kasus satu sampel

1.3 Pengujian Proporsi Dua Sampel Digunakan untuk membandingkan proporsi dua sampel. Dalam R masih menggunakan prop.test dengan syntax sebagai berikut >prop.test(c(a,b),c(n1,n2))

keterangan: a adalah banyaknya kategori A dalam sampel 1 b adalah banyaknya kategori A dalam sampel 2 n1 adalah ukuran sampel 1 n2 adalah ukuran sampel 2 Contoh Suatu kegiatan survey dilakukan sebanyak dua kali untuk mengetahui apakah ada perbedaan pilihan masyarakat terhadap calon tertentu dalam pemilihan presiden. Data disajikan sebagai berikut: Minggu ke 1 Minggu ke 2 Memilih 45 56

Tidak Memilih 35 47 6

Dengan tingkat signifikansi 5% lakukan pengujian apakah terdapat perbedaan proporsi minggu 1 dan minggu 2 > prop.test(c(45,56),c(45+35,56+47))

2-sample test for equality of proportions with continuity correction

data: c(45, 56) out of c(45 + 35, 56 + 47)

X-squared = 0.0108, df = 1, p-value = 0.9172

alternative hypothesis: two.sided

95 percent confidence interval:

-0.1374478 0.1750692

sample estimates:

prop 1 prop 2

0.5625000 0.5436893

Karena p-value lebih besar dari 0.05 maka hipotesis diterima. Artinya, proporsi sampel 1 tidak berbeda dengan sampel 2 sehingga kesimpulannya dengan keyakinan 95% sampel 1 tidak berbeda nyata dengan sampel 2. Seperti pada kasus satu asmpel pengujian proporsi dalam software R merupakan pengujian proporsi menggunakan uji chi-kuadrat. Pendekatan lain untuk menguji proporsi adalah menggunakan statistik uji Z. Secara default R tidak menyediakan uji proporsi menggunakan

statiistik Z. tetapi dalam R dimungkinkan untuk membuat fungsi yang dapat digunakan untuk menguji proporsi dengan statistik uji Z. Berikut adalah contoh pembuatan fungsi pengujian proporsi dua sampel. > ztes.prop2<-function(x1,x2,n1,n2,conf.level){ > prop1=x1/n1;prop2=x2/n2 > alpha=1-conf.level > zstar=qnorm(1-alpha/2) > SE=(prop1*(1-prop1)/n1+prop2*(1-prop2)/n2)^0.5 > zhitung=(prop1-prop2)/SE > pvalue=1-pnorm(abs(zhitung)) > BB=(prop1-prop2)-zstar*SE > BA=(prop1-prop2)+zstar*SE >Ringkasan<-data.frame(n=c(n1,n2),sukses=c(x1,x2),proporsi=c(prop1,prop2),StandarError=c(S E), > zhitung=c(zhitung),pvalue=c(pvalue),BatasAtas=c(BA),BatasBawah=c(BB)) > Ringkasan$Kesimpulan<-ifelse(Ringkasan$pvalue>=0.05,c("H0 Diterima"),c("Ho Ditolak")) > print(Ringkasan) >}

Fungsi tersebut dapat dipanggil dengan cara sebagai berikut: > ztes.prop2(45,56,80,103,0.95) # kasus dua sampel

MODUL 2 TABEL KONTINGENSI

2.1. Pendahuluan Dalam modul ini akan dijelaskan mengenai asosiasi antara dua variabel dalam tabel kontingensi. Pembahasan meliputi pada selang kepercayaan (Confidence intervals), odds ratio dan resiko relatif (relative risk), pengujian perbedaan proporsi dan uji independensi menggunakan pendekatan normal (untuk sampel besar) atau prosedur Wolf. Secara umum untuk tabel kontingensi I x J, pengujian independensi variabel baris dan kolom menggunkan uji chi kuadrat termasuk statistik rasio kemungkinan (likelihood ratio statistic) dan statistik Chi-Kuadrat Pearson. Sebagai catatan apabila variabel baris dan kolom mempunyai kategori order maka yang digunakan pada hipotesis alternatif adalah trend. 2.2 Input Tabel Kontingensi dalam Software R Ada banyak cara untuk membuat tabel kontingensi didalam software R. Setidaknya ada tiga cara dapat dilakukan untuk membentuk tabel kontingensi untuk contoh berikut mengenai penelitian kepercayaan seseorang mengenai adanya kehidupan setelah kematian (akhirat). Data disajikan dalam pada tabel berikut ini Tabel 2.1 Kepercayaan akan Kehidupan Setelah Kematian Percaya Tidak Percaya Jumlah Laki-Laki 375 134 509 Perempuan 435 147 582 Jumlah 810 281 1091 (1) Menggunakan fungsi Matrix Cara pertama menginputkan data tersebut kedalam software R adalah menggunakan fungsi matriks yaitu dengan menganggap bahwa tabel tersebut adalah sebuah matriks, cara ini sama dengan menggunakan fungsi array. 9

> afterlife <-matrix(c(375,134,435,147),nrow=2,byrow=TRUE) > afterlife

[,1] [,2] [1,] 375 134 [2,] 435 147

Tentu saja matriks diatas tidak menggambarkan apa-apa sehingga kita beri nama masing-masing kolom dan berisnya. > dimnames(afterlife) <-list(c("Laki-laki","Perempuan"),c("Percaya","Tidak")) > afterlife

Percaya Tidak Laki-laki 375 134 Perempuan 435 147

Selain itu kita juga bisa memberikan nama variabel (atau faktor) dari kolom dan barisnya dengan cara sebagai berikut: > names(dimnames(afterlife)) <-c("JK","Kepercayaan") > afterlife

Kepercayaan JK Percaya Tidak

Laki-laki 375 134

Perempuan 435 147

Berikutnya yang dapat dilakukan adalah menghitung proporsi masing-masing sel terhadap total sampel (n) secara keseluruhan (pij).

> tot <-sum(afterlife) > tot

[1] 1091 > afterlife/tot

10

Kepercayaan

JK Percaya Tidak Laki-laki 0.3437214 0.1228231 Perempuan 0.3987168 0.1347388

Untuk menghitung total masing-masing kolom (ni.) dan total masing-masing baris (n.j) dapat menggunakan fungsi apply. Penjelasan mengenai fungsi apply adalah sebagai berikut Deskripsi:

Menghasilkan sebuah vektor yang berisi nilai-nilai yang diperoleh dengan menghitung sesuatu berdasarkan fungsi atas bagian dari array atau matrik

Penggunaan:

apply(X, MARGIN, FUN, ...)

Keterangan:

X: sebuah array, termasuk matriks. MARGIN: sebuah vektor yang menunjukkan indeks yang akan di hitung dari fungsinya '1' berarti baris, '2' berarti kolom dan 'c(1,2)' berarti baris dan kolom.

FUN: Fungsi yang akan digunakan seperti '+, %*%', 'sum' dan lain-lain.

Hasil: Apabila pada setiap memanggil 'FUN' menghasilkan sebuah vektor dengan 'n' elemen, maka 'apply' menghasilkan array berdimensi c(n, dim(X)[MARGIN]) apabila n > 1. Jika 'n = 1' fungsi 'apply' akan menghasilkan vektor

jika 'MARGIN' mempunyai panjang 1 dan array berdimensi dim(X)[MARGIN] jika selainnya. Apabila n bernilai '0' maka hasil yang diperoleh akan berdimensi '0' juga. Jika saat memanggil 'FUN' menghasilkan vektor-vektor berdimensi berbeda, fungsi 'apply' akan menghasilkan list dari prod(dim(X)[MARGIN]) dengan dim di set sama dengan MARGIN jika panjangnya lebih besar dari satu.

11

Sedangkan untuk menghitung proporsi sel terhadap ni. (pi.) dan proporsi sel terhadap (p.j) dapat menggunakan fungsi sweep. Berikut penjelasan mengenai fungsi tersebut Deskripsi: Menghasilkan sebuah array yang diperoleh dari input array dengan melakukan 'sweeping' (penyapuan) ringkasan statistik. Penggunaan: sweep(x, MARGIN, STATS, FUN="-", check.margin=TRUE, ...) Keterangan:

x: sebuah array. MARGIN: sebuah vektor yang mengindikasikan tingkatan dari 'x' yang berkaitan dengan STATS. STATS: ringkasan statistik yang akan digunakan. FUN: Sebuah fungsi yang akan digunakan dalam penyapuan. Dalam kasus operator biner seperti / dan lain-lain, nama fungsi harus menggunakan tanda kutip. check.margin: Bernilai TRUE (default), atau 'FALSE' Hasil: Sebuah array dengan bentuk yang sama dengan 'x' tetapi berisi hasil

penyapuan menggunakan ringkasan statistik

Adapun penggunaan kedua fungsi tersebut pada data adalah sebagai berikut > totBaris <-apply(afterlife,1,sum) > totKolom <-apply(afterlife,2,sum) > totBaris

12

Laki-laki Perempuan

509 582 > totKolom Percaya Tidak

810 281 > (Prop.Baris <-sweep(afterlife,1,totBaris,"/")) Kepercayaan

JK Percaya Tidak Laki-laki 0.7367387 0.2632613 Perempuan 0.7474227 0.2525773

> round(Prop.Baris,3) Kepercayaan

JK Percaya Tidak Laki-laki 0.737 0.263 Perempuan 0.747 0.253

> (Prop.Kolom <-sweep(afterlife,2,totKolom,"/")) Kepercayaan

JK Percaya Tidak Laki-laki 0.462963 0.4768683 Perempuan 0.537037 0.5231317

> round(Prop.Kolom,3) Kepercayaan

JK Percaya Tidak Laki-laki 0.463 0.477 Perempuan 0.537 0.523

(2) Menggunakan Data Frame Salah satu struktur data yang sering digunakan dalam R adalah data frame, untuk tabel kontingensi dalam bentuk data frame dapat memperlakukan variabel baris dan variabel kolom sebagai faktor. Pendekatan ini sebenarnya lebih tepat apabila data disimpan dalam file terpisah yang dapat dibaca di R. Baris-baris berikut adalah contohnya > JK <-c("Wanita","Wanita","Pria","Pria") > Kepercayaan <-c("Ya","Tidak","Ya","Tidak") > Jumlah <-c(435,147,375,134) > afterlife <-data.frame(JK,Kepercayaan,Jumlah)

13

> afterlife JK Kepercayaan Jumlah 1 Wanita Ya 435 2 Wanita Tidak 147 3 Pria Ya 375 4 Pria Tidak 134 > rm(JK,Kepercayaan,Jumlah) # tidak dibutuhkan lagi

Kita dapat membuat tabel kontingensi dengan memperlakukan data frame sebagai matriks atau menggunakan fungsi tapply dengan cara sebagai berikut: > attach(afterlife) # mengunakan data frame afterlife > beliefs <-tapply(Jumlah,list(JK,Kepercayaan),c) > beliefs

Tidak Ya Wanita 147 435 Pria 134 375 > detach(afterlife) # Kalau data tidak lagi dibutuhkan > names(dimnames(beliefs)) <-c("JK","Kepercayaan") > beliefs

Kepercayaan JK Tidak Ya Wanita 147 435 Pria 134 375 > beliefs <-beliefs[,c(2,1)] # Menukar kolom > beliefs

Kepercayaan JK Ya Tidak Wanita 435 147 Pria 375 134

2.3 Membandingkan Proporsi Tabel 2 x 2

Secara umum data dapat di sajikan dalam berbagai cara berbeda. Untuk data kategori data dapat disajikan dalam tabel kontingensi 2 x 2 maupun dalam bentuk matriks. Untuk data yang disajikan dalam bentuk matriks perhatikan contoh berikut ini. Data yang digunakan adalah studi mengenai kesehatan psikologis pasien yang telah diberikan obat 14

> phs <-matrix(c(189,10845,104,10933),byrow=TRUE,ncol=2) > phs [,1] [,2] [1,] 189 10845 [2,] 104 10933 > dimnames(phs) <-list(Group=c("Placebo","Aspirin"),MI=c("Yes","No")) > phs MI Group Yes No Placebo 189 10845 Aspirin 104 10933 > prop.test(phs) 2-sample test for equality of proportions with continuity correction data: phs X-squared = 24.4291, df = 1, p-value = 7.71e-07 alternative hypothesis: two.sided 95 percent confidence interval: 0.004597134 0.010814914 sample estimates: prop 1 prop 2 0.01712887 0.00942285

Koreksi dalam statistik uji digunakan sebagai default dalam prop.test. Apabila koreksi ini tidak digunakan maka akan ada sedikit perbedaan dalam hasil (output) untuk contoh diatas seperti berikut ini: > prop.test(phs,correct=F) 2-sample test for equality of proportions without continuity correction data: phs X-squared = 25.0139, df = 1, p-value = 5.692e-07 alternative hypothesis: two.sided 95 percent confidence interval: 0.004687751 0.010724297 sample estimates:

15

prop 1 prop 2 0.01712887 0.00942285

Selain itu output yang diperoleh juga dapat disimpan dan diubah sesuai dengan keinginan kita dengan beragam cara. Contoh untuk menyimpan output adalah sebagai berikut: > phs.test <-prop.test(phs) > names(phs.test)

[1] "statistic" "parameter" "p.value" "estimate" [5] "null.value" "conf.int" "alternative" "method" [9] "data.name" > phs.test$estimate prop 1 prop 2 0.01712887 0.00942285 > phs.test$conf.int [1] 0.004597134 0.010814914 attr(,"conf.level") [1] 0.95 > round(phs.test$conf.int,3) [1] 0.005 0.011 attr(,"conf.level") [1] 0.95 > phs.test$estimate[1]/phs.test$estimate[2] % relative risk prop 1 1.817802 2.4 Odds Ratio Resiko relatif (Relative risk) dan odds ratio secara mudah dapat dihitung dari tabel kontingensi 2 x 2 dengan berbagai cara. Berikut adalah contohnya: > phs.test$estimate prop 1 prop 2 0.01712887 0.00942285 > odds <-phs.test$estimate/(1-phs.test$estimate)

16

> odds prop 1 prop 2 0.017427386 0.009512485

> odds[1]/odds[2] prop 1 1.832054

> (phs[1,1]*phs[2,2])/(phs[2,1]*phs[1,2]) # as cross-prod ratio

[1] 1.832054 Apabila kita akan membuat selang kepercayaan (Confident Interval) bagi odds ratio maka langkah-langkah berikut dapat digunakan: > theta <-odds[1]/odds[2] > ASE <-sqrt(sum(1/phs)) > ASE

[1] 0.1228416 > logtheta.CI <-log(theta) + c(-1,1)*1.96*ASE > logtheta.CI [1] 0.3646681 0.8462073 > exp(logtheta.CI) [1] 1.440036 2.330790 Kita dapat membuat fungsi sederhana yang dapat dipanggil sewaktu-waktu untuk menghitung odds ratio dari tabel kontingensi 2 x 2 dengan cara sebagai berikut: odds.ratio <-function(x, pad.zeros=FALSE, conf.level=0.95) { if (pad.zeros) { if (any(x==0)) x <-x + 0.5 } theta <-x[1,1] * x[2,2] / ( x[2,1] * x[1,2] ) ASE <-sqrt(sum(1/x)) CI <-exp(log(theta)

+ c(-1,1) * qnorm(0.5*(1+conf.level)) *ASE ) list(estimator=theta, 17

ASE=ASE, conf.interval=CI, conf.level=conf.level) }

Sehingga odds ratio dapat dihitung dengan cara sebagai berikut: > odds.ratio(phs) $estimator

[1] 1.832054 $ASE [1] 0.1228416 $conf.interval [1] 1.440042 2.330780 $conf.level [1] 0.95 2.5 Uji Independensi Chi-Kuadrat Uji Independensi Chi-Kuadrat (statistik Pearsons chi-squared test) dapat dihitung menggunakan fungsi chisq.test berikut dengan p-valuenya. Tabel berikut adalah data Survei Sosial Umum mengenai klasifikasi silang antara jenis kelamin dengan pemilihan partai politik. Responden adalah penduduk yang dipilih dalam survei dan lebih cenderung memilih partai Demokrat atau Republik atau mungkin tidak memilih. Pada tabel juga disertakan nilai ekspektasi dari setiap sel (berada didalam kurung) Table 2.2. Klasifikasi Silang Pilihan Partai Berdasarkan Jenis Kelamin Jenis Kelamin Pilihan Partai Total Demokrat Tidak Memilih Republik Wanita 762 327 468 1557 (703.7) (319.6) (533.7) Pria 484 239 477 1200

(542.3) (246.4) (411.3) Total 1246 566 945 2757 18

Untuk data tersebut aplikasi untuk statistik ini adalah sebagai berikut: > JK.partai <-matrix(c(279,73,225,165,47,191),byrow=TRUE,nrow=2) > dimnames(JK.partai) <-list(JK=c("Wanita","Pria"),

+ Partai=c("Demokrat","Tidak Memilih","Republik")) > JK.partai Partai JK Demokrat Tidak Memilih Republik

Wanita 279 73 225 Pria 165 47 191 > chisq.test(JK.partai) Pearsons Chi-square test data: JK.partai X-squared = 7.0095, df = 2, p-value = 0.03005

Apabila ada kekhawatiran akan pendekatan chi-kuadrat terhadap distribusi sampling dari statistik uji, kita dapat membuat suatu simulasi untuk menentukan pendekatan nilai p-value atau bisa menggunakan uji eksak. Uraian berikut ini menjelaskan bagaimana simulasi dilakukan untuk menentukan nilai pendekatan p-value. Banyaknya pengulangan dalam simulasi ini secara default adalah 2000 tetapi kita dapat mengubahnya dengan nilai yang lain. Tentu saja semakin banyak ulangannya simulasi akan semakin baik. Tetapi semakin banyak ulangan akan menggunakan waktu dan memori yang lebih besar. Hal penting dalam studi simulasi adalah mendapatkan nilai yang konvergen dalam waktu yang lebih cepat (atau dengan kata lain ulangan yang lebih sedikit). Simulasi dalam contoh ini nilai pendekatan p-value mendekati nilai pendekatan chi-kuadrat. > chisq.test(JK.partai,simulate.p.value=TRUE,B=10000) Pearsons Chi-square test with simulated p-value (based on 10000 replicates) data: JK.partai X-squared = 7.0095, df = NA, p-value = 0.032 > chisq.test(JK.partai,simulate.p.value=TRUE,B=10000) Pearsons Chi-square test with simulated p-value

(based on 10000 replicates) data: JK.partai X-squared = 7.0095, df = NA, p-value = 0.0294

19

Uji eksak Fisher untuk tabel kontingensi terdapat dalam fungsi fisher.test dari paket ctest (classical tests). Paket ini disertakan dalam bagian dari distribusi dasari dari R dan secara otomatis sudah dapat dipergunakan pada saat fungsinya dipanggil. Uji eksak Fisher juga dapat digunakan untuk tabel yang lebih umum yaitu tabel I x J. > library(ctest) # this is not needed with R versions >= 0.99 > fisher.test(JK.partai) Fishers Exact Test for Count Data data: JK.partai p-value = 0.03115 alternative hypothesis: two.sided

Dalam contoh berikut mengenai kepuasan kerja digunakan penggunaan uji Chi-Kuadrat, pendekatan simulasi dan Uji eksak Fisher. Table 2.3. Kepuasan Kerja Berdasarkan Penghasilan Penghasilan Kepuasan Kerja Total Tidak Puas Kurang Puas Puas Sangat Puas < 5 2 4 13 3 22 5 15 2 6 22 4 34 15 25 0 1 15 8 24 > 25 0 3 13 8 24 Total 4 14 63 23 104 > puas <-c(2,4,13,3, 2,6,22,4, 0,1,15,8, 0,3,13,8) > puas <-matrix(puas,byrow=TRUE,nrow=4) > dimnames(puas) <-list(Penghasilan=c("<5","5-15","15-25",">25"),

+ Kepuasan.Kerja=c("TP","KP","P","SP")) > puas Kepuasan.Kerja

Penghasilan TP KP P SP <5 2413 3 5-15 2622 4

20

15-25 0 1 15 8 >25 0 3 13 8 > chisq.test(puas) Pearsons Chi-square test data: puas X-squared = 11.5243, df = 9, p-value = 0.2415 Warning message: Chi-square approximation may be incorrect in: chisq.test(puas)

> chisq.test(puas,simulate.p.value=TRUE,B=10000) Pearsons Chi-square test with simulated p-value (based on 10000 replicates) data: puas X-squared = 11.5243, df = NA, p-value = 0.2408 > fisher.test(puas) Fishers Exact Test for Count Data data: puas p-value = 0.2315 alternative hypothesis: two.sided

Di dalam R dimungkinkan untuk membuat fungsi yang dapat digunakan sewaktu-waktu. Ada banyak cara yang dapat digunakan untuk membuat fungsi sehingga setiap orang dapat mempunyai fungsinya sendiri-sendiri. Selain itu sebuah fungsi dapat dengan mudah di edit dan dimodifikasi oleh siapapun yang menggunakannya. Dalam membuat sebuah fungsi sebaiknya membuat fungsi yang umum dalam arti dapat digunakan untuk semua kondisi data dan dapat menampilkan semua informasi yang diinginkan. Berikut adalah contoh sebuah fungsi yang menampilkan uji chi-kuadrat dan uji rasio kemungkinan (ratio likelihood test) untuk tabel kontingensi. Fungsi ini bernama procfreq karena diadaptasi dari fungsi PROC FREQ dari software SAS. "procfreq" <-function(x, digits=4) { total <-sum(x) rowsum <-apply(x,1,sum) colsum <-apply(x,2,sum) prop <-x/total

21

rowprop <-sweep(x,1,rowsum,"/") colprop <-sweep(x,2,colsum,"/") expected <-(matrix(rowsum) %*% t(matrix(colsum))) / total dimnames(expected) <-dimnames(x) resid <-(x-expected)/sqrt(expected) adj.resid <-resid / sqrt((1-matrix(rowsum)/total) %*% t(1-matrix(colsum)/total)) df <-prod(dim(x)-1) X2 <-sum(resid2) attr(X2,"P-value") <-1-pchisq(X2,df) # Perhatikan Nilai frekuensi yang nol. tmp <-x*log(x/expected) tmp[x==0] <-0 G2 <-2 * sum(tmp) attr(G2,"P-value") <-1-pchisq(G2,df) list(sample.size=total,row.totals=rowsum,

col.totals=colsum, overall.proportions=prop, row.proportions=rowprop, col.proportions=colprop, expected.freqs=expected, residuals=resid, adjusted.residuals=adj.resid, chi.square=X2, likelihood.ratio.stat=G2, df=df)

Kita dapat menyimpan fungsi ini ke dalam software R sehingga dapat digunakan kembali pada saat dibutuhkan. Berikut adalah contohnya setelah fungsi tersebut disimpan dengan nama procfreq.R kemudian dipanggil kembali untuk digunakan dengan cara sebagai berikut dan digunakan dalam data kepuasan kerja: > source("procfreq.R") > puas.freq <-procfreq(puas) > names(puas.freq)

[1] "sample.size" "row.totals" [3] "col.totals" "overall.proportions" [5] "row.proportions" "col.proportions"

[7] "expected.freqs" "residuals" [9] "adjusted.residuals" "chi.square" [11] "likelihood.ratio.stat" "df" 22

> puas.freq$expected

Kepuasan.Kerja Penghasilan TP KP P SP <5 0.8461538 2.961538 13.32692 4.865385 5-15 1.3076923 4.576923 20.59615 7.519231 15-25 0.9230769 3.230769 14.53846 5.307692 >25 0.9230769 3.230769 14.53846 5.307692 > round(puas.freq$adjusted.residuals,2)

Kepuasan.Kerja Penghasilan TP KP P SP

<5 1.44 0.73 -0.16 -1.08 5-15 0.75 0.87 0.60 -1.77 15-25 -1.12 -1.52 0.22 1.51 >25 -1.12 -0.16 -0.73 1.51 > puas.freq$chi.square [1] 11.52426 attr(,"P-value") [1] 0.2414764 > puas.freq$likelihood.ratio.stat [1] 13.46730 attr(,"P-value") [1] 0.1425759 2.6 Uji Independensi untuk Data Ordinal Pada contoh sebelumnya yaitu data dalam Tabel 2.3 mengenai kepuasan kerja kategori dari baris dan kolom berskala ordinal. Apabila baris dan/atau kolom berskala ordinal maka uji independensi chi-kuadrat maupun uji rasio kemungkinan tidak memuat informasi order. Statistik uji yang digunakan untuk data ordinal adalah statistik M2 yang merupakan fungsi atas korelasi. Statistik M2 mengikuti distribusi chi-kuadrat dengan derajat bebas 1. Untuk ukuran sampel besar akar dari statistik M2 mendekati distribusi Normal Baku. Contoh Data berikut diambil dari buku Agresti (2007) pada bagian 2.5.2. Data mengenai studi prospektif dari ibu yang peminum dan cacat bawaan. Setelah 3 bulan pertama kehamilan, wanita

23

yang di sampel melengkapi kuesioner mengenai konsumsi alkohol. Seiring kelahiran bayi, pengamatan dicatat ada tidaknya cacat organ kelamin bawaan. Konsumsi alkohol, diukur sebagai rata-rata banyaknya minum per hari yang dicatat berskala ordinal. Cacat bawaan di ukur sebagai variabel biner. Tabel berikut merupakan hasil dari pengamatan Table 2.4. Cacat Bawaan Bayi dan Konsumsi Alkohol Ibu Konsumsi Cacat Bawaan Total Persentase Cacat Standardized Residual Alkohol Tidak Ya 0 17066 48 17114 0,28 -0,18 <1 14464 38 14502 0,26 -0,71 12 788 5 793 0,63 1,84 35 126 1 127 0,79 1,06 =6 37 1 38 2,63 2,71 Sumber Data : B. I. Graubard and E. L. Korn, Biometrics, 43: 471476, 1987. Reprinted with permission from the Biometric Society. Untuk menguji independensi antar variabel baris dan kolom pada data Tabel 2.4 digunakan Statistik uji M2. Untuk itu diberikan skor untuk variabel cacat bawaan (kolom): 'Ya' =1 dan 'Tidak' = 0 dan untuk variabel konsumsi alkohol (baris): '0' = 0, '< 1' = 0.5, '1 - 2' = 1.5, '3 -5' = 4, '>= 6' = 7. dengan nilai skor ini kita dapat menghitung korelasi antara variabel baris dengan variabel kolom sebagai berikut > cacat<-matrix(c(17066, 48, 14464, 38,788,5,126,1,37,1),5,2,byrow=T) > dimnames(cacat) <-list(Alkohol = c("0","<1","1-2","3-5" ,">=6"), Cacat = c("Tidak","Ya")) > cacat

Cacat

Alkohol Tidak Ya 0 17066 48 <1 14464 38

1-2 788 5 3-5 126 1 >=6 37 1 24

## skor untuk baris dan kolom

> u=c(0,1) > v=c(0,0.5,1.5,4,7) > prop.tot=cacat/sum(cacat) > prop.row=apply(prop.tot,1,sum) > prop.col=apply(prop.tot,2,sum) > u.rat=sum(u*prop.col) > v.rat=sum(v*prop.row)

## Korelasi

> r = sum(matrix(v-v.rat)%*%t(matrix(u-u.rat))*prop.tot) / sqrt(sum((uu. rat)^2*prop.col) * sum((v-v.rat)^2*prop.row)) >r

[1] 0.01420207 ## Statistik Uji M2

> M2<-(sum(cacat)-1)*r^2 > 1-pchisq(M2,1) # p-value

[1] 0.01037159 ## Pendekatan normal untuk sampel besar

> (M=sqrt(M2))

[1] 2.563188 > 1-pnorm(M) # p-value [1] 0.005185795 Untuk statistik M2 kita dapat membuat fungsi agar dapat digunakan pada tabel yang lebih umum. Berikut contoh fungsi yang dapat diaplikasikan pada tabel kontingensi I x J yang berskala

ordinal. tren.test <-function(x, u, v){ prop.tot<-x/sum(x) prop.row<-apply(prop.tot,1,sum) prop.col<-apply(prop.tot,2,sum) u.rat<-sum(u*prop.col) v.rat<-sum(v*prop.row) r<-sum(matrix(v-v.rat)%*%t(matrix(u-u.rat))*prop.tot)/sqrt(sum((u

25

u.rat)^2*prop.col)*sum((v-v.rat)^2*prop.row)) M2<-(sum(x)-1)*r^2 attr(M2,"P-value")<-1-pchisq(M2,1)

## Pendekatan normal untuk sampel besar

M<-sqrt(M2) attr(M,"P-value")<-1-pnorm(M) list(korelasi=r,

stat.uji.M2=M2,

stat.uji.M=M) }

> tren.test(cacat, u, v) $korelasi

[1] 0.01420207 $stat.uji.M2

[1] 6.569932 attr(,"P-value") [1] 0.01037159 $stat.uji.M [1] 2.563188 attr(,"P-value") [1] 0.005185795 2.7 Uji Eksak untuk Ukuran Sampel Kecil Contoh berikut diambil dari buku Agresti (2007) Bagian 2.6.2. Pada saat meminum teh, kolega Fisher di Stasiun Eksperimen Rothamsted dekat London mengkalim bahwa dia dapat membedakan apakah susu atau the yang ditambahkan ke dalam cangkir pertama kali. Untuk menguji hal tersebut Fisher merancang suatu percobaan sebagai berikut empat buah cangkir

ditambahkan susu pertama kali dan empat buah cangkir lainnya ditambahkan teh pertama kali. Kemudian kedelapan cangkir tersebut diacak dan diberikan kepada koleganya untuk di rasakan dan dia memberikan penilaian terhadap cangkir tersebut. Data mengenai percobaan rasa the disajikan dalam tabel berikut ini. 26

Table 2.4. Percobaan Rasa Teh

Cangkir Tamu Susu Teh Total Susu 3 1 4 Teh 1 3 4 Total 4 4 8 Penggunaan uji Eksak Fisher untuk data Rasa Teh dijelaskan dalam baris-baris berikut ini > library(ctest)

> teh <-matrix(c(3,1,1,3),ncol=2)

> dimnames(teh) <-list( cangkir=c("susu","teh"), Tamu=c("susu","teh"))

> teh Tamu

cangkir susu teh

susu 31

teh 13

> fisher.test(teh)

Fishers Exact Test for Count Data

data: teh

p-value = 0.4857

alternative hypothesis: true odds ratio is not equal to 1

95 percent confidence interval:

0.2117329 621.9337505

sample estimates:

odds ratio

6.408309

> fisher.test(teh,alternative="greater")

Fishers Exact Test for Count Data

data: teh

p-value = 0.2429

alternative hypothesis: true odds ratio is greater than 1

95 percent confidence interval:

0.3135693 Inf

sample estimates:

odds ratio

6.408309

27

2.8 Tabel Kontingensi Tiga Arah Salah satu bagian penting dalam suatu penelitian adalah memilih variabel kontrol. Dalam mengamati pengaruh variabel penjelas X terhadap variabel respon Y seharusnya kita menyesuaikan variabel-variabel (Z) yang dapat mempengaruhi hubungan tersebut karena variabel-variabel tersebut (Z) berhubungan dengan X dan Y. Dengan kata lain asosiasi X dan Y mungkin hanya menggambarkan efek dari variabel-variabel (Z) tersebut terhadap X dan Y. Bagian cross-sectional dua arah dari tabel klasifikasi silang tiga arah X dan Y pada taraf terpisah dari Z. Cross-sections ini disebut sebagai tabel parsial. Tabel parsial menunjukkan hubungan X dengan Y pada taraf tetap Z, sehingga terlihat efek X terhadap Y pada saat di kontrol oleh Z. Tabel parsial mengabaikan efek dari Z dengan menetapkan nilainya sebagai konstanta. Tabel kontingensi dua-arah hasil dari kombinasi tabel parsial disebut sebagai tabel marginal XY. Setiap isi sel adalah jumlah dari isi sel-sel pada lokasi yang sama dalam tabel parsial. Tabel marginal tidak berisi informasi mengenai Z. Dengan demikian hubungan tabel dua arah X dan Y disederhanakan. Metode-metode yang digunakan dalam tabel dua arah tidak dapat menghitung pengaruh dari variabel lain. Asosiasi dalam tabel parsial disebut asosiasi bersyarat, karena menjelaskan tentang efek X terhadap Y bersyarat pada Z yang tetap pada suatu taraf. Asosiasi bersyarat dalam tabel parsial dapat menghasilkan kesimpulan yang sangat berbeda dibandigkan dengan asosiasi dalam tabel marginal. Contoh berikut diambil dari Agresti (2007) bagian 2.7.2. Data mengenai The Death Penalty disajikan dalam tabel 2 x 2 x 2 berikut ini Tabel 2.5. Death Penalty Verdict by Defendants Race and Victims Race Victims Defendant's Death Penalty Percentage Yes Race Race Yes No White White 53 414 11.3 Black 11 37 22.9 Black White 0 16 0.0 Black 4 139 2.8 Total White 53 430 11.0 Black 15 176 7.9 28

Statistik yang digunakan dalam tabel kontingensi tiga arah adalah statistik Cochran-MantelHaenszel. Dalam software R statistik ini diimplementasikan dalam fungsi mantelhaen.test. Secara default mantelhaen.test mengaplikasikan koreksi continuity dalam pengujiannya. ## input data dalam R menggunakan array

> dp <-c(53, 414, 11, 37, 0, 16, 4, 139) > dp <-array(dp, dim=c(2,2,2)) > dimnames(dp) <-list(DeathPen=c("yes","no"),Defendant=c("white","black"), Victim=c("white","black")) > dp , , Victim = white

Defendant

DeathPen white black yes 53 11 no 414 37

, , Victim = black

Defendant

DeathPen white black yes 0 4 no 16 139

## menggunakan fungsi xtabs

> datalabel<-list(defendant=c("white","black"), death=c("yes", "no") , victim=c("white","black")) > data.dp<-expand.grid(defendant=c("white","black"), death=c("yes", "no") ,

victim=c("white","black")) > data.dp<-cbind(data.dp,count=c(53, 414, 11, 37, 0, 16, 4, 139) ) > xtabs(count~death+defendant+victim ,data=data.dp) -> dp > dp , , victim = white

defendant

death white black yes 53 11 no 414 37

29

, , victim = black defendant

death white black yes 0 4 no 16 139

> ftable(dp, row.vars=c("Victim","Defendant"), col.vars="DeathPen") DeathPen yes no

Victim Defendant

white white 53 414 black 11 37 black white 0 16 black 4 139 ## odds ratio bersyarat untuk setiap level

> apply(dp,3,function(x) x[1,1]*x[2,2]/(x[2,1]*x[1,2])) white black 0.4306105 0.0000000

## menggunakan fungsi oddsratio pada paket vcd

> library(vcd) > summary(oddsratio(dp, log=F, stratum=3))

Odds Ratio white 0.4306 black 0.9394

Catatan: Nilai Odds ratio untuk korban black yang dihasilkan fungsi oddsratio berbeda dengan nilai yang dihasilkan oleh fungsi apply karena dalam fungsi oddsratio menambahkan 0.5 pada setiap sel apabila ada sel yang bernilai nol. ## pengujian independensi

> mantelhaen.test(dp) Mantel-Haenszel chi-square test with continuity correction data: dp Mantel-Haenszel X-square = 4.779, df = 1, p-value = 0.02881 > mantelhaen.test(dp,correct=FALSE)

30

Mantel-Haenszel chi-square test without continuity correction data: dp Mantel-Haenszel X-square = 5.7959, df = 1, p-value = 0.01606

Contoh berikut mengenai percobaan yang dilakukan di dua buah klinik dengan memberikan perlakuan terhadap responden dan kemudian diukur berhasil tidaknya perlakuan tersebut. Data dimabil dari Agresti (2007) bagian 2.7.5 sebagai berikut Table 2.6. Data Percobaan di Klinik Klinik Perlakuan Respon Berhasil Gagal 1 A 18 12 B 12 8 2 A28 B 8 32 Total A 20 20 B 20 40 ## Input data dalam R menggunakan fungsi xtabs

> datalabel<-list(perlakuan=c("A", "B"), respon=c("Berhasil","Gagal"), klinik=c(K1,K2)) > data.kl<-expand.grid(perlakuan=c("A", "B"), respon=c("Berhasil","Gagal"), klinik=c(K1,K2)) > data.kl<-cbind(data.kl,jumlah=c(18, 12, 12, 8, 2, 8, 8, 32) ) > xtabs(jumlah~perlakuan+respon+klinik ,data=data.kl) -> kt > kt , , klinik = K1

respon

perlakuan Berhasil Gagal A 18 12 B 12 8

, , klinik = K2

31

respon

perlakuan Berhasil Gagal A 28 B 832

> apply(kt,3,function(x) x[1,1]*x[2,2]/(x[2,1]*x[1,2])) K1 K2 11 > library(vcd) > summary(oddsratio(kt, log=F, stratum=3))

Odds Ratio K1 1 K2 1

Terlihat bahwa dari hasil perhitungan nilai odds ratio untuk kedua klinik sama besar yaitu 1. Hal ini mengindikasikan bahwa variabel perlakuan independen secara bersyarat terhadap respon. Apabila kita mengabaikan adanya Klinik maka kita dapat menghitung odds ratio dengan cara sebagai berikut > ktot<-xtabs(jumlah~perlakuan+respon,data.kl) > ktot respon

perlakuan Berhasil Gagal A 20 20 B 20 40

> summary(oddsratio(ktot, log=F)) Odds Ratio [1,] 2

Dari hasil ini terlihat bahwa nilai odds ratio adalah 2 yang berarti pelakuan tidak saling bebas secara marginal dengan respon. Hal ini menunjukkan bahwa meskipun secara suatu variabel (X) saling bebas dengan variabel (Y) pada suatu taraf tetap sebuah variabel lain (Z) tidak menjadikan varibel (X) saling bebas dengan variabel (Y) secara marginal. Artinya mengabaikan keberadaan Klinik pada Tabel 2.6 akan memberikan kesimpulan yang keliru. 32

MODUL 3 GENERALIZED LINEAR MODELS Dalam Agresti (2007) Bab II Chapter 2 dijelaskan metode untuk menganalisis tabel kontingensi. Metode-metode tersebut membantu kita menjelaskan pengaruh variabel penjelas terhadap variabel respon kategori. Bagian lain dari Agresti (2007) ini membahas model-model sebagai dassar analisis. Pada kenyataannya metode-metode pada Bab II juga menghasilkan simpulan dari analisis dari data kategori, tetapi model dapat menangani situasi yang lebih rumit seperti analisis dari beberapa variabel penjelas secara simultan. Model yang fit memiliki beberapa keuntungan. Struktur persamaan dari model menjelaskan pola dan interaksi diantara variabel. Besaran nilai parameter menjelaskan kekuatan atau kepentingan pengaruh suatu variabel. Inferensi parameter variabel mengevaluasi variabel penjelas mana yang memiliki pengaruh terhadap respon. Model juga digunakan untuk memprediksi data dan menyempurnakan taksiran rata-rata respon pada suatu nilai variabel penjelas. Model-model dalam agresti (2007) menampilkan generalized linear model. Secara garis besar model-model meliputi regresi biasa dan Analisis Varians (ANOVA) dengan respon kontinu sebaik model-model dengan respon diskrit. Bab III dalam Agresti (2007) membahas generalized linear models untuk data dengan respon kategori dan respon diskrit yang lain. 3.1 Komponen dalam Generalized Linear Models Seluruh model dalam Generalized Linear Models (GLM) memiliki tiga komponen yaitu: 1. Komponen Acak: Diidentifikasi oleh variabel respon (Y) dan diasumsikan memiliki distribusi. 2. Komponen sistematik: Meliputi variabel-variabel penjelas dari model. 3. Fungsi penghubung (link function): yaitu suatu fungsi yang menjelaskan nilai ekspektasi dari variabel respon (Y) yang menghubungkan dengan variabel-variabel penjelas melalui persamaan linier. 33

g() = 0 + 1X1 + + kXk Fungsi penghubung akan menentukan model yang akan digunakan dalam GLM. Fungsi penghubung paling sederhana adalah g()= disebut sebagai penghubung identitas (identity link). Apabila GLM memiliki fungsi penghubung paling sederhana maka GLM merupakan model regresi linier tentunya dengan respon kontinu. Fungsi penghubung yang lain akan menghubungkan secara nonlinier terhadap prediktor 3.2 Generalized Linear Models dalam R Dalam software R GLM terdapat dalam fungsi glm yang terdapat dalam paket stats. Paket stat sudah disertakan secara default didalam software R sehingga kita dapat langsung menggunakannya saja. Adapun cara penggunaan paket ini adalah sebagai berikut Penggunaan:

glm(formula, family = gaussian, data, weights, subset, na.action, start = NULL, etastart, mustart, offset, control = list(...), model = TRUE, method = "glm.fit", x = FALSE, y = TRUE, contrasts = NULL, ...)

Keterangan:

formula: persamaan model yang digunakan, tanda ~ menunjukkan persamaan, ruas kiri diisi oleh variabel respon dan disebelah kanan variabel prediktor. Ruas kanan persamaan dapat ditulis hanya order tertinggi.

family: adalah distribusi dari error berserta link function yang digunakan dalam model. Untuk regresi logit binomial, probit binomial(probit), model loglinier poisson

data: input data berupa data frame berisi variabel-variabel dalam model

weights: (optional) berupa vektor bobot yang digunakan pada saat fit regresi logistik dengan input respon berupa proporsi

subset: (optional) berupa vektor yang berisi subset pengamatan yang akan digunakan dalam proses fitting.

34

na.action: fungsi yang digunakan dalam penanganan data hilang start: nilai awal untuk taksiran parameter dalam prediktor linier. etastart: nilai awal untuk prediktor linier. mustart: nilai awal untuk vektor rata-rata. model: berisi nilai logika yang mengindikasikan model yang akan disertakan sebagai komponen dari model. method: metode yang digunakan untuk fitting model. Secara default metode yang diguanakan adalah "glm.fit" yang menggunakan

iteratively reweighted least squares (IWLS). contrasts: adalah kontras yang digunakan apabila prediktor berupa kategori. intercept: bernilai TRUE bila intersep disertakan ke dalam model, dan FALSE

sebaliknya

Output yang dihasilkan:

coefficients: berisi vektor koefisien residuals: berisi nilai residual fitted.values: nilai rata-rata fit, diperoleh melalui transformasi prediktor

linier menggunakan persamaan link function. rank: the numeric rank of the fitted linear model. family: distribusi error dan fungsi penghubung yang digunakan. deviance: nilai devians dari model aic: nilai Akaike's An Information Criterion

35

null.deviance: nilai devians dibawah hipotesis nol

iter: banyak iterasi hingga konvergen dari IWLS. weights: bobot yang digunakan df.residual: derajat bebas dari residual. df.null: derajat bebas dari model dibawah hipotesis nol. Secara umum metode penaksiran yang digunakan dalam fungsi glm adalah iteratively reweighted least squares (IWLS) yang menggunakan metode Fisher scoring untuk optimasinya. Untuk metode lain seperti kemungkinan maksimum dan metode optimasi Newton-Rhapson untuk optimasinya tidak diimplementasiakn dalam fungsi ini. Dengan demikian kita harus menggunakan fungsi lain seperti fungsi optim atau kita dapat membuat fungsi sendiri atau menggunakan fungsi yang telah dibuat oleh orang lain seperti fungsi berikut ini (Venables & Ripley, 2002) logit.reg <-function(x, y, wt = rep(1, length(y)), intercept = T, start = rep(0, p), ...) { if(!exists("optim")) library(MASS)

## Awal bagian yang dapat di ubah

fmin <-function(beta, X, y, w) p <-plogis(X %*% beta) -sum(2 * w * ifelse(y, log(p), log(1-p))) gmin <-function(beta, X, y, w) { eta <-X %*% beta; p <-plogis(eta) t(-2 * (w *dlogis(eta) * ifelse(y, 1/p, -1/(1-p))))%*% X }

## akhir bagian yang dapat diubah

if(is.null(dim(x))) dim(x) <-c(length(x), 1) dn <-dimnames(x)[[2]] if(!length(dn)) dn <-paste("Var", 1:ncol(x), sep="") p <-ncol(x) + intercept if(intercept) {x <-cbind(1, x); dn <-c("(Intercept)", dn)}

if(is.factor(y)) y <-(unclass(y) != 1) fit <-optim(start, fmin, gmin, X = x, y = y, w = wt, ...) names(fit$par) <-dn

36

cat("\nCoefficients:\n"); print(fit$par) cat("\nResidual Deviance:", format(fit$value), "\n") cat("\nConvergence message:", fit$convergence, "\n") invisible(fit) }

Untuk model linier probability ubah bagian yang diberi tanda bagian yang dapat diubah dengan fungsi berikut ini fmin <-function(beta, X, y, w) p <-X %*% beta -sum(2 * w * ifelse(y, log(p), log(1-p))) gmin <-function(beta, X, y, w) { p <-X %*% beta; t(-2 * (w * ifelse(y, 1/p, -1/(1-p))))%*% X }

Untuk model probit ubah bagian yang diberi tanda bagian yang dapat diubah dengan fungsi berikut ini fmin <-function(beta, X, y, w) { p <-X %*% beta -sum(2 * w * ifelse(y, log(p), log(1-p))) } gmin <-function(beta, X, y, w) { p <-X %*% beta; t(-2 * (w * ifelse(y, 1/p, -1/(1-p))))%*% X }

3.2 Generalized Linear Models untuk Respon Biner Variabel respon banyak yang hanya memiliki dua kategori misalnya kelulusan dalam tes (lulus atau tidak), pengobatan penyakit (sembuh atau tidak) dan lain-lain. Secara umum dapat dikatakan bahwa variabel respon Y hanya memiliki dua hasil yang mungkin yaitu sukses yang dilambangkan dengan angka satu (1) dan gagal yang dilambangkan dengan angka nol (0). Variabel seperti ini disebut sebagai variabel biner. Distribusi dari Y memiliki peluang sukses P(Y = 1) = p dan peluang gagal P(Y = 0) = (1 - p ) dengan ekspektasi E(Y) = p. Untuk sebuah 37

pengamatan Y akan mengikuti distribusi Bernoulli. Dengan demikian untuk n pengamatan yang saling bebas, banyak sukses akan memiliki distribusi Binomial dengan parameter p . Dalam bagian ini kita akan membahas GLM dengan respon biner dengan sebuah variabel penjelas (X) saja meskipun sebenarnya GLM dapat digunakan untuk variabel penjelas lebih dari satu. Perubahan nilai p dipengaruhi oleh perubahan X. Contoh: Dengkuran dan Penyakit Jantung Contoh berikut diambil dari Agresti (2007) bagian 3.2.2. Data yang digunakan didasarkan pada survei epidemiologi dari 2484 orang responden (subjek) yang diduga mendengkur pada saat tidur dan mempunyai resiko terkena serangan jantung. Subjek dikelompokkan berdasarkan tingkat dengkurannya yang di jelaskan oleh pasangan mereka. Data disajikan dalam tabel berikut ini Table 3.1. Hubungan Penyakit Jantung dengan Kebiasaan Mendengkur Dengkuran Penyakit Jantung Proporsi Ya Ya Tidak Tidak Pernah 24 1355 0,017 Kadang-kadang 35 603 0,06 Sering 21 192 0,1 Selalu 30 224 0,12 Sumber: P. G. Norton and E. V. Dunn, Br. Med. J., 291: 630632, 1985, published by BMJ Publishing Group. Analisis untuk data tersebut dilakukan untuk nilai skor yang diberikan bagi kategori prediktornya yang digunakan dalam Agresti (2007) yaitu (0, 2, 4, 5). Berikut analisis untuk data tersebut didalam R. Pertama-tama kita input datanya kedalam R dengan cara sebagai berikut > dengkur <-matrix(c(24,1355,35,603,21,192,30,224), ncol=2, byrow=TRUE) > dimnames(dengkur) <list( dengkur=c("tidak","kadang","sering","selalu"),sakit.jantung=c("ya","tidak ")) > dengkur

sakit.jantung dengkur ya tidak tidak 24 1355

38

kadang 35 603 sering 21 192 selalu 30 224 > nilai <-c(0,2,4,5)

Analisis data tersebut menggunakan regresi logistik dengan cara sebagai berikut > dengkuran <-glm(dengkur~nilai, family=binomial() ) > summary(dengkuran) Call: glm(formula = dengkur ~ nilai, family = binomial())

Deviance Residuals: tidak kadang sering selalu -0.8346 1.2521 0.2758 -0.6845

Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) -3.86625 0.16621 -23.261 < 2e-16 *** nilai 0.39734 0.05001 7.945 1.94e-15 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1 (Dispersion parameter for binomial family taken to be 1)

Null deviance: 65.9045 on 3 degrees of freedom Residual deviance: 2.8089 on 2 degrees of freedom AIC: 27.061

Number of Fisher Scoring iterations: 4

> coef(dengkuran) (Intercept) nilai -3.8662481 0.3973366 > predict(dengkuran, type="response") tidak kadang sering selalu 0.02050742 0.04429511 0.09305411 0.13243885

39

Dalam fungsi glm secara default digunakan fungsi penghubuang logit. Apabila fungsi penghubung yang digunakan adalah probit maka kita dapat menggunakan cara berikut ini: > dengkuran.probit <-glm(dengkur~nilai, family=binomial(link="probit") ) > summary(dengkuran.probit)

Call: glm(formula = dengkur ~ nilai, family = binomial(link = "probit"))

Deviance Residuals: tidak kadang sering selalu -0.6188 1.0388 0.1684 -0.6175 Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) -2.06055 0.07017 -29.367 < 2e-16 *** nilai 0.18777 0.02348 7.997 1.28e-15 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 65.9045 on 3 degrees of freedom Residual deviance: 1.8716 on 2 degrees of freedom AIC: 26.124

Number of Fisher Scoring iterations: 4

> coef(dengkuran.probit) (Intercept) nilai

-2.0605516 0.1877705 > predict(dengkuran.probit, type="response")

tidak kadang sering selalu 0.01967292 0.04599325 0.09518763 0.13099515

40

Dalam fungsi glm tidak disertakan model linear probability sehingga kita harus menggunakan fungsi logit.reg dengan menggunakan model linear probability sehingga akan berbentuk sebagai berikut lpm.reg <-function(x, y, wt = rep(1, length(y)), intercept = T, start = rep(0, p), ...) { if(!exists("optim")) library(MASS) fmin <-function(beta, X, y, w) { p <-X %*% beta -sum(2 * w * ifelse(y, log(p), log(1-p))) } gmin <-function(beta, X, y, w) { p <-X %*% beta; t(-2 * (w * ifelse(y, 1/p, -1/(1-p))))%*% X } if(is.null(dim(x))) dim(x) <-c(length(x), 1) dn <-dimnames(x)[[2]] if(!length(dn)) dn <-paste("Var", 1:ncol(x), sep="") p <-ncol(x) + intercept if(intercept) {x <-cbind(1, x); dn <-c("(Intercept)", dn)} if(is.factor(y)) y <-(unclass(y) != 1) fit <-optim(start, fmin, gmin, X = x, y = y, w = wt, ...) names(fit$par) <-dn cat("\nCoefficients:\n"); print(fit$par) cat("\nResidual Deviance:", format(fit$value), "\n") cat("\nConvergence message:", fit$convergence, "\n") invisible(fit) }

Fungsi lpm.reg dapat digunakan pada data dengan format yang berbeda dengan data dengkur diatas sehingga kita ubah data tersebut dengan cara sebagai berikut > n<-c(24+1355, 35+603, 21+192, 30+224) > x<-rep(c(0,2,4,5),n) > y<-rep(rep(c(1,0),4),c(24,1355,35,603,21,192,30,224))

41

> fit.lpm<-lpm.reg(x=x, y=y, start=c(0.05,0.05),hessian=T, method="BFGS") Coefficients: (Intercept) Var1

0.01724645 0.01977784

Residual Deviance: 834.9919

Convergence message: 0 There were 38 warnings (use warnings() to see them) > #standard error > sqrt(diag(solve(fit.lpm$hessian)))

[1] 0.002426329 0.001976457 > #nilai peluang fit > unique(cbind(1, x)%*%fit.lpm$par) [,1] [1,] 0.01724645 [2,] 0.05680213 [3,] 0.09635782 [4,] 0.11613566

Catatan: fungsi logit.reg dapat digunakan juga untuk probit (misalnya diberi nama probit.reg) dengan sedikit modifikasi dengan cara sebagai berikut probit.reg <-function(x, y, wt = rep(1, length(y)), intercept = T, start = rep(0, p), ...) {

fmin <-function(beta, X, y, w) { p <-pnorm(X %*% beta) -sum(2 * w * ifelse(y, log(p), log(1-p))) } gmin <-function(beta, X, y, w) {

eta <-X %*% beta; p <-pnorm(eta) t(-2 * (w *dnorm(eta) * ifelse(y, 1/p, -1/(1-p))))%*% X }

if(is.null(dim(x))) dim(x) <-c(length(x), 1) dn <-dimnames(x)[[2]] if(!length(dn)) dn <-paste("Var", 1:ncol(x), sep="") p <-ncol(x) + intercept

42

if(intercept) {x <-cbind(1, x); dn <-c("(Intercept)", dn)} if(is.factor(y)) y <-(unclass(y) != 1) fit <-optim(start, fmin, gmin, X = x, y = y, w = wt, ...) names(fit$par) <-dn cat("\nCoefficients:\n"); print(fit$par) cat("\nResidual Deviance:", format(fit$value), "\n") cat("\nConvergence message:", fit$convergence, "\n") invisible(fit) }

Dengan fungsi ini kita dapat menghitung nilai peluang prediksi untuk fungsi penghubung probit dan dengan fungsi logit.reg kita dapat menghitung peluang prediksi untuk fungsi penghubuang logit. Untuk data yang sudah diubah menjadi x dan y cara yang digunakan adalah sebagai berikut > fit.logit<-logit.reg(x=x, y=y,hessian=T, method="BFGS")

Coefficients: (Intercept) Var1 -3.8662448 0.3973350

Residual Deviance: 837.7316 Convergence message: 0 > fit.probit<-probit.reg(x=x, y=y, start=c(-3.87,0.4))

Coefficients: (Intercept) Var1 -2.0606309 0.1878692

Residual Deviance: 836.7943 Convergence message: 0

Menggabungkan nilai peluang prediksi dari fungsi penghubung linear probability, logit dan probit dengan cara sebagai berikut

43

> p.lpm<-(cbind(1, x)%*%fit.lpm$par) > eta.logit<-(cbind(1, x)%*%fit.logit$par) > p.logit=exp(eta.logit)/(1+exp(eta.logit)) > eta.probit<-(cbind(1, x)%*%fit.probit$par) > p.probit<-pnorm(eta.probit) > res<-cbind(lpm=unique(p.lpm),logit=unique(p.logit), probit=unique(p.probit)) > dimnames(res)<-list(unique(x),c("lpm","logit","probit")) > res

lpm logit probit 0 0.01724645 0.02050748 0.01966914 2 0.05680213 0.04429512 0.04600466 4 0.09635782 0.09305386 0.09524107 5 0.11613566 0.13243832 0.13108329

Apabila kita akan menggambarkan plot dari ketiga peluang prediksi untuk fungsi penghubung linear probability, probit dan logit dapat dilakukan dengan cara sebagai berikut > dengkur.plot<-unique(x) > plot(x,p.logit,type="n",xlim=c(0,5),ylim=c(-.005,.20),xlab="Tingkat Dengkuran", ylab="Peluang Prediksi", bty="L") > lines(dengkur.plot,unique(p.lpm),type="l",lty=1) > lines(dengkur.plot,unique(p.logit),type="b",pch=16) > lines(dengkur.plot,unique(p.probit),type="b",pch=17) > legend(x=.05,y=.18,legend=c("Logistic","Probit","Linear"), lty=c(1,1,1), pch=c(16,17,-1), cex=.85, text.width=1, adj=-.5)

maka akan muncul grafik seperti gambar dibawah ini 44

Gambar 3.1 Grafik Peluang Prediksi dari tiga Fungsi Penghubung 3.2.1 Model Regresi Logistik Hubungan antara p(x) dan x biasanya nonlinear. Perubahan tetap dari x akan memberikan efek yang sedikit pada saat nilai p mendekati 0 atau mendekati 1, sebaliknya perubahan tetap x akan memberikan efek yang besar pada saat p mendekati nilai tengah. Pada kenyataannya p(x) selalu bertambah secara kuntinu atau berkurang secara kontinu seiring bertambah atau berkurangnya x. Kurva yang terbentuk pada Gambar 3.2 dibawah ini, seperti huruf S, memperlihatkan kurva real untuk hubungan x dengan p(x). Hal terpenting adalah fungsi matematik untuk kurva ini adalah sebagai berikut .... x. exp.... x. e ..x .= = (3.1) .. .. x. 1.exp.... x. 1.e Persamaan diatas menggunakan fungsi eksponensial disebut fungsi regresi logistik. Sehingga model regresi logistik dapat dinyatakan dengan persamaan berikut 45

.. x. log=... x (3.2) .. 1-.. x. Baris-baris perintah berikut untuk menggambarkan fungsi tersebut > pi<-seq(0.01, 1, 0.01) > x<-log(pi/(1-pi)) > plot(x,pi, type="l")

Gambar 3.2 (a) Plot Fungsi Regresi Logistik untuk > 0 > pi<-seq(0.01, 1, 0.01) > x<-(-log(pi/(1-pi))) > plot(x,pi, type="l")

46

Gambar 3.2 (b) Plot Fungsi Regresi Logistik untuk < 0

3.2.2 Model Regresi Probit Model yang juga memiliki pola kurva S seperti pada Gambar 3.2 disebut model probit. Fungsi penghubung dari model ini disebut dengan probit link, menggunakan pendekatan normal baku dengan cara mentrasformasikan nilai peluang ke nilai baku Z. Model probit mempunyai persamaan probit[p(x)] = a + x (3.3) Fungsi penghubuang probit mentrasformasikan p(x) menjadi nilai baku Z yang berdistribusi Normal, misalnya untuk probit(0.05) = -1.645, karena untuk peluang 5% distribusi normal baku berada di titik -1.645. Begitupula dengan probit(0.50) = 0, probit(0.95) = 1.645, dan probit(0.975) = 1.96. Untuk data hubungan penyakit jantung dengan kebiasaan mendengkur dengan nilai skor {0, 2, 4, 5} untuk tingkat dengkuran, taksiran kemungkinan maksimum probit model probit[p(x)] = -2.061 + 0.188x Pada tingkat dengkuran x = 0, nilai probit adalah -2.061 + 0.188(0) = -2.06. Nilai fit peluang p(0) adalah peluang dari distribusi normal baku pada z = -2.06, adalah 0.020. Pada tingkat 47

dengkuran x = 5, nilai probit adalah -2.061 + 0.188(5) = -1.12, yang nilai fit peluangnya adalah 0.131. Nilai fit yang terlihat dari Tabel 3.1 dan Gambar 3.1 sama dengan linear probability dan regresi logistik. Pada praktiknya, model regresi probit dan logistik sama-sama fit. Jika model regresi logistik fit maka model probit juga akan fit, begitu pula sebaliknya. Contoh: Data diambil dari Agresti (2007) mengenai Penelitian nasional mengenai perilaku anak remaja umur 15 16 tahun yang pernah melakukan hubungan Intim. Data disajikan dalam tabel berikut Tabel 3.2 Perilaku Remaja 15 16 Tahun Ras Jenis Kelamin Pernah berhubungan Intim Ya Tidak Kulit Putih Laki-laki 43 134 Perempuan 26 149 Kulit Laki-laki 29 23 Hitam Perempuan 22 36 Sumber S. P. Morgan and J. D. Teachman, J Marriage Fam. 50, 929 936 (1988) Analisis data tersebut menggunakan regresi logistik dengan fungsi penghubung logit dan probit pada taraf keyakinan 95%. ##Menampilkan tabel kontingensi

> remaja<-array(c(43,134,26,149,29,23,22,36),c(2,2,2)) > dimnames(remaja)<-list(hub=c("ya","tidak"), jk=c("Lakilaki"," Perempuan"),ras=c("putih","hitam"))

> remaja , , ras = putih

jk

hub Laki-laki Perempuan ya 43 26 tidak 134 149

48

, , ras = hitam

jk

hub Laki-laki Perempuan ya 29 22 tidak 23 36

##Analisis Regresi Logistik

> n<-c(43+134, 26+149, 29+23, 22+36) > ras<-rep(c(1,1,0,0),n) > jk<-rep(c(1,0,1,0),n) > hub<-rep(rep(c(1,0),4),c(43,134, 26,149, 29,23, 22,36)) > hubungan<-glm(hub~ras+jk, family=binomial) > hubungan$deviance

[1] 491.7948 ##devians untuk model di bawah hipotesis nol

> hubungan$null.deviance

[1] 529.2534 ##Analisis Regresi Probit

> hubungan2<-glm(hub~ras+jk, family=binomial(link="probit")) > hubungan$deviance

[1] 491.7948 #devians untuk model di bawah hipotesis nol

> hubungan$null.deviance

[1] 529.2534 Dari hasil diatas ternyata nilai devians dari model sebesar 491.87 lebih besar dari devians untuk Model dibawah hipotesis nol (Null Model) sehingga dapat dikatakan bahwa model fit. Soal Latihan: Peran Wanita di Masyarakat Data berikut diambil dari survei nasional tahun 1974 dan 1975 oleh National Opinion Research Centre, University of Chicago, Illinois (dalam Collet, 2003). Dalam survei tersebut diteliti mengenai sikap responden mengenai wanita yang tinggal di rumah. Responden dalam hal ini dibagi menjadi responden pria dan wanita dan diukur lamanya mereka sekolah dalam arti 49

semakin lama sekolah maka tingkat pendidikan semakin tinggi. Dalam penelitian ini ingin diketahui apakah jenis kelamin dan tingkat pendidikan mempunyai pengaruh terhadap sikap responden mengenai wanita yang tinggal dirumah. a. Bagaimanakah asosiasi jenis kelamin dengan sikap responden berdasarkan tingkat pendidikan. b. Analisis data tersebut menggunakan regresi logistik 3.3 Generalized Linear Models untuk Data Count Dalam suatu penelitian terkadang variabel respon merupakan hasil pencacahan atau penghitungan (counting). Count juga merupakan ringkasan variabel kategori dalam tabel kontingensi. Model GLM yang digunakan untuk data count diasumsikan berdistribusi Poisson. Distribusi Poisson merupakan distribusi unimodal dan miring kekanan untuk nilai-nilai 0, 1, 2, . . . . Poisson mempunyai parameter tunggal yaitu > 0, yang mempunyai rata-rata dan varians yang sama yaitu E(Y) = Var(Y) = Fungsi massa peluang untuk distribusi Poisson adalah sebagai berikut -. .y e P. y .= ! , untuk y = 0, 1, 2, ... y Bentuk Distribusi Poisson sangat dipengaruhi oleh rata-ratanya. Bagaimanapun untuk sampel besar, semakin besar rata-ratanya maka bentuk distribusinya akan semakin mendekati simetris. Gambar 3.3 memperlihatkan bentuk Distribusi Poisson untuk dua rata-rata 2 dan 6. 50

Gambar 3.3 (a) Distribusi Poisson dengan Rata-rata 2.

Gambar 3.3 (a) Distribusi Poisson dengan Rata-rata 6. 3.3.1 Model Regresi Poisson Distribusi Poisson mempunyai rata-rata positif. Model GLM untuk rata-rata Poisson dapat menggunakan fungsi penghubung identitas, tetapi lebih umum nilai logaritma rata-rata. Seperti fungsi linier a + x, log rata-rata dapat digunakan untuk suatu nilai real. Model loglinear Poisson 51

adalah GLM dengan asumsi Y berdistribusi Poisson dan menggunakan fungsi penghubung log. Untuk variabel penjelas tunggal x, model log linier Poisson memiliki persamaan sebagi berikut log = a + x (3.5) Rata-rata dalam persamaan diatas mempunyai hubungan eksponensial sebagai berikut = exp(a + x) = ea (e)x (3.6) Setiap kenaikan x satu satuan akan berpengaruh secara e pada : Rata-rata Y pada x + 1 sama dengan rata-rata Y pada x dikalikan dengan e. Jika = 0, maka e = 1 dan faktor pengalinya adalah 1. Dengan demikian rata-rata Y tidak akan berubah apabila x berubah. Jika > 0, maka e > 1, sehingga rata-rata Y meningkat seiring meningkatnya x. Jika < 0, rata-rata Y menurun seiring menurunnya x. Contoh: Kepiting Horseshoe Betina dan Satelitnya Data diambil dari Agresti (2007) Tabel 3.2 yang bersumber dari (J. Brockmann, Ethology, 102: 121, 1996). Penelitian ini meneliti faktor-faktor yang memengaruhi kepiting betina memiliki jantan yang lain, disebut sebagai satelit, yang berada disekitarnya. Variabel respon adalah banyaknya satelit dari kepiting betina. Variabel penjelas adalah lebar cangkang kepiting betina. Dalam menganalisis data ini penulis telah membuat data dalam format csv dengan nama crabs.csv sehingga dapat dipanggil dalam software R. Rata-rata dan simpangan baku dari lebar cangkang adalah sebagai berikut > crabs<-read.csv("crabs.csv", sep=";") > str(crabs) 'data.frame': 173 obs. of 5 variables:

$X.C:int 2334214222... $S :int 3332323313... $ W : num 28.3 26 25.6 21 29 25 26.2 24.9 25.7 27.5 ... $ Wt : num 3.05 2.6 2.15 1.85 3 2.3 1.3 2.1 2 3.15 ... $Sa:int 8400130086...

> mean(crabs$W)

[1] 26.29884

> sd(crabs$W) [1] 2.109061 52

Dari data tersebut kita akan membuat plot antara lebar cangkang (cm) dengan banyaknya satelit. Untuk keperluan itu data diubah dahulu sehingga setiap titik mengindikasikan banyaknya pasangan yang unik dari variabel banyaknya satelit dengan variabel lebar cangkang. Dalam R dapat kita gunakan baris-baris perintah berikut ini plot.crabs<-aggregate(rep(1,nrow(crabs)), list(Sa=crabs$Sa,W=crabs$W), sum) plot.crabs$Sa<-as.numeric(as.vector(plot.crabs$Sa)) plot.crabs$W<-as.numeric(as.vector(plot.crabs$W))

Kemudian dari data yang telah di aggregate kita buat plot dengan cara berikut ini plot(y=plot.crabs$Sa,x=plot.crabs$W,xlab="Lebar Cangkang (cm)", ylab="Banyaknya Satelit", bty="L", axes=F, type="n") axis(2, at=1:15) axis(1, at=seq(20,34,2)) text(y=plot.crabs$Sa,x=plot.crabs$W,labels=plot.crabs$x)

Gambar 3.4 Banyak satelit berdasarkan Lebar Cangkang (cm) dari Kepiting Betina 53

Kemudian kita akan plot data tersebut berdasarkan rata-rata Lebar Cangkang kepiting betina dengan rata-rata banyaknya satelit. Plot akan ditambahkan dengan garis pemulusan. Baris perintah berikut dapat kita gunakan untuk menggambarkan hal tersebut. crabs$W.fac<-cut(crabs$W, breaks=c(0,seq(23.25, 29.25),Inf)) plot.y<-aggregate(crabs$Sa, by=list(W=crabs$W.fac), mean)$x plot.x<-aggregate(crabs$W, by=list(W=crabs$W.fac), mean)$x plot(x=plot.x, y=plot.y, ylab="Banyaknya Satelit", xlab="Lebar Cangkang (cm)",bty="L", axes=F, type="p", pch=16) axis(2, at=0:5) axis(1, at=seq(20,34,2)) #library(mgcv) res<-gam(plot.y~s(plot.x, k=4, fx=TRUE), family=poisson(link=log)) lines(x=plot.x,y=res$fitted.values)

Gambar 3.5 Pemulusan Banyaknya Kepiting Horseshoe

Kemudian data tersebut akan dianalisis menggunakan model regresi Poisson menggunakan fungsi glm. 54

> log.fit<-glm(Sa~W, family=poisson(link=log),data=crabs) > summary(log.fit) Call: glm(formula = Sa ~ W, family = poisson(link = log), data = crabs)

Deviance Residuals: Min 1Q Median 3Q Max -2.8526 -1.9884 -0.4933 1.0970 4.9221 Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) -3.30476 0.54224 -6.095 1.10e-09 *** W 0.16405 0.01997 8.216 < 2e-16 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for poisson family taken to be 1)

Null deviance: 632.79 on 172 degrees of freedom Residual deviance: 567.88 on 171 degrees of freedom AIC: 927.18

Number of Fisher Scoring iterations: 6

Dari hasil diatas model yang diperoleh adalah sebagai berikut log .... x = -3.30476 + 0.16405x =.. .

Efek dari = 0.164 mempunyai standard error 0.01997. Karena > 0, penaksir lebar mempunyai efek positif pada banyaknya satelit. Model fit menghasilkan taksiran rata-rata banyak satelit , nilai fit pada setiap lebar. Sebagai contoh untuk suatu lebar x = 26.3 maka rata-rata banyak satelit adalah > exp(log.fit$coefficient[1] + log.fit$coefficient[2]*(26.3)) (Intercept)

2.744581

55

Selain itu dalam Agresti (2007) juga dijelaskan bagaimana model Poisson ini menggunakan fungsi penghubung identitas. Dalam R dapat digunakan baris perintah berikut ini > id.fit<-glm(Sa~W, family=poisson(link=identity),data=crabs, start=coef(log.fit)) > summary(id.fit) Call: glm(formula = Sa ~ W, family = poisson(link = identity), data = crabs,

start = coef(log.fit))

Deviance Residuals:

Min 1Q Median 3Q Max -2.9113 -1.9598 -0.5405 1.0406 4.7988

Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) -11.52547 0.67767 -17.01 <2e-16 *** W 0.54925 0.02968 18.50 <2e-16 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for poisson family taken to be 1)

Null deviance: 632.79 on 172 degrees of freedom Residual deviance: 557.71 on 171 degrees of freedom AIC: 917

Number of Fisher Scoring iterations: 22

Sehingga berdasarkan hasil terseut model fit untuk fungsi penghubung identitas adalah .... x = -11.52547 + 0.54925x =.. . Efek dari = 0.54925 mempunyai standard error 0.02968. Karena > 0, penaksir lebar mempunyai efek positif pada banyaknya satelit. 56

> plot(x=plot.x, y=plot.y, ylab=expression(paste("Rata-rata Banyaknya Satelit,",{mu})), xlab="Lebar Cangkang (cm)",bty="L",axes=F, type="p", pch=16) > axis(2,at=0:5) > axis(1,at=seq(20,34,2)) > ind<-order(crabs$W) > lines(x=crabs$W[ind],y=log.fit$fitted.values[ind])

> lines(x=crabs$W[ind],y=id.fit$fitted.values[ind]) > arrows(x0=23.5,y0=2.9,x1=23.5,y1=predict(log.fit,newdata=data.frame(W=23.5), type="response"), length=.2)

> text(x=23.5,y=3,"Link Log") >

arrows(x0=29.75,y0=3.1,x1=29.75,y1=predict(id.fit,newdata=data.frame(W=29.75), type="response"), length=.2) > text(x=29.75,y=2.9,"Link Identitas")

57

Gambar 3.6 Penaksir rata-rata banyak satelit untuk fungsi penghubung Log dan Identitas.

58

MODUL 4 REGRESI LOGISTIK

Dalam modul ini kita akan fokuskan pada pemodelan statistik untuk variabel respon biner, yang mana hanya memiliki dua kemungkinan yaitu sukses dan gagal. Model yang paling sering digunakan untuk respon biner adalah model regresi logistik seperti yang telah diperkenalkan pada modul 3 yang merupakan bagian dari GLM. Dalam modul ini akan dijelaskan mengenai inferensi untuk parameter model regresi logistik yang meliputi penanganan prediktor kategori, regresi logistik multipel dan membuat kesimpulan. Secara umum ada tiga cara untuk membuat pemodelan regresi logistik dalam R. Dengan menggunakan fungsi glm. Venables and Ripley menjelaskan ketiga cara tersebut sebagai berikut 1. Variabel respon merupakan vektor biner (bernilai 0 dan 1) atau vektor bernilai logika (TRUE/FALSE). 2. Variabel respon merupakan nilai numerik yang berisi proporsi sukses, tetapi banyaknya sukses harus didefinisikan bobot menggunakan vektor bobot. 3. Variabel respon merupakan sebuah matriks dua kolom yang diasumsikan bahwa kolom pertama berisi banyak sukses dan kolom kedua berisi banyak gagal. 4.1 Data Biner Dalam regresi logistik respon biner dapat berupa data terkelompok (group) atau data tidak terkelompok (ungroup). Kedua jenis data ini dapat ditentukan model regresi logistiknya. Sebagai contoh untuk data sebelumnya (pada modul 3) mengenai kebiasaan mendengkur dan serangan jantung merupakan data yang terkelompok (group data). Dalam modul ini akan dijelaskan bagaimana menggunakan regresi logistik untuk data tersebut. Mula-mula kita input datanya sebagai data frame dengan skor tingkat dengkuran adalah: > dengkuran <-data.frame(

+ dengkur = c(0,2,4,5), 59

+ sakit.jantung = c(24,35,21,30), + n = c(1379,638,213,254) ) > dengkuran dengkur sakit.jantung n

1 0 24 1379 2 2 35 638 3 4 21 213 4 5 30 254 Kemudian kita gunakan model regresi logistik untuk data tersebut menggunakan proporsi dengan serangan jantung sebagai respon dan n (banyak kejadian) sebagai bobot: > mendengkur <-glm(sakit.jantung/n ~ dengkur, weights=n, family=binomial(), data=dengkuran) > mendengkur

Call: glm(formula = sakit.jantung/n ~ dengkur, family = binomial(), data = dengkuran, weights = n)

Coefficients: (Intercept) dengkur -3.8662 0.3973

Degrees of Freedom: 3 Total (i.e. Null); 2 Residual Null Deviance: 65.9 Residual Deviance: 2.809 AIC: 27.06

Untuk menentukan model regresi logistik menggunakan matriks dapat melalui cara sebagai berikut: Pertama-tama kita buat matriks didalam data frame dengkuran: > dengkuran$YN <-cbind(dengkuran$sakit.jantung,dengkuran$ndengkuran$ sakit.jantung) > dengkuran

dengkur sakit.jantung n YN.1 YN.2 1 0 24 1379 24 1355 2 2 35 638 35 603

60

3 4 21 213 21 192 4 5 30 254 30 224

Dengan menggunakan YN kita dapat membuat model regresi logistik seperti contoh sebelumnya dengan memperlakukan matriks YN sebagai respon (tanpa pembobotan): > mendengkur.2 <-glm(YN ~ dengkur, family=binomial(), data=dengkuran) > mendengkur.2

Call: glm(formula = YN ~ dengkur, family = binomial(), data = dengkuran)

Coefficients: (Intercept) dengkur -3.8662 0.3973

Degrees of Freedom: 3 Total (i.e. Null); 2 Residual Null Deviance: 65.9 Residual Deviance: 2.809 AIC: 27.06

Untuk data yang tidak terkelompok (ungroup data) kita gunakan data pada Modul 3 mengenai Kepiting Horseshoe Betina dan Satelitnya. Variabel respon adalah banyaknya satelit dari kepiting betina. Variabel penjelas adalah lebar cangkang kepiting betina. Dalam menganalisis data ini penulis telah membuat data dalam format csv dengan nama crabs.csv sehingga dapat dipanggil dalam software R. Rata-rata dan simpangan baku dari Berat kepiting adalah sebagai berikut > crabs<-read.csv("crabs.csv", sep=";") > str(crabs) 'data.frame': 173 obs. of 5 variables:

$X.C:int 2334214222... $S :int 3332323313... $ W : num 28.3 26 25.6 21 29 25 26.2 24.9 25.7 27.5 ... $ Wt : num 3.05 2.6 2.15 1.85 3 2.3 1.3 2.1 2 3.15 ...

$Sa:int 8400130086...

61

> mean(Wt);sd(Wt)

[1] 2.437225 [1] 0.5772553 Keterangan: X.C=warna, S=kondisi duri, W=lebar cangkang (cm), Wt = berat (kg), Sa = banyak satelit Dari data tersebut kita akan membuat plot antara berat (kg) dengan banyaknya satelit. Untuk keperluan itu data diubah dahulu sehingga setiap titik mengindikasikan banyaknya pasangan yang unik dari variabel banyaknya satelit dengan variabel berat. Dalam R dapat kita gunakan baris-baris perintah berikut ini plot.crabs<-aggregate(rep(1,nrow(crabs)), list(Sa=crabs$Sa,Wt=crabs$Wt), sum) plot.crabs$Sa<-as.numeric(as.vector(plot.crabs$Sa)) plot.crabs$Wt<-as.numeric(as.vector(plot.crabs$Wt))

Kemudian dari data yang telah di aggregate kita buat plot dengan cara berikut ini plot(y=plot.crabs$Sa,x=plot.crabs$Wt,xlab="Berat (kg)", ylab="Banyaknya Satelit", bty="L", axes=F, type="n") axis(2, at=1:15) axis(1, at=seq(1,5,0.2)) text(y=plot.crabs$Sa,x=plot.crabs$Wt,labels=plot.crabs$x)

62

Gambar 4.1 Banyak satelit berdasarkan Berat (kg) dari Kepiting Betina Pertama-tama kita ubah variabel banyak satelit menjadi biner dengan cara sebagai berikut > crabs$Sat <-crabs$Sa > 0

atau membuat variabel dengan kode 0 = tidak mempunyai satelit dan 1 = mempunyai satelit dengan cara sebagai berikut > crabs$Sat <-ifelse(crabs$Sa>0,1,0)

Untuk contoh ini model regresi logistik akan digunakan terhadap data yang tidak dikelompokkan. Kemudian kita gunakan model regresi logistik sederhana dengan lebar cangkang kepiting sebagai prediktor. > kepiting.1 <-glm(Sat ~ W, family=binomial(), data=crabs)

63

> summary(kepiting.1) Call: glm(formula = Sat ~ W, family = binomial(), data = crabs)

Deviance Residuals: Min 1Q Median 3Q Max -2.0281 -1.0458 0.5480 0.9066 1.6941

Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) -12.3508 2.6287 -4.698 2.62e-06 *** W 0.4972 0.1017 4.887 1.02e-06 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 225.76 on 172 degrees of freedom Residual deviance: 194.45 on 171 degrees of freedom AIC: 198.45 Number of Fisher Scoring iterations: 4

Model ini dibandingkan dengan model dibawah hipotesis nol (model tanpa prediktor) dengan menggunakan uji Wald atau uji rasio kemungkinan > kepiting.0 <-glm(Sat ~ 1, family=binomial(), data=crabs) > anova(kepiting.0,kepiting.1,test="Chisq") Analysis of Deviance Table

Model 1: Sat ~ 1 Model 2: Sat ~ W

Resid. Df Resid. Dev Df Deviance P(>|Chi|) 1 172 225.76 2 171 194.45 1 31.306 2.204e-08 ***

Signif. Codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

64

Atau tanpa menggunakan model dibawah hipotesis nol sebagai berikut: > anova(kepiting.1,test="Chisq")

Analysis of Deviance Table

Model: binomial, link: logit

Response: Sat

Terms added sequentially (first to last) Df Deviance Resid. Df Resid. Dev P(>|Chi|)

NULL 172 225.76 W 1 31.306 171 194.45 2.204e-08 *** --Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Kemudian dari data tersebut kita buat plot untuk model regresi logistiknya dengan menggunakan cara sebagai berikut > crabs$W.fac<-cut(crabs$W, breaks=c(0,seq(23.25, 29.25),Inf)) > prop<-aggregate(crabs$Sat, by=list(W=crabs$W.fac), mean)$x > plot.x<-aggregate(crabs$W, by=list(W=crabs$W.fac), mean)$x > plot(y=crabs$Sat,x=crabs$W,xlab=expression(paste("Lebar Cangkang, ", italic(x), "(cm)")), ylab=expression(paste("Proporsi Memiliki Satelit,", {pi}, "(x)")), axes=F, type="n") > axis(2, at=seq(0,1,.2)) > axis(1, at=seq(20,34,2)) > lines(y=prop, x=plot.x, pch=16, type="p") > ind<-order(crabs$W) > lines(x=crabs$W[ind],y=predict(kepiting.logit, type="response")[ind], type="l",lty=3)

> par(pty="s")

65

Hasil plot dapat dilihat dari gambar dibawah ini

Gambar 4.2 Plot Model Regresi Logistik Lebar cangkang terhadap Proporsi Memiliki Satelit 4.2 Interpretasi Odds Ratio Salah satu interpretasi penting dalam regresi logistik adalah odds dan odds ratio. Untuk data horseshoe pada contoh diatas, logit[p(x)] =-12.35+ 0.497x . Jadi penaksir odds dari satelit dikalikan dengan exp()= exp(0.497) = 1.64 untuk setiap penambahan lebar cangkang dalam sentimeter yaitu naik sekitar 64%. Sebagai ilustrasi nilai rata-rata lebar cangkang adalah x = 26.3 memiliki nilai p(x) = 0.674, dan nilai odds = 0.674/0.326 = 2.07. Untuk x = 27.3 = 26.3 + 1.0 yaitu penambahan satu sentimeter, kita dapat menghitung bahwa nilai p(x) = 0.773 dan nilai odds = 0.773/0. 227 = 3.40. Kenaikan sebesar 64% adalah 3.40 = 2.07(1.64). 66

4.3 Regresi Logistik dengan Variabel Prediktor Kategori Seperti pada model regresi biasa, prediktor dalam regresi logistik bisa lebih dari satu (multipel). Variabel prediktor tersebut dapat berbentuk data kategori maupun data kuantitatif. Dalam bagian ini akan dijelaskan bagaimana fit model regresi logistik dengan menyertakan variabel kategori (biasa disebut faktor). Dalam menyertakan variabel kategori kedalam model regresi logistik kita harus membuat konstrain bagi parameternya untuk menangani redundance dalam spesifikasi model. Dalam membuat konstrain perlu adanya sebuah kategori yang dijadikan nol nilainya yaitu kategori pertama atau kategori terakhir. Data yang digunakan dalam hal ini adalah contoh pada Modul 2 sub bagian 2.6 mengenai Data mengenai studi prospektif dari ibu yang peminum alkohol dan cacat bawaan bayi. Dengan menggunakan fungsi options dalam penggunaan fungsi glm. Pertama-tama kita inputkan dahulu datanya dengan cara sebagai berikut > alkohol<-factor(c("0","<1","1-2","3-5",">=6"),

+ levels=c("0","<1","1-2","3-5",">=6")) > cacat<-c(48,38,5,1,1) > n<-c(17066,14464,788,126,37)+cacat Kemudian kita akan membuat konstrain untuk variabel alkohol dengan mendefinisikan kategori pertama bernilai nol dengan cara sebagai berikut > options(contrasts=c("contr.treatment", "contr.poly")) > (alkohol.logit<-glm(cacat/n~alkohol,family=binomial, weights=n))

Call: glm(formula = cacat/n ~ alkohol, family = binomial, weights = n)

Coefficients: (Intercept) alkohol<1 alkohol1-2 alkohol3-5 alkohol>=6

-5.87364 -0.06819 0.81358 1.03736 2.26272

Degrees of Freedom: 4 Total (i.e. Null); 0 Residual

Null Deviance: 6.202 Residual Deviance: -2.072e-13 AIC: 28.63

67

Sebaliknya untuk kategori terakhir yang nilainya di set menjadi nol dengan cara sebagai berikut > alkohol.rev<-factor(c("0","<1","1-2","3-5",">=6"), levels=rev(c("0","<1","12"," 3-5",">=6"))) > (alkohol.logit2<-glm(cacat/n~alkohol.rev,family=binomial, weights=n)) Call: glm(formula = cacat/n ~ alkohol.rev, family = binomial, weights = n)

Coefficients: (Intercept) alkohol.rev3-5 alkohol.rev1-2 alkohol.rev<1 alkohol.rev0 -3.611 -1.225 -1.449 -2.331 -2.263 Degrees of Freedom: 4 Total (i.e. Null); 0 Residual Null Deviance: 6.202 Residual Deviance: 1.41e-13 AIC: 28.63

Peluang prediksi untuk setiap kontras akan bernilai sama pada setiap kategorinya. Untuk menghitung peluang prediksi dari model diatas dapat dilihat pada baris-baris perintah berikut ini. > cbind(logit=predict(alkohol.logit), fitted.prop= predict(alkohol.logit, type="response"))

logit fitted.prop 1 -5.873642 0.002804721 2 -5.941832 0.002620328 3 -5.060060 0.006305170 4 -4.836282 0.007874016 5 -3.610918 0.026315789

> cbind(logit=predict(alkohol.logit2), fitted.prop= predict(alkohol.logit2, type="response"))

logit fitted.prop 1 -5.873642 0.002804721 2 -5.941832 0.002620328 3 -5.060060 0.006305170

4 -4.836282 0.007874016 5 -3.610918 0.026315789

68

Terlihat bahwa proporsi sampel terlihat meningkat dengan meningkatnya konsumsi alkohol. Untuk melihat independensi antara konsumsi alkohol wanita hamil dengan cacat bawaan pada bayi dapat ditunjukkan melalui model berikut ini > (alkohol.logit3 <-glm(cacat/n~1, family=binomial, weight=n))

Call: glm(formula = cacat/n ~ 1, family = binomial, weights = n)

Coefficients: (Intercept) -5.856

Degrees of Freedom: 4 Total (i.e. Null); 4 Residual Null Deviance: 6.202 Residual Deviance: 6.202 AIC: 26.83 > # Statistik Rasio Likelihood > summary(alkohol.logit3)$deviance

[1] 6.201998 > # Statistik Uji Pearson chi-kuadrat > (a<-sum(residuals(alkohol.logit3, type="pearson")^2)) [1] 12.08205 > # derajat kebebasan > df<-alkohol.logit3$df.residual > #p-value > 1-pchisq(a, df=df) [1] 0.01675140 4.4 Model Regresi Logistik Multipel Dalam Agresti (2007) Contoh 4.3.2 mengenai 338 veteran perang yang terinfeksi virus AIDS dengan dua prediktor yaitu Ras (hitam, putih) dan penggunaan AZT (ya, tidak), dengan variabel tak bebas adalah terjadi simptom AIDS (ya, tidak). Data dapat dilihat pada tabel berikut ini 69

Tabel 4.1 Perkembangan Simptom AIDS berdasarkan Ras dan Penggunaan AZT

Ras Penggunaan AZT Simptom AIDS Ya Tidak Hitam Ya 14 93 Tidak 32 81 Putih Ya 11 52 Tidak 12 43 Model yang digunakan untuk data ini adalah AZT Ras logit [ P(Y =1)]=Ya +Putih Pertama-tama kita inputkan dahulu datana menggunakan perintah berikut > simptom<expand. grid(AZT=factor(c("Ya","Tidak"),levels=c("Tidak","Ya")),Ras=factor(c("H itam","Putih"),levels=c("Putih","Hitam"))) > simptom<-data.frame(simptom,Yes=c(14,32,11,12), No=c(93,81,52,43)) > simptom

AZT Ras Ya Tidak

1 Ya Hitam 14 93 2 Tidak Hitam 32 81 3 Ya Putih 11 52 4 Tidak Putih 12 43 Kemudian kita fit model regresi logistiknya menggunakan fungsi glm dengan options melalui

perintah berikut ini > options(contrasts=c("contr.treatment","contr.poly")) > summary(fit<-glm(cbind(Ya,Tidak) ~ AZT + Ras , family=binomial, data=simptom) ) Call: glm(formula = cbind(Ya, Tidak) ~ AZT + Ras, family = binomial,

data = simptom)

70

Deviance Residuals: 1234 -0.5547 0.4253 0.7035 -0.6326

Coefficients: Estimate Std. Error z value Pr(>|z|)

(Intercept) -1.07357 0.26294 -4.083 4.45e-05 *** AZTYa -0.71946 0.27898 -2.579 0.00991 ** RasHitam 0.05548 0.28861 0.192 0.84755 --Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 8.3499 on 3 degrees of freedom Residual deviance: 1.3835 on 1 degrees of freedom AIC: 24.86

Number of Fisher Scoring iterations: 4

Kemudian kita dapat menghitung taksiran odds ratio antara penggunaan AZT dan perkembangan AIDS dengan cara > exp(-0.7195)

[1] 0.4869957 Interval kepercayaan menggunakan statistik Wald diperoleh menggunakan approximate standard error. Penaksran interval menggunakan statistik rasio kemungkinan dapat diperoleh menggunakan fungsi confint dalam Paket MASS. > confint(fit)

Waiting for profiling to be done...

2.5% 97.5% (Intercept) -1.6088054 -0.5734959 AZTYa -1.2773237 -0.1798769 RasHitam -0.5022982 0.6334104 71

Model fit diatas variabel Ras tidak signifikan. Kita akan membuat model memodifikasi yaitu dengan tidak menyertakan variabel Ras pada model sebelumnya kemudian kita uji kedua model dengan menggunakan perbedaan devians dengan cara sebagai berikut > fit2<-glm(cbind(Ya,Tidak) ~ AZT , family=binomial, data=simptom) > anova(fit2, fit, test="Chisq") Analysis of Deviance Table

Model 1: cbind(Ya, Tidak) ~ AZT Model 2: cbind(Ya, Tidak) ~ AZT + Ras

Resid. Df Resid. Dev Df Deviance P(>|Chi|) 1 2 1.4206 2 1 1.3835 1 0.037084 0.8473

Dari tabel anova diatas terlihat bahwa perbedaan devians tidak signifikan yang artinya model yang terbaik adalah model tanpa variabel Ras. Kemudian kita hitung nilai peluang prediksi dan standard errornya sehingga diperoleh dengan cara sebagai berikut > res<-predict(fit, type="response", se=T) > pointwise.normal<-function(results.predict, coverage = 0.99)

+{ + fit <-results.predict$fit + limits <-qnorm(1. -(1. -coverage)/2.) * results.predict$se.fit + list(upper = fit + limits, fit = fit, lower = fit -limits) +} > (AIDS.bars<-pointwise.normal(res, coverage=.95)) $upper 1234 0.2095717 0.3412561 0.2108849 0.3525588

$fit 1234 0.1496245 0.2653998 0.1427012 0.2547241

72

$lower

1234 0.08967738 0.18954345 0.07451749 0.15688935

Statistik Chi-Kuadrat dan statistik Pearson untuk kecocokan model diperoleh dengan cara sebagai berikut > fit$deviance

[1] 1.38353 > sum(residuals(fit,type="pearson")^2) [1] 1.391026 Soal Latihan: Sebuah eksperimen dilakukan oleh Strand (1930) untuk melihat respon dari kumbang lantai, dengan nama latin Tribolium Confusum, terhadap gas karbon disulfur (CS2). Dalam eksperimen tersebut sekitar 30 kumbang dalam suatu batch diberikan CS2 dengan konsentrasi yang berbeda, kemudian diukur berapa banyak kumbang yang mati. Setelah 5 jam diukur kembali berapa banyak kumbang yang mati. Tabel 4.2 Banyak kumbang yang mati berdasarkan konsentrasi CS2 Konsentrasi CS2 (mg/l) Replikasi 1 Replikasi 2 ynyn 49.06 2 29 4 30 52.99 7 30 6 30 56.91 9 28 9 34 60.84 14 27 14 29 64.76 23 30 29 33 68.69 29 31 24 28 72.61 29 30 32 32 76.54 29 29 31 31 Berdasarkan data tersebut

1. Buat plot antara logit proporsi kumbang yang mati terhadap konsentrasi CS2 dengan garis 73

linier dan garis regresi logistik 2. Buat analisis regresi logistik untuk data tersebut 3. Hitung peluang prediksi bagi data tersebut 4. Buat plot antara konsentrasi CS2 dengan peluang prediksinya 5. Buat analisis regresi logistik kuadratik untuk data tersebut logit (p( x))=0+1 xi+2 xi 2 74

MODUL 5 MODEL LOG LINIER

5.1 Pendahulaun Model log linier digunakan pada tabel kontingensi untuk melihat hubungan antara dua atau lebih variabel kategori. Semua variable dalam tabel kontingensi dianggap sebagai respon, dengan kata lain tidak ada pemisahan variabel bebas (independent) dan variebel tak bebas (dependent). Bila terjadi pemisahan variabel bebas dan variabel tak bebas maka digunakan regresi logistik. Pada modul sebelumnya telah dibahas mengenai model regresi logistik yang modelnya mendefinisikan variabel prediktor dan variabel respon. Dalam modul ini akan dibahas apabila semua variabel adalah respon dan kita ingin melihat hubungan antar respon tersebut untuk masing-masing kategorinya maka digunakan model log linier. Dalam model log linier ada beberapa model yang dapat digunakan. Model awal yang biasa digunakan adalah: 1. Saturated model. Yaitu model yang melibatkan seluruh kemungkinan efek dari setiap variabel berikut interaksinya. Untuk tabel kontingensi dua arah model saturated adalah sebgai berikut log ij = . + .iX + .jY + .ij XY (5.1) 2. Independence model. Yaitu model tanpa melibatkan interaksi untuk tabel kontingensi dua arah model independen adalah sebgai berikut log ij = . + .iX + .jY (5.2) Dari model tersebut dapat dibuat turunan-turunan model lainnya. Teknik pemilihan model log-linier 1. Dimulai dari model saturated. Apabila model tidak diterima, eliminasi interaksi pada order tertinggi, demikian seterusnya hingga didapat model yang fit. 2. Dimulai dari model independent. Apabila model diterima, tambahkan interaksi pada order yang paling rendah, demikian seterusnya hingga didapat model yang fit.

Untuk analisis model log-linier dapat menggunakan software R. 75

5.2 Log Linier Dalam R Dalam software R model log linier dapat dilakukan melalui tiga cara yaitu 1. Menggunakan fungsi glm. 2. Menggunakan fungsi loglin. 3. Menggunakan fngsi loglm dalam paket MASS. Secara umum fungsi glm dapat digunakan untuk semua kasus. Penggunaan fungsi glm untuk model log linier sama dengan penggunaan sama dengan fungsi glm untuk model regresi logistik. Perbedaannya adalah untuk model log linier opsi family yang digunakan adalah poisson. 5.2.1 Model Independen Model independen aalah model paling sederhana dimana dalam model hanya di definiskan efek dari masing-masing variabel secara independen, tidak ada interaksi dalam model ini. Sebagai contoh, dalam survei sosial umum tahun 2000, subyek ditanya mengenai kepercayaannya tentang kehidupan setelah kematian dari berbagai ras. Data yang diperoleh terlihat pada tabel berikut Tabel 5.1 Kehidupan Setelah Kematian Ras Kepercayaan Total Ya Tidak Putih 1339 300 1639 Hitam 260 55 315 Lainnya 88 22 110 Total 1687 377 2064 Pertama-tama kita Input data terlebih dahlu, kemudian analisis data menggunakan fungsi glm dengan family poisson untuk model independen dengan cara sebagai berikut > afterlife2<-data.frame(expand.grid(ras=factor(c("Putih","Hitam","Lainnya"),

+ levels=rev(c("Putih","Hitam","Lainnya"))), + percaya=factor(c("Ya","Tidak"),levels=c("Tidak","Ya"))), + count=c(1339,260,88,300,55,22)) > afterlife2 76

ras percaya count

1 Putih Ya 1339 2 Hitam Ya 260 3 Lainnya Ya 88 4 Putih Tidak 300 5 Hitam Tidak 55 6 Lainnya Tidak 22 > options(contrasts=c("contr.treatment","contr.poly")) > (fit.glm<-glm(count~.,family=poisson, data=afterlife2)) Call: glm(formula = count ~ ., family = poisson, data = afterlife2)

Coefficients: (Intercept) rasHitam rasPutih percayaYa

3.000 1.052 2.701 1.498 Degrees of Freedom: 5 Total (i.e. Null); 2 Residual Null Deviance: 2849 Residual Deviance: 0.3565 AIC: 49.44

Dari hasil diatas terlihat bahwa model cukup fit. Untuk kontras yang digunakan, yaitu menetapkan kategori terakhir bernilai 0, .Ya Y = 1.498 dan .Tidak Y = 0. Dengan demikian penaksir odds dari variabel percaya adalah exp(1.498) = 4.473 untuk setiap ras. 5.2.2 Model Saturated Model saturated adalah model log linier yang paling umum dalam arti bahwa seluruh kemungkinan efek dari setiap kategori termasuk interaksi masuk ke dalam model. Untuk tabel kontingensi dua arah seperti pada Persamaan 5.1 tentunya hanya ada satu interaksi yaitu .XY yang berarti efek dari sebuah variabel bergantung pada taraf variabel lain. Sehingga nilai parameter interaksi menyatakan asosiasi antara variabel X dengan variabel Y. Dengan demikian apabila .XY = 0 akan menjadi model independen yang berarti varabel X independen dengan variabel Y. Untuk contoh data pada Tabe 5.1 dapat dianalisis menggunakan baris perintah sebagai berikut

> (fit.glm2<-glm(count~ras*percaya,family=poisson, data=afterlife2))

77

Call: glm(formula = count ~ ras * percaya, family = poisson, data = afterlife2)

Coefficients: (Intercept) rasHitam rasPutih percayaYa 3.0910 0.9163 2.6127 1.3863 rasHitam:percayaYa rasPutih:percayaYa 0.1671 0.1096

Degrees of Freedom: 5 Total (i.e. Null); 0 Residual Null Deviance: 2849 Residual Deviance: 6.795e-14 AIC: 53.08

Hasil diatas memperlihatkan bahwa penaksir odds ratio antara percaya dan ras adalah exp(0.1096) = 1.12 untuk kategori Putih dan exp(0.1671) = 1.18 untuk kategori Hitam dan exp(0.1096 - 0.1671) = 0.94 untuk kategori Putih dan Hitam. Artinya penaksir odds dari Percaya untuk kategori ras Putih 0.94 kali odds untuk kategori ras Hitam. Secara umum model tersebut cukup fit dengan penaksir odds ratio relatif mendekati 1. 5.3 Model Log Linier untuk Tabel Tiga Arah Pada contoh sebelumnya diperlihatkan analisis model log linier untuk tabel kontingensi dua arah. Secara umum kita dapat memperluas model log linier untuk tabel kontingensi tiga arah. Seperti pada tabel kontingensi tiga arah, dalam model log linier juga dapat didefinisikan asosiasi bersyarat dan asosiasi marjinal dari variabel satu dengan variabel lainnya. Beberapa model yang dapat dibentuk untuk klasifikasi tiga arah adalah sebagai berikut Mutually Independent Model (X, Y, Z) . log ijk = . + .iX + .jY + .kZ XY +.jk YZ Conditional assosiation model (XY, YZ) . log ijk = . + .iX + .jY + .kZ +.ij Homogenous assosiation model (XY, XZ, YZ) . log ijk = . + .iX + .jY + .jZ +.ij XY +.ik

XZ +.jk YZ XY +.ik XYZ Saturated Model (XYZ) . log ijk = . + .iX + .jY + .jZ +.ij XZ +.jk YZ+.ijk 78

Contoh: Penggunaan Alkohol, Rokok, dan Mariyuana Data berikut, diambil dari Agresti (2007) bagian 7.1.6, hal 209, adalah hasil survei yang dilakukan oleh Wright State University School of Medicine dan United Health Services di Dayton, Ohio. Dalam survei tersebut siswa ditanya pada akhir tahun ajaran mengenai apakah mereka pernah mengkonsumsi alkohol, rokok dan mariyuana. Data disajikan dalam tabel berikut ini Tabel 5.2 Konsumsi Alkohol, Rokok dan Mariyuana Alkohol Rokok Mariyuana Total Ya Tidak Ya Ya 911 538 1449 Tidak 44 456 500 Tidak Ya 3 43 46 Tidak 2 279 281 Total 960 1316 2276 Dari Tabel 5.2 didefinisikan variabel A adalah penggunaan Alkohol, variabel R adalah penggunaan Rokok dan variabel M untuk penggunaan Mariyuana masing-masing memiliki dua kategori. Analisis untuk data tersebut untuk semua model yang mungkin adalah sebagai berikut ## Input Data

> pengguna<-data.frame(expand.grid(

+ mariyuana=factor(c("Ya","Tidak"),levels=c("Ya","Tidak")), + rokok=factor(c("Ya","Tidak"),levels=c("Ya","Tidak")), + alkohol=factor(c("Ya","Tidak"),levels=c("Ya","Tidak"))), + count=c(911,538,44,456,3,43,2,279)) ## Fit Model

> library(MASS)

# Model (ARM) (saturated) > fitARM<-loglm(count~alkohol*rokok*mariyuana,data=pengguna,param=T,fit=T)

# Model (AR,AM,RM) (homogenous assosiation)

> fitAR.AM.RM<-update(fitARM, .~. -alkohol:rokok:mariyuana)

# Model (AM,RM) (conditional assosiation)

> fitAM.RM<-update(fitAR.AM.RM, .~. -alkohol:rokok)

# Model (AR,M) (conditional assosiation)

79

> fitAR.M<-update(fitAR.AM.RM, .~. -alkohol:mariyuana -rokok:mariyuana)

# Model (A,R,M) (mutually independent)

> fitA.R.M<-update(fitAR.M, .~. -alkohol:rokok)

> data.frame(alkohol=pengguna$alkohol,rokok=pengguna$rokok,

+ mariyuana=pengguna$mariyuana, A.R.M=c(aperm(fitted(fitA.R.M))), + AR.M=c(aperm(fitted(fitAR.M))), AM.RM=c(aperm(fitted(fitAM.RM))), + AR.AM.RM=c(aperm(fitted(fitAR.AM.RM))), ARM=c(aperm(fitted(fitARM)))) alkohol rokok mariyuana A.R.M AR.M AM.RM AR.AM.RM ARM

1 Ya Ya Ya 539.98258 611.17750 909.2395833 910.383081 911 2 Ya Ya Tidak 740.22612 837.82250 438.8404255 538.616118 538 3 Ya Tidak Ya 282.09123 210.89631 45.7604167 44.616840 44 4 Ya Tidak Tidak 386.70007 289.10369 555.1595745 455.385598 456 5 Tidak Ya Ya 90.59739 19.40246 4.7604167 3.616919 3 6 Tidak Ya Tidak 124.19392 26.59754 142.1595745 42.383882 43 7 Tidak Tidak Ya 47.32880 118.52373 0.2395833 1.383160 2 8 Tidak Tidak Tidak 64.87990 162.47627 179.8404255 279.614402 279 Selanjutnya dari hasil output diatas dapat ditentukan pola asosiasi untuk model-model tersebut dengan menampilkan penaksir odds ratio bersyarat dan marjinal. Untuk menentukan odds ratio bersyarat dapat langsung ditentukan melalui fungsi yang kita buat sendiri dengan cara sebagai berikut ## Menghitung odds ratio # membuat array untuk odds ratio bersyarat

> array.A.R.M<-fitted(fitA.R.M) > array.AR.M<-fitted(fitAR.M) > array.AM.RM<-fitted(fitAM.RM) > array.AR.AM.RM<-fitted(fitAR.AM.RM)

> array.ARM<-fitted(fitARM)

# fungsi odds ratio

> odds.rasio<-function(x) x[1,1]*x[2,2]/(x[1,2]*x[2,1])

# array untuk odds ratio marjinal

> sum.array<-function(array, perm=c(3,2,1)){

80

+ res<-aperm(array,perm) + colSums(res) +} # menghitung odds ratio bersyarat dan marjinal

> nilai.odd<-data.frame(AR.Bersyarat=c(apply(array.A.R.M,3,odds.rasio)[1],

+ apply(array.AR.M,3,odds.rasio)[1],apply(array.AM.RM,3,odds.rasio)[1], + apply(array.AR.AM.RM,3,odds.rasio)[1],apply(array.ARM,3,odds.rasio)), + AM.Bersyarat=c(apply(array.A.R.M,2,odds.rasio)[1], + apply(array.AR.M,2,odds.rasio[1], apply(array.AM.RM,2,odds.rasio)[1], + apply(array.AR.AM.RM,2,odds.rasio)[1],apply(array.ARM,2,odds.rasio)), + RM.Bersyarat=c(apply(array.A.R.M,1,odds.rasio)[1], + apply(array.AR.M,1,odds.rasio)[1], apply(array.AM.RM,1,odds.rasio)[1], + apply(array.AR.AM.RM,1,odds.rasio)[1], apply(array.ARM,1,odds.rasio)), + AR.Marjinal=c(odds.rasio(sum.array(array.A.R.M)), + odds.rasio(sum.array(array.AR.M)), odds.rasio(sum.array(array.AM.RM)), + odds.rasio(sum.array(array.AR.AM.RM)), + odds.rasio(sum.array(array.ARM)),odds.rasio(sum.array(array.ARM))), + AM.Marjinal=c(odds.rasio(sum.array(array.A.R.M,perm=c(2,1,3))), + odds.rasio(sum.array(array.AR.M,perm=c(2,1,3))), + odds.rasio(sum.array(array.AM.RM,perm=c(2,1,3))), + odds.rasio(sum.array(array.AR.AM.RM,perm=c(2,1,3))), + odds.rasio(sum.array(array.ARM,perm=c(2,1,3))), + odds.rasio(sum.array(array.ARM,perm=c(2,1,3)))), + RM.Marjinal=c(odds.rasio(sum.array(array.A.R.M,perm=c(1,2,3))), + odds.rasio(sum.array(array.AR.M,perm=c(1,2,3))), + odds.rasio(sum.array(array.AM.RM,perm=c(1,2,3))), + odds.rasio(sum.array(array.AR.AM.RM,perm=c(1,2,3))), + odds.rasio(sum.array(array.ARM,perm=c(1,2,3))), odds.rasio(sum.array(array.ARM,perm=c(1,2,3)))))

#menampilkan odds ratio bersyarat dan marjinal

> rownames(nilai.odd)<-c("(A,R,M)","(AR,M)","(AM,RM)","(AR,AM,RM)",

+ "(ARM) level 1","(ARM) level 2") > round(nilai.odd,3)

81

AR.Bersyarat AM.Bersyarat RM.Bersyarat AR.Marjinal AM.Marjinal

(A,R,M) 1.000 1.000 1.000 1.000 1.000 (AR,M) 17.703 1.000 1.000 17.703 1.000 (AM,RM) 1.000 61.873 25.136 2.750 61.873 (AR,AM,RM) 7.803 19.806 17.251 17.702 61.872 (ARM) level 1 13.803 24.271 17.549 17.703 61.873 (ARM) level 2 7.655 13.461 9.733 17.703 61.873 RM.Marjinal (A,R,M) 1.000 (AR,M) 1.000 (AM,RM) 25.136 (AR,AM,RM) 25.136 (ARM) level 1 25.136 (ARM) level 2 25.136 Berdasarkan hasil output ini kita dapat menginterpretasi setiap model berdasarkan masing-masing nilai odds ratio bersyarat dan marjinalnya. 5.3 Inferensi Model Log Linier Pada sub bab ini akan dibahas mengenai uji goodness of fit, sifat-sifat inferensi, dan memperluas model log linier ke dimensi yang lebih tinggi. Untuk pengujian kecocokan model (goodness of fit) dapat digunakan statistik rasio kemungkinan (deviance) atau statistik chi kuadrat Pearson. Untuk setiap model yang mungkin kita dapat menghitung kedua statistik tersebut berikut derajat kebebasan dan p-valuenya. Baris-baris perintah berikut dapat digunakan untuk menentukan kedua statistik tersebut ## Fit Semua Model yang mungkin

library(MASS) fitARM<-loglm(count~alkohol*rokok*mariyuana,data=pengguna,param=T,fit=T) fitAR.AM.RM<-update(fitARM, .~. -alkohol:rokok:mariyuana) fitAR.AM<-update(fitAR.AM.RM, .~. -rokok:mariyuana) fitAR.RM<-update(fitAR.AM.RM, .~. -alkohol:mariyuana) fitAM.RM<-update(fitAR.AM.RM, .~. -alkohol:rokok)

82

fitAR.M<-update(fitAR.AM.RM, .~. -alkohol:mariyuana -rokok:mariyuana) fitAM.R<-update(fitAR.AM.RM, .~. -alkohol:rokok -rokok:mariyuana) fitRM.A<-update(fitAR.AM.RM, .~. -alkohol:mariyuana -alkohol:rokok) fitA.R.M<-update(fitAR.M, .~. -alkohol:rokok)

# Menampilkan statistik rasio kemungkinan (G^2) dan pearson chi-kuadrat (X^2) # dan p-value kedua statistik

> gof<-data.frame(A.R.M=c(summary(fitA.R.M)$test),

+ A.RM=c(summary(fitRM.A)$test),R.AM=c(summary(fitAM.R)$test), + M.AR=c(summary(fitAR.M)$test), AR.AM=c(summary(fitAR.AM)$test), + AR.RM=c(summary(fitAR.RM)$test),AM.RM=c(summary(fitAM.RM)$test), + AR.AM.RM=c(summary(fitAR.AM.RM)$test), + ARM=c(summary(fitARM)$test)) > gof<-gof[-3,] > rownames(gof)<-c("G^2","X^2","df", "p-value G^2", "p-value X^2") > round(t(gof),2) G^2 X^2 df p-value G^2 p-value X^2

A.R.M 1286.02 1411.39 4 0.00 0.00 A.RM 534.21 505.60 3 0.00 0.00 R.AM 939.56 824.16 3 0.00 0.00 M.AR 843.83 704.91 3 0.00 0.00 AR.AM 497.37 443.76 2 0.00 0.00 AR.RM 92.02 80.81 2 0.00 0.00 AM.RM 187.75 177.61 2 0.00 0.00 AR.AM.RM 0.37 0.40 1 0.54 0.53 ARM 0.00 0.00 0 1.00 1.00 Dari seluruh model yang mungkin hanya model (AR,AM,RM) yang tidak signifikan. Selanjutnya dari model (AR,AM,RM) kita akan melihat nilai taksiran dari setiap variabel dengan menggunakan fungsi glm dengan cara sebagai berikut > options(contrasts=c("contr.treatment","contr.poly")) > summary(fit.glm<-glm(count~.^2, data=pengguna, family=poisson))

83

Call: glm(formula = count ~ .^2, family = poisson, data = pengguna)

Deviance Residuals: 12345678 0.02044 -0.02658 -0.09256 0.02890 -0.33428 0.09452 0.49134 -0.03690 Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) 6.81387 0.03313 205.699 < 2e-16 *** mariyuanaTidak -0.52486 0.05428 -9.669 < 2e-16 *** rokokTidak -3.01575 0.15162 -19.891 < 2e-16 *** alkoholTidak -5.52827 0.45221 -12.225 < 2e-16 *** mariyuanaTidak:rokokTidak 2.84789 0.16384 17.382 < 2e-16 *** mariyuanaTidak:alkoholTidak 2.98601 0.46468 6.426 1.31e-10 *** rokokTidak:alkoholTidak 2.05453 0.17406 11.803 < 2e-16 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for poisson family taken to be 1)

Null deviance: 2851.46098 on 7 degrees of freedom Residual deviance: 0.37399 on 1 degrees of freedom AIC: 63.417

Number of Fisher Scoring iterations: 4

Hasil output diatas merupakan model untuk setiap variabel memberikan kode 0 untuk kategori Ya dan 1 untuk kategori Tidak . Apabila kita menginginkan model menentukan kategori Ya bernilai 1 untuk setiap variabel kita tidak perlu mengubah dari data pengguna tetapi dengan cara mengubah kontras menggunakan baris perintah berikut ini

> fit.glm2 <-update(fit.glm, contrasts = list(alkohol = as.matrix(c(1, 0)),

+ mariyuana =as.matrix(c(1, 0)), rokok = as.matrix(c(1, 0)))) > summary(fit.glm2) 84

Call: glm(formula = count ~ .^2, family = poisson, data = pengguna, contrasts = list(alkohol = as.matrix(c(1, 0)), mariyuana = as.matrix(c(1, 0)), rokok = as.matrix(c(1, 0))))

Deviance Residuals: 12345678 0.02044 -0.02658 -0.09256 0.02890 -0.33428 0.09452 0.49134 -0.03690

Coefficients:

Estimate Std. Error z value Pr(>|z|) (Intercept) 5.63342 0.05970 94.361 < 2e-16 *** mariyuana1 -5.30904 0.47520 -11.172 < 2e-16 *** rokok1 -1.88667 0.16270 -11.596 < 2e-16 *** alkohol1 0.48772 0.07577 6.437 1.22e-10 *** mariyuana1:rokok1 2.84789 0.16384 17.382 < 2e-16 *** mariyuana1:alkohol1 2.98601 0.46468 6.426 1.31e-10 *** rokok1:alkohol1 2.05453 0.17406 11.803 < 2e-16 ***

Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

(Dispersion parameter for poisson family taken to be 1)

Null deviance: 2851.46098 on 7 degrees of freedom Residual deviance: 0.37399 on 1 degrees of freedom AIC: 63.417

Number of Fisher Scoring iterations: 4

Untuk fungsi glm tidak menyediakan statistik Chi kuadrat Peason sehingga kita harus menghitung dengan cara manual seperti berikut ini

# Statistik Pearson chi kuadrat

> sum(resid(fit.glm, type="pearson")^2)

[1] 0.4011005 85

Langkah selanjutnya adalah menghitung nilai residual untuk model terpilih yaitu (AR,AM,RM). Model tersebut mempunyai nilai G2 dan X2 yang kecil sehingga residual dari model ini mengindikasikan model good fit. Karena nilai df=1 maka nilai statistik X2 sama dengan kuadrat setiap residual. # Residual untuk model (AR, AM, RM)

> fit.glm$fitted.values-pengguna$count 123456 -0.6168303 0.6168303 0.6168303 -0.6168303 0.6168303 -0.6168303 -0.6168303 8 0.6168303

Untuk menguji asosiasi bersyarat dari model, kita dapat membandingkan model dengan model yang lebih sederhana yang tidak mengandung asosiasi yang akan diuji. Sebagai contoh apabila kita akan menguji asosiasi AR dalam model (AR,AM,RM) maka kita bandingkan model tersebut dengan model yang lebih sederhana yang tida mengandung AR yaitu model (AM,RM) yang merupakan model conditional independence dari AR. Hal yang sama juga dapat diterapkan untuk asosiasi AM dan RM. Dalam R kita dapat menggunakan fungsi anova untuk ini yang mana dalam fungsi tersebut statistik yang digunakan adalah selisih statistik rasio kemungkinan (G2). Untuk menguji asosiasi AR, AM dan RM dalam model (AR,AM,RM) dapat menggunakan baris perintah berikut > anova(fitAR.AM.RM, fitAR.AM) > anova(fitAR.AM.RM, fitAR.RM) > anova(fitAR.AM.RM, fitAM.RM) LR tests for hierarchical log-linear models

Model 1:

count ~ rokok + alkohol + mariyuana Model 2:

count ~ rokok + alkohol + mariyuana

86

Deviance df Delta(Dev) Delta(df) P(> Delta(Dev) Model 1 497.3692752 2 Model 2 0.3739859 1 496.9952893 1 0.00000 Saturated 0.0000000 0 0.3739859 1 0.54084 LR tests for hierarchical log-linear models

Model 1:

count ~ rokok + alkohol + mariyuana Model 2:

count ~ rokok + alkohol + mariyuana

Deviance df Delta(Dev) Delta(df) P(> Delta(Dev) Model 1 92.0183606 2 Model 2 0.3739859 1 91.6443747 1 0.00000 Saturated 0.0000000 0 0.3739859 1 0.54084 LR tests for hierarchical log-linear models

Model 1:

count ~ rokok + alkohol + mariyuana Model 2:

count ~ rokok + alkohol + mariyuana

Deviance df Delta(Dev) Delta(df) P(> Delta(Dev) Model 1 187.7543029 2 Model 2 0.3739859 1 187.3803170 1 0.00000 Saturated 0.0000000 0 0.3739859 1 0.54084

Dari hasil output ternyata semua asosiasi mempunyai p-value sangat kecil yang berarti signifikan. Hal ini berarti bahwa bukti kuat adanya asosiasi bersyarat untuk AR, AM dan RM sehingga model yang terbaik untuk digunakan adalah model (AR,AM,RM) . 5.4 Model Log Linier untuk Dimensi Lebih Tinggi Dalam model log linier semakin banyak variabel yang terlibat maka model akan semakin kompleks. Pada sub bab sebelumnya dibahas model untuk tabel dua arah yang lebih sederhana 87

dari model untuk tabel tiga arah. Model log linier untuk tabel empat arah tentunya dengan empat variabel W, X, Y dan Z dapat dianalisis menggunakan cara yang sama dengan tabel tiga arah tetapi model yang mungkin untuk tabel empat arah akan semakin banyak diantaranya Mutually Independent Model (W, X, Y, Z) Conditional assosiation model (WXY,WXZ,WYZ), (WXY,WZ,XZ), (WXZ, WY,XY), (WX,WY,WZ,XY, XZ) Homogenous assosiation model (WXY,WXZ,WYZ,XYZ), (WX,WY,WZ,XY, XZ, YZ) Saturated Model (WXYZ) 5.5 Menggunakan Model Logistik untuk Interpretasi Model Log Linier Model loglinear untuk tabel kontingensi membahas mengenai asosisasi antara variabelvariabel respon kategori. Sementara model regresi logistik memperlihatkan bagaimana varibel respon kategori yang bergantung pada set variabel penjelas. Ternyata ada kaitan antara model logistik dengan model loglinier yang didasarkan atas model yang digunakan, sehingga untuk model loglinier kita dapat membentuk logit dari sebuah respon untuk menginterpretasi model. Lebih jauh, model logistik dengan variabel penjelas kategori mempunyai ekivalensi dengan model loglinier. Untuk memahami implikasi dari model loglinier dapat dibentuk logit untuk sebuah variabel. Misalkan kita memiliki model homogeneous association untuk tabel tiga arah sebagai berikut XY +.ik YZ log ijk = . + .iX + .jY + .jZ +.ij XZ +.jk Dalam hal ini kita perlakukan Y sebagai variabel respon, tentunya harus biner, sedangkan X dan Z sebagai variabel penjelas. 88

Contoh Data diambil dari Agresti (2007) sub bab 7.2.6 mengenai Kecelakaan mobil dan penggunaan sabuk pengaman pada mobil di negara bagian Maine dari 68694 penumpang mobil dan truk. Tabel 5.3 memperlihatkan penumpang berdasarkan Gender (G), Lokasi kejadian (L), penggunaan sabuk keselamatan (S), and mengalami celaka (I). Tabel 5.3 Data Kecelakaan berdasarkan Lokasi, Jenis Kelamin dan Sabuk Keselamatan Jenis Kelamin Lokasi Sabuk Kecelakaan Tidak Ya Kota Tidak 7287 996 Perempuan Ya 11587 759 Desa Tidak 3246 973 Ya 6134 757 Kota Tidak 10381 812 Laki-laki Ya 10969 380 Desa Tidak 6123 1084 Ya 6693 513 Data tersebut dapat diinput dengan cara sebagai berikut > kecelakaan<-data.frame(expand.grid(sabuk=c("Tidak","Ya"),

+ lokasi=c("Kota","Desa"), + gender=c("Perempuan","Laki-laki"), celaka=c("Tidak","Ya")), + count=c(7287,11587,3246,6134,10381,10969,6123, 6693,996, 759, 973, 757, 812, + 380,1084, 513)) > kecelakaan sabuk lokasi gender celaka count 1 Tidak Kota Perempuan Tidak 7287 2 Ya Kota Perempuan Tidak 11587

3 Tidak Desa Perempuan Tidak 3246 4 Ya Desa Perempuan Tidak 6134 5 Tidak Kota Laki-laki Tidak 10381 6 Ya Kota Laki-laki Tidak 10969 7 Tidak Desa Laki-laki Tidak 6123 89

8 Ya Desa Laki-laki Tidak 6693 9 Tidak Kota Perempuan Ya 996 10 Ya Kota Perempuan Ya 759 11 Tidak Desa Perempuan Ya 973 12 Ya Desa Perempuan Ya 757 13 Tidak Kota Laki-laki Ya 812 14 Ya Kota Laki-laki Ya 380 15 Tidak Desa Laki-laki Ya 1084 16 Ya Desa Laki-laki Ya 513

Kemudian kita akan analisis data tersebut menggunakan model log linier dengan dimulai dari model independen dengan cara sebagai berikut > library(MASS)

# mutual independence

> fitG.I.L.S<-loglm(count~., data=kecelakaan, fit=T, param=T)

# semua asosiasi berpasangan dua arah

> fitGI.GL.GS.IL.IS.LS<-update(fitG.I.L.S, .~.^2, data=kecelakaan, fit=T, param=T)

# semua asosiasi tiga arah

> fitGIL.GIS.GLS.ILS<-update(fitG.I.L.S, .~.^3, data=kecelakaan, fit=T, param=T) > anova(fitG.I.L.S, fitGI.GL.GS.IL.IS.LS, fitGIL.GIS.GLS.ILS) LR tests for hierarchical log-linear models Model 1:

count ~ lokasi + sabuk + gender Model 2:

count ~ lokasi + sabuk + gender Model 3:

count ~ lokasi + sabuk + gender

Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)

Model 1 2792.771103 11 Model 2 23.350991 5 2769.420111 6 0.00000 Model 3 1.325317 1 22.025675 4 0.00020 Saturated 0.000000 0 1.325317 1 0.24964 90

Berdasarkan hasil model (G, I, L, S) menyatakan mutual independence dari keempat variabel. Dengan devians 2792,78 model ini sangat tidak fit. Model (GI, GL, GS, IL, IS, LS) lebih baik dari model sebelumnya dengan devians 23,35 tetapi tetap signifikan. Model (GIL, GIS, GLS, ILS) cukup fit dibanding kedua model sebelumnya tetapi cukup sulit untuk diinterpretasikan. Sehingga perlu dibentuk model yang lebih rumit dari (GI, GL, GS, IL, IS, LS) tetapi lebih sederhana dari (GIL, GIS, GLS, ILS). Untuk itu kita modifikasi model (GI, GL, GS, IL, IS, LS) menjadi model (GI, IL, IS, GLS) dengan menambahkan interaksi tiga arah gender, lokasi dan sabuk. Model ini lebih sederhana dari model (GIL, GIS, GLS, ILS) . Untuk membuat model ini kita tinggal update model (GI, GL, GS, IL, IS, LS) dengan menambahkan gender:lokasi:sabuk dengan cara sebagai berikut > (fitGI.IL.IS.GLS <-update(fitGI.GL.GS.IL.IS.LS, .~. + gender:lokasi:sabuk)) Call: loglm(formula = count ~ sabuk + lokasi + gender + celaka + sabuk:lokasi +

sabuk:gender + sabuk:celaka + lokasi:gender + lokasi:celaka + gender:celaka + sabuk:lokasi:gender, data = kecelakaan, fit = T, param = T)

Statistics:

X^2 df P(> X^2) Likelihood Ratio 7.464480 4 0.1132858 Pearson 7.487383 4 0.1122669 > fitted(fitGI.IL.IS.GLS) , , gender = Perempuan, celaka = Tidak

lokasi

sabuk Kota Desa Tidak 7273.214 3254.662 Ya 11632.622 6093.502

, , gender = Laki-laki, celaka = Tidak

lokasi

sabuk Kota Desa Tidak 10358.93 6150.193 Ya 10959.23 6697.643

91

, , gender = Perempuan, celaka = Ya lokasi

sabuk Kota Desa Tidak 1009.7857 964.3376 Ya 713.3783 797.4979

, , gender = Laki-laki, celaka = Ya lokasi

sabuk Kota Desa Tidak 834.0684 1056.8071 Ya 389.7681 508.3566

Model ini sudah fit sehingga kita dapat menginterpretasikan dengan mudah. Kemudian untuk menghitung odds ratio dari setiap variabelnya adalah sebagai berikut > odds.ratio<-function(x) x[1,1]*x[2,2]/(x[2,1]*x[1,2]) > apply(fit.array,c(1,4),odds.ratio) celaka

sabuk Tidak Ya Tidak 1.326766 1.326766 Ya 1.166682 1.166682

> apply(fit.array,c(2,4),odds.ratio) celaka

lokasi Tidak Ya Kota 0.6614758 0.6614758 Desa 0.5816641 0.5816641

> apply(fit.array,c(3,4),odds.ratio) celaka

gender Tidak Ya Perempuan 1.170603 1.170603 Laki-laki 1.029362 1.029362

> apply(fit.array,c(1,2),odds.ratio) lokasi sabuk Kota Desa

92

Tidak 0.579941 0.579941

Ya 0.579941 0.579941

> apply(fit.array,c(1,3),odds.ratio) gender

sabuk Perempuan Laki-laki Tidak 2.134127 2.134127 Ya 2.134127 2.134127

> apply(fit.array,c(2,3),odds.ratio) gender

lokasi Perempuan Laki-laki Kota 0.4417123 0.4417123 Desa 0.4417123 0.4417123

> Fitted.values <-c(fit.array) > sum(abs(kecelakaan$count -Fitted.values))/(2 * sum(kecelakaan$count))

[1] 0.002507358 Dari hasil tersebut kita buat model loglinier dan model logistik menggunakan fungsi glm > options(contrasts = c("contr.treatment", "contr.poly")) > fit.loglinear <-glm(count ~ .^2 + gender:lokasi:sabuk, data = kecelakaan,

family =poisson) > fit.loglinear$coefficients (Intercept) sabukYa 8.8919536 0.4696151 lokasiDesa genderLaki-laki

-0.8041099 0.3536508 celakaYa sabukYa:lokasiDesa -1.9744599 0.1575195 sabukYa:genderLaki-laki sabukYa:celakaYa -0.4132820 -0.8170974 lokasiDesa:genderLaki-laki lokasiDesa:celakaYa 0.2827442 0.7580583 genderLaki-laki:celakaYa sabukYa:lokasiDesa:genderLaki-laki -0.5448292 -0.1285802

93

> fit.logit <-glm(celaka ~ gender + lokasi + sabuk, data = kecelakaan, family =binomial, weight = count) > fit.logit$coefficients

(Intercept) genderLaki-laki lokasiDesa sabukYa

-1.9744599 -0.5448292 0.7580583 -0.8170974

Dalam perhitungan model logit menghasilkan koefisien yang sama dengan koefisien model loglinier untuk setiap variabel yang tidak memiliki indeks i (taraf variabel celaka). Odds ratios menghubungkan parameter dua faktor model loglinear dengan efek utama parameter logistik. Misalnya saja log odds ratio untuk efek S terhadap I adalah 1- 2 = -0.817 nilainya IS IS IS IS sama dengan .11 + .11 -.11 -.11 = -0.817 dalam model loglinear. Nilai fit, statistik goodness-of-fit, derajat kebebasan, residual dan standardized residuals untuk model logistik identik dengan model loglinier (GLS, GI, IL, IS). Soal Latihan Seorang peneliti tertarik untuk melihat hubungan antara jenis kelamin, serangan jantung dan berat badan. Sebanyak 200 orang diambil sebagai sampel yang masing-masing diukur serangan jantung dan berat badannya. Dalam hal ini variable berat badan dikategorikan menjadi 2 (dua) yaitu, kelebihan berat badan (over weight) atau tidak (not over weight). Hasil penelitiannya disajikan dalam table kontingensi berikut ini Tabel 5.4 Data Serangan Jantung Berat Badan Gender Serangan Jantung Total Ya Tidak Normal Laki-laki 15 5 20 Perempuan 40 60 100

Kelebihan Laki-laki 20 10 30 Perempuan 10 40 50 Total 85 115 200 Berdasarkan tabel ini mungkin saja variabel serangan jantung diambil sebagai variabel tak bebas 94

(dependent) dan jenis kelamin dan berat badan sebagai variabel bebas (independent) sehingga analisis regresi logistik dapat dilakukan. Tetapi apabila yang diinginkan adalah melihat hubungan antar variabel jenis kelamin, berat badan dan serangan jantung untuk setiap kategorinya digunakan model log linier. a. Analisis data tersebut menggunakan model loglinier b. Bentuk model logistik yang berkaitan dengan model log liniernya dan interpretasikan hasilnya c. Hitung odds ratio untuk variabel yang berkaitan. 95

DAFTAR PUSTAKA

Agresti, Alan (2007) An Introduction to Categorical Data Analysis. John Wiley & Sons, Inc., New York. ______ (2002) Categorical Data Analysis: Second edition. John Wiley & Sons, Inc., New York.

R Core Development Team (2000) An Introduction to R. Thompson, Laura A., (2008) R (and S-PLUS) Manual to Accompany : Agrestis Categorical Data Analysis (2002) 2nd edition Venables, W. N. and Ripley, B. D. (1997) Modern Applied Statistics With S-Plus: second edition. Springer-Verlag, New York 96

Anda mungkin juga menyukai