You are on page 1of 173

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"

3
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.

4
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

5
> 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

8
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 Pearson’s 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)
Pearson’s 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)
Pearson’s 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)
Pearson’s 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)
Fisher’s 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)

Pearson’s 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)
Pearson’s 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)
Fisher’s 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(residˆ2)
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
1–2 788 5 793 0,63 1,84
3–5 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: 471–476, 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)
Fisher’s 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")

Fisher’s 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 Defendant’s 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-Mantel-
Haenszel. 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: 630–632, 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

P.
y .=
! , untuk y = 0, 1, 2, ...

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:
1–21, 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 : Agresti’s 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

You might also like