Analisis data kategori (categorical data analysis) adalah sekumpulan metode statistik yang digunakan untuk menganalisis data yang bersifat diskret dan tidak terurut secara numerik. Data kategori merepresentasikan keanggotaan suatu observasi dalam kelompok atau klasifikasi tertentu (Agresti, 2013). Berbeda dengan data kontinu, data kategori hanya dapat mengambil nilai dari sejumlah kategori yang terbatas.
Menurut Agresti (2013) dalam bukunya Categorical Data Analysis, data kategori dapat dianalisis menggunakan berbagai teknik seperti uji chi-square, analisis regresi logistik, model log-linear, dan analisis tabel kontingensi.
Variabel kategori memiliki beberapa karakteristik utama, yaitu:
Secara matematis, misalkan \(Y\) adalah variabel kategori dengan \(k\) kategori, maka: \[Y \in \{c_1, c_2, \ldots, c_k\}\] di mana \(c_i\) menyatakan kategori ke-\(i\).
Analisis data kategori banyak diterapkan dalam berbagai bidang ilmu, antara lain:
Tabel kontingensi (contingency table) adalah tabel yang menyajikan distribusi frekuensi dari dua atau lebih variabel kategori secara bersamaan. Tabel ini digunakan untuk mengeksplorasi hubungan atau asosiasi antara variabel-variabel tersebut (Agresti, 2013).
Tabel kontingensi dua dimensi dengan variabel \(X\) (baris) dan \(Y\) (kolom) disebut tabel kontingensi \(r \times c\), di mana \(r\) adalah jumlah baris dan \(c\) adalah jumlah kolom.
Berikut adalah struktur umum tabel kontingensi \(2 \times 2\):
| \(Y = 1\) (Ya) | \(Y = 0\) (Tidak) | Total | |
|---|---|---|---|
| \(X = 1\) (Ya) | \(n_{11}\) | \(n_{12}\) | \(n_{1+}\) |
| \(X = 0\) (Tidak) | \(n_{21}\) | \(n_{22}\) | \(n_{2+}\) |
| Total | \(n_{+1}\) | \(n_{+2}\) | \(n\) |
Di mana:
Joint distribution (distribusi bersama) adalah distribusi probabilitas yang menggambarkan kemungkinan terjadinya dua kejadian secara bersamaan. Pada tabel kontingensi \(2 \times 2\), joint probability didefinisikan sebagai:
\[\pi_{ij} = P(X = i, Y = j) = \frac{n_{ij}}{n}\]
sehingga berlaku: \[\sum_{i} \sum_{j} \pi_{ij} = 1\]
Contoh: Jika \(n_{11} = 65\) dan \(n = 200\), maka \(\pi_{11} = \frac{65}{200} = 0{,}325\).
Marginal distribution adalah distribusi probabilitas dari satu variabel tanpa memperhatikan variabel lainnya. Marginal probability dihitung sebagai:
\[\pi_{i+} = P(X = i) = \sum_j \pi_{ij} = \frac{n_{i+}}{n}\]
\[\pi_{+j} = P(Y = j) = \sum_i \pi_{ij} = \frac{n_{+j}}{n}\]
Contoh:
Conditional probability (peluang bersyarat) adalah peluang terjadinya suatu kejadian dengan syarat kejadian lain telah terjadi. Pada tabel kontingensi, peluang bersyarat dihitung sebagai:
\[P(Y = j \mid X = i) = \frac{\pi_{ij}}{\pi_{i+}} = \frac{n_{ij}}{n_{i+}}\]
Contoh ilustrasi tabel kontingensi \(2 \times 2\):
| Hipertensi (\(Y=1\)) | Tidak Hipertensi (\(Y=0\)) | Total | |
|---|---|---|---|
| Alkohol (\(X=1\)) | 65 | 35 | 100 |
| Tidak Alkohol (\(X=0\)) | 25 | 75 | 100 |
| Total | 90 | 110 | 200 |
Dari tabel di atas diperoleh:
Odds adalah perbandingan antara peluang suatu kejadian terjadi dengan peluang kejadian tersebut tidak terjadi. Untuk kelompok \(i\), odds didefinisikan sebagai:
\[\text{Odds}_i = \frac{P(\text{sukses} \mid X = i)}{P(\text{gagal} \mid X = i)} = \frac{\pi_{i1}}{\pi_{i2}} = \frac{n_{i1}}{n_{i2}}\]
Interpretasi: Jika Odds \(= 3\), artinya kemungkinan terjadinya suatu kejadian adalah 3 kali lebih besar dibandingkan tidak terjadinya.
Contoh:
Odds Ratio (OR) adalah perbandingan antara odds dari dua kelompok. OR merupakan ukuran asosiasi yang paling umum digunakan dalam studi epidemiologi dan regresi logistik.
\[OR = \frac{\text{Odds}_1}{\text{Odds}_2} = \frac{n_{11}/n_{12}}{n_{21}/n_{22}} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{ad}{bc}\]
di mana dalam tabel \(2 \times 2\) berlaku: \(a = n_{11}\), \(b = n_{12}\), \(c = n_{21}\), \(d = n_{22}\).
Interpretasi Odds Ratio:
| Nilai OR | Interpretasi |
|---|---|
| OR \(= 1\) | Tidak ada asosiasi antara dua variabel |
| OR \(> 1\) | Kelompok pertama memiliki odds lebih tinggi (faktor risiko) |
| OR \(< 1\) | Kelompok pertama memiliki odds lebih rendah (faktor protektif) |
Relative Risk (RR) atau Risk Ratio adalah perbandingan antara peluang (risk) terjadinya suatu kejadian pada kelompok pertama dengan kelompok kedua.
\[RR = \frac{P(\text{outcome} \mid \text{exposed})}{P(\text{outcome} \mid \text{unexposed})} = \frac{n_{11}/n_{1+}}{n_{21}/n_{2+}} = \frac{n_{11} \cdot n_{2+}}{n_{21} \cdot n_{1+}}\]
Interpretasi Relative Risk:
| Nilai RR | Interpretasi |
|---|---|
| RR \(= 1\) | Tidak ada perbedaan risiko antara dua kelompok |
| RR \(> 1\) | Kelompok exposed memiliki risiko lebih tinggi |
| RR \(< 1\) | Kelompok exposed memiliki risiko lebih rendah (protektif) |
Catatan: RR lebih mudah diinterpretasikan secara substantif dibandingkan OR, namun OR lebih stabil secara statistik dan dapat dihitung pada studi case-control. Pada studi dengan prevalensi outcome rendah (< 10%), OR \(\approx\) RR.
Sebagai contoh, digunakan data simulasi dari sebuah studi kohort mengenai hubungan antara konsumsi alkohol dan kejadian hipertensi pada 200 responden.
Dari data yang dikumpulkan, diperoleh tabel kontingensi sebagai berikut:
| Hipertensi (\(Y=1\)) | Tidak Hipertensi (\(Y=0\)) | Total | |
|---|---|---|---|
| Alkohol (\(X=1\)) | \(a = 65\) | \(b = 35\) | 100 |
| Tidak Alkohol (\(X=0\)) | \(c = 25\) | \(d = 75\) | 100 |
| Total | 90 | 110 | 200 |
Peluang terkena hipertensi pada kelompok konsumsi alkohol:
\[P(\text{Hipertensi} \mid \text{Alkohol}) = \frac{a}{a + b} = \frac{65}{65 + 35} = \frac{65}{100} = 0{,}65\]
Peluang terkena hipertensi pada kelompok tidak konsumsi alkohol:
\[P(\text{Hipertensi} \mid \text{Tidak Alkohol}) = \frac{c}{c + d} = \frac{25}{25 + 75} = \frac{25}{100} = 0{,}25\]
Odds pada kelompok Konsumsi Alkohol:
\[\text{Odds}_{\text{Alkohol}} = \frac{P(\text{Hipertensi} \mid \text{Alkohol})}{1 - P(\text{Hipertensi} \mid \text{Alkohol})} = \frac{0{,}65}{0{,}35} = \frac{a}{b} = \frac{65}{35} = 1{,}857\]
Odds pada kelompok Tidak Konsumsi Alkohol:
\[\text{Odds}_{\text{Tidak Alkohol}} = \frac{P(\text{Hipertensi} \mid \text{Tidak Alkohol})}{1 - P(\text{Hipertensi} \mid \text{Tidak Alkohol})} = \frac{0{,}25}{0{,}75} = \frac{c}{d} = \frac{25}{75} = 0{,}333\]
\[OR = \frac{\text{Odds}_{\text{Alkohol}}}{\text{Odds}_{\text{Tidak Alkohol}}} = \frac{1{,}857}{0{,}333} = 5{,}571\]
Atau menggunakan rumus langsung:
\[OR = \frac{ad}{bc} = \frac{65 \times 75}{35 \times 25} = \frac{4875}{875} = 5{,}571\]
\[RR = \frac{P(\text{Hipertensi} \mid \text{Alkohol})}{P(\text{Hipertensi} \mid \text{Tidak Alkohol})} = \frac{0{,}65}{0{,}25} = 2{,}600\]
Atau menggunakan rumus langsung:
\[RR = \frac{a/(a+b)}{c/(c+d)} = \frac{65/100}{25/100} = 2{,}600\]
# Membuat matriks data simulasi
data <- matrix(
c(65, 35,
25, 75),
nrow = 2,
byrow = TRUE
)
rownames(data) <- c("Alkohol", "Tidak Alkohol")
colnames(data) <- c("Hipertensi", "Tidak Hipertensi")
# Tampilkan tabel
cat("=== Tabel Kontingensi: Konsumsi Alkohol vs Hipertensi ===\n\n")## === Tabel Kontingensi: Konsumsi Alkohol vs Hipertensi ===
## Hipertensi Tidak Hipertensi
## Alkohol 65 35
## Tidak Alkohol 25 75
##
## === Tabel dengan Total Margin ===
## Hipertensi Tidak Hipertensi Sum
## Alkohol 65 35 100
## Tidak Alkohol 25 75 100
## Sum 90 110 200
## === Joint Probability ===
## Hipertensi Tidak Hipertensi
## Alkohol 0.325 0.175
## Tidak Alkohol 0.125 0.375
# Marginal probability (baris)
cat("\n=== Marginal Probability (Baris / Status Konsumsi Alkohol) ===\n\n")##
## === Marginal Probability (Baris / Status Konsumsi Alkohol) ===
## Hipertensi Tidak Hipertensi
## Alkohol 0.65 0.35
## Tidak Alkohol 0.25 0.75
# Marginal probability (kolom)
cat("\n=== Marginal Probability (Kolom / Status Hipertensi) ===\n\n")##
## === Marginal Probability (Kolom / Status Hipertensi) ===
## Hipertensi Tidak Hipertensi
## Alkohol 0.7222 0.3182
## Tidak Alkohol 0.2778 0.6818
# Ekstrak nilai sel tabel
a <- data[1, 1] # Alkohol & Hipertensi
b <- data[1, 2] # Alkohol & Tidak Hipertensi
c <- data[2, 1] # Tidak Alkohol & Hipertensi
d <- data[2, 2] # Tidak Alkohol & Tidak Hipertensi
# Hitung Odds masing-masing kelompok
odds_alkohol <- a / b
odds_tidak_alkohol <- c / d
# Hitung Odds Ratio
OR <- (a * d) / (b * c)
# Hitung Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
# Tampilkan hasil
cat("=== Hasil Perhitungan Ukuran Asosiasi ===\n\n")## === Hasil Perhitungan Ukuran Asosiasi ===
## Odds (Alkohol) : 1.8571
## Odds (Tidak Alkohol) : 0.3333
## Odds Ratio (OR) : 5.5714
## Relative Risk (RR) : 2.6000
# Verifikasi menggunakan package epitools
if (!requireNamespace("epitools", quietly = TRUE)) {
install.packages("epitools", repos = "https://cloud.r-project.org")
}
library(epitools)
# Odds Ratio dengan 95% Confidence Interval
cat("=== Odds Ratio dengan 95% Confidence Interval ===\n\n")## === Odds Ratio dengan 95% Confidence Interval ===
## NA
## odds ratio with 95% C.I. estimate lower upper
## Alkohol 1.000000 NA NA
## Tidak Alkohol 5.571429 3.023195 10.26755
# Relative Risk dengan 95% Confidence Interval
cat("\n=== Relative Risk dengan 95% Confidence Interval ===\n\n")##
## === Relative Risk dengan 95% Confidence Interval ===
## NA
## risk ratio with 95% C.I. estimate lower upper
## Alkohol 1.000000 NA NA
## Tidak Alkohol 2.142857 1.603294 2.864001
## === Uji Chi-Square ===
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 30.727, df = 1, p-value = 2.97e-08
# Frekuensi harapan (expected frequencies)
cat("\n=== Frekuensi Harapan (Expected Frequencies) ===\n\n")##
## === Frekuensi Harapan (Expected Frequencies) ===
## Hipertensi Tidak Hipertensi
## Alkohol 45 55
## Tidak Alkohol 45 55
##
## Nilai Chi-Square : 30.7273
## Derajat Kebebasan : 1
## p-value : 0.000000
par(mfrow = c(1, 2))
# Barplot proporsi bersyarat
prop_baris <- prop.table(data, margin = 1)
barplot(
t(prop_baris),
beside = TRUE,
col = c("#E74C3C", "#3498DB"),
legend = colnames(data),
main = "Proporsi Status Hipertensi\nBerdasarkan Konsumsi Alkohol",
xlab = "Konsumsi Alkohol",
ylab = "Proporsi",
ylim = c(0, 0.8),
args.legend = list(x = "topright", bty = "n")
)
# Mosaic plot
mosaicplot(
data,
main = "Mosaic Plot: Konsumsi Alkohol vs Hipertensi",
color = c("#E74C3C", "#3498DB"),
xlab = "Konsumsi Alkohol",
ylab = "Status Hipertensi",
shade = FALSE
)Berdasarkan hasil analisis pada data simulasi konsumsi alkohol vs hipertensi, diperoleh:
Peluang Bersyarat:
Odds Ratio (\(OR = 5{,}571\)): Odds terkena hipertensi pada kelompok konsumsi alkohol adalah 5,571 kali lebih besar dibandingkan kelompok yang tidak mengonsumsi alkohol. Karena \(OR > 1\), maka konsumsi alkohol merupakan faktor risiko terhadap kejadian hipertensi.
Relative Risk (\(RR = 2{,}600\)): Risiko terkena hipertensi pada kelompok konsumsi alkohol adalah 2,6 kali lebih tinggi dibandingkan yang tidak mengonsumsi alkohol.
Uji Chi-Square: Karena \(p\text{-value} < \alpha = 0{,}05\), maka terdapat asosiasi yang signifikan secara statistik antara konsumsi alkohol dan kejadian hipertensi.
Secara substantif, hasil analisis menunjukkan bahwa konsumsi alkohol memiliki hubungan yang kuat dengan kejadian hipertensi. Kelompok yang mengonsumsi alkohol memiliki risiko lebih tinggi untuk mengalami hipertensi dibandingkan yang tidak mengonsumsi alkohol. Temuan ini sejalan dengan literatur ilmiah yang menyatakan bahwa konsumsi alkohol secara berlebihan dapat meningkatkan tekanan darah melalui mekanisme aktivasi sistem saraf simpatis dan gangguan keseimbangan elektrolit (Roerecke et al., 2017; WHO, 2023).
Meskipun data yang digunakan merupakan data simulasi, pola hubungan yang ditunjukkan mencerminkan fenomena nyata dalam penelitian epidemiologi. Oleh karena itu, pembatasan konsumsi alkohol merupakan salah satu upaya penting dalam pencegahan hipertensi di masyarakat.
Inferensi pada tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat hubungan atau asosiasi yang signifikan antara dua variabel kategori, sekaligus mengestimasi kekuatan asosiasi tersebut beserta interval kepercayaannya. Berbeda dengan analisis deskriptif yang hanya merangkum data yang ada, inferensi memungkinkan kita untuk menarik kesimpulan tentang populasi berdasarkan sampel yang diamati (Agresti, 2013).
Metode inferensi yang umum digunakan pada tabel kontingensi dua arah meliputi:
Selain itu, estimasi interval kepercayaan untuk ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) merupakan bagian penting dari analisis inferensial. Interval kepercayaan memberikan informasi tentang presisi estimasi dan rentang nilai yang masuk akal untuk parameter populasi.
Interval Kepercayaan untuk Risk Difference (RD): \[RD = \hat{p}_1 - \hat{p}_2, \quad CI_{RD} = RD \pm z_{\alpha/2} \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]
Interval Kepercayaan untuk Relative Risk (RR): \[CI_{RR} = \exp\left(\ln(\widehat{RR}) \pm z_{\alpha/2} \sqrt{\frac{1 - \hat{p}_1}{n_1 \hat{p}_1} + \frac{1 - \hat{p}_2}{n_2 \hat{p}_2}}\right)\]
Interval Kepercayaan untuk Odds Ratio (OR) — Metode Woolf/Wald: \[CI_{OR} = \exp\left(\ln(\widehat{OR}) \pm z_{\alpha/2} \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\right)\]
Pada bab ini disajikan dua kasus: Kasus 1 menggunakan tabel \(2 \times 2\) (kebiasaan merokok dan kanker paru) dan Kasus 2 menggunakan tabel \(2 \times 3\) (gender dan identifikasi partai politik).
Data dari studi case-control tentang hubungan kebiasaan merokok dan kejadian kanker paru pada 1.418 subjek.
| Status Merokok | Cancer (+) | Control (−) | Total |
|---|---|---|---|
| Smoker | \(a = 688\) | \(b = 650\) | 1338 |
| Non-Smoker | \(c = 21\) | \(d = 59\) | 80 |
| Total | 709 | 709 | 1418 |
# Membuat tabel kontingensi Kasus 1
tabel1 <- matrix(
c(688, 650,
21, 59),
nrow = 2,
byrow = TRUE
)
rownames(tabel1) <- c("Smoker", "Non-Smoker")
colnames(tabel1) <- c("Cancer (+)", "Control (-)")
cat("=== Tabel Kontingensi 2x2: Merokok vs Kanker Paru ===\n\n")## === Tabel Kontingensi 2x2: Merokok vs Kanker Paru ===
## Cancer (+) Control (-) Sum
## Smoker 688 650 1338
## Non-Smoker 21 59 80
## Sum 709 709 1418
Data survei tentang hubungan gender dan identifikasi partai politik pada 2.450 responden.
| Gender | Democrat | Republican | Independent | Total |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
tabel2 <- matrix(
c(495, 272, 590,
330, 265, 498),
nrow = 2,
byrow = TRUE
)
rownames(tabel2) <- c("Female", "Male")
colnames(tabel2) <- c("Democrat", "Republican", "Independent")
cat("=== Tabel Kontingensi 2x3: Gender vs Identifikasi Partai Politik ===\n\n")## === Tabel Kontingensi 2x3: Gender vs Identifikasi Partai Politik ===
## Democrat Republican Independent Sum
## Female 495 272 590 1357
## Male 330 265 498 1093
## Sum 825 537 1088 2450
Analisis inferensial pada kedua kasus menggunakan pendekatan berikut:
Kasus 1 (2 × 2):
Kasus 2 (2 × 3):
Estimasi titik proporsi kejadian kanker paru pada masing-masing kelompok dihitung sebagai:
\[\hat{p}_{\text{Smoker}} = \frac{a}{a + b} = \frac{688}{1338} \approx 0{,}5143\]
\[\hat{p}_{\text{Non-Smoker}} = \frac{c}{c + d} = \frac{21}{80} = 0{,}2625\]
a1 <- tabel1[1, 1]; b1 <- tabel1[1, 2]
c1 <- tabel1[2, 1]; d1 <- tabel1[2, 2]
n1_row <- a1 + b1; n2_row <- c1 + d1; n_tot <- n1_row + n2_row
p1 <- a1 / n1_row
p2 <- c1 / n2_row
cat("=== Estimasi Titik Proporsi ===\n\n")## === Estimasi Titik Proporsi ===
## Proporsi Smoker (p1) : 688 / 1338 = 0.5142 (51.42%)
## Proporsi Non-Smoker (p2) : 21 / 80 = 0.2625 (26.25%)
Interpretasi: Proporsi kejadian kanker paru pada kelompok perokok adalah sekitar 51,43%, sedangkan pada kelompok non-perokok hanya 26,25%. Secara deskriptif, terdapat perbedaan proporsi yang cukup besar di antara kedua kelompok ini, yang mengindikasikan adanya potensi hubungan antara kebiasaan merokok dengan kejadian kanker paru.
Interval kepercayaan 95% untuk proporsi masing-masing kelompok dihitung dengan metode Wald:
\[\hat{p} \pm z_{0{,}025} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
Untuk kelompok Smoker: \[0{,}5143 \pm 1{,}96 \sqrt{\frac{0{,}5143 \times 0{,}4857}{1338}}\]
Untuk kelompok Non-Smoker: \[0{,}2625 \pm 1{,}96 \sqrt{\frac{0{,}2625 \times 0{,}7375}{80}}\]
z_val <- qnorm(0.975)
# CI untuk p1 (Smoker)
se_p1 <- sqrt(p1 * (1 - p1) / n1_row)
ci_p1 <- c(p1 - z_val * se_p1, p1 + z_val * se_p1)
# CI untuk p2 (Non-Smoker)
se_p2 <- sqrt(p2 * (1 - p2) / n2_row)
ci_p2 <- c(p2 - z_val * se_p2, p2 + z_val * se_p2)
cat("=== Interval Kepercayaan 95% untuk Proporsi ===\n\n")## === Interval Kepercayaan 95% untuk Proporsi ===
## CI 95% Smoker : (0.4874, 0.5410)
## CI 95% Non-Smoker : (0.1661, 0.3589)
Risk Difference (RD) atau selisih risiko mengukur perbedaan absolut antara dua proporsi:
\[RD = \hat{p}_1 - \hat{p}_2 = 0{,}5143 - 0{,}2625 = 0{,}2518\]
Interval kepercayaan 95% untuk RD:
\[CI_{RD} = RD \pm z_{0{,}025} \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]
RD <- p1 - p2
se_RD <- sqrt(p1 * (1 - p1) / n1_row + p2 * (1 - p2) / n2_row)
ci_RD <- c(RD - z_val * se_RD, RD + z_val * se_RD)
cat("=== Risk Difference (RD) ===\n\n")## === Risk Difference (RD) ===
## RD : 0.2517
## SE (RD) : 0.0511
## CI 95% : (0.1516, 0.3518)
Relative Risk (RR) dihitung dengan menggunakan transformasi logaritma natural untuk memperoleh distribusi yang lebih mendekati normal:
\[\widehat{RR} = \frac{\hat{p}_1}{\hat{p}_2} = \frac{0{,}5143}{0{,}2625} \approx 1{,}959\]
\[CI_{RR} = \exp\left(\ln(\widehat{RR}) \pm z_{0{,}025} \sqrt{\frac{1-\hat{p}_1}{n_1 \hat{p}_1} + \frac{1-\hat{p}_2}{n_2 \hat{p}_2}}\right)\]
RR_k1 <- p1 / p2
se_lnRR <- sqrt((1 - p1) / (n1_row * p1) + (1 - p2) / (n2_row * p2))
ci_RR <- exp(c(log(RR_k1) - z_val * se_lnRR, log(RR_k1) + z_val * se_lnRR))
cat("=== Relative Risk (RR) ===\n\n")## === Relative Risk (RR) ===
## RR : 1.9589
## ln(RR) : 0.6724
## SE (ln RR) : 0.1893
## CI 95% : (1.3517, 2.8387)
Odds Ratio (OR) dihitung dengan rumus silang (cross-product ratio):
\[\widehat{OR} = \frac{ad}{bc} = \frac{688 \times 59}{650 \times 21} = \frac{40592}{13650} \approx 2{,}974\]
Interval kepercayaan 95% menggunakan metode Woolf (Wald pada skala log):
\[CI_{OR} = \exp\left(\ln(\widehat{OR}) \pm z_{0{,}025} \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\right)\]
OR_k1 <- (a1 * d1) / (b1 * c1)
se_lnOR <- sqrt(1/a1 + 1/b1 + 1/c1 + 1/d1)
ci_OR <- exp(c(log(OR_k1) - z_val * se_lnOR, log(OR_k1) + z_val * se_lnOR))
cat("=== Odds Ratio (OR) ===\n\n")## === Odds Ratio (OR) ===
## OR : 2.9738
## ln(OR) : 1.0898
## SE (ln OR) : 0.2599
## CI 95% : (1.7867, 4.9494)
# Verifikasi dengan package epitools
if (!requireNamespace("epitools", quietly = TRUE)) {
install.packages("epitools", repos = "https://cloud.r-project.org")
}
library(epitools)
cat("=== Verifikasi OR dengan epitools (Metode Wald) ===\n\n")## === Verifikasi OR dengan epitools (Metode Wald) ===
## NA
## odds ratio with 95% C.I. estimate lower upper
## Smoker 1.000000 NA NA
## Non-Smoker 2.973773 1.786737 4.949427
##
## === Verifikasi RR dengan epitools ===
## NA
## risk ratio with 95% C.I. estimate lower upper
## Smoker 1.000000 NA NA
## Non-Smoker 1.518115 1.317306 1.749536
Interpretasi Ukuran Asosiasi:
Uji dua proporsi digunakan untuk menguji apakah proporsi kejadian kanker paru pada kelompok perokok dan non-perokok berbeda secara signifikan.
Hipotesis:
Statistik uji menggunakan proporsi pooled:
\[\hat{p} = \frac{n_{11} + n_{21}}{n} = \frac{688 + 21}{1418} = \frac{709}{1418} \approx 0{,}5000\]
\[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\dfrac{1}{n_1} + \dfrac{1}{n_2}\right)}}\]
p_pool <- (a1 + c1) / n_tot
se_pool <- sqrt(p_pool * (1 - p_pool) * (1/n1_row + 1/n2_row))
Z_stat <- (p1 - p2) / se_pool
p_val_z <- 2 * pnorm(-abs(Z_stat))
cat("=== Uji Dua Proporsi ===\n\n")## === Uji Dua Proporsi ===
## Proporsi pooled : 0.5000
## SE pooled : 0.0575
## Z statistik : 4.3737
## p-value (2-ekor) : 0.000012
## Keputusan (α=0.05): Tolak H0
##
## --- Verifikasi dengan prop.test ---
##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(a1, c1) out of c(n1_row, n2_row)
## X-squared = 19.129, df = 1, p-value = 1.222e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.1516343 0.3517663
## sample estimates:
## prop 1 prop 2
## 0.5142003 0.2625000
Interpretasi: Nilai \(Z\) dengan \(p\text{-value} \approx 0\) jauh lebih kecil dari \(\alpha = 0{,}05\), sehingga \(H_0\) ditolak. Terdapat perbedaan proporsi yang signifikan antara kelompok perokok dan non-perokok dalam hal kejadian kanker paru.
Uji chi-square independensi menguji apakah dua variabel kategori bersifat independen (tidak berasosiasi) satu sama lain.
Hipotesis:
Statistik uji:
\[\chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}, \quad \hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]
dengan derajat kebebasan \(df = (r-1)(c-1) = (2-1)(2-1) = 1\).
## === Uji Chi-Square Independensi ===
## --- Frekuensi Harapan ---
## Cancer (+) Control (-)
## Smoker 669 669
## Non-Smoker 40 40
##
## Chi-Square statistik : 19.1292
## Derajat kebebasan : 1
## p-value : 0.000012
cat(sprintf("Keputusan (α=0.05) : %s\n",
ifelse(chi_res1$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))## Keputusan (α=0.05) : Tolak H0
Interpretasi: Nilai \(\chi^2\) dengan \(p\text{-value} \approx 0\) sangat kecil. Karena \(p\text{-value} < \alpha = 0{,}05\), maka \(H_0\) ditolak. Terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru.
Uji likelihood ratio atau statistik \(G^2\) merupakan alternatif dari uji chi-square Pearson yang berbasis pada prinsip maximum likelihood estimation (MLE). Statistik ini mengukur seberapa jauh data yang diamati menyimpang dari yang diharapkan di bawah \(H_0\).
Hipotesis sama dengan uji chi-square:
Statistik uji:
\[G^2 = 2 \sum_{i,j} n_{ij} \ln\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]
dengan distribusi asimptotik \(\chi^2\) berderajat kebebasan \(df = (r-1)(c-1) = 1\).
mu_hat <- chi_res1$expected
G2 <- 2 * sum(tabel1 * log(tabel1 / mu_hat))
p_G2 <- pchisq(G2, df = 1, lower.tail = FALSE)
cat("=== Uji Likelihood Ratio (G²) ===\n\n")## === Uji Likelihood Ratio (G²) ===
## G² statistik : 19.8780
## Derajat kebebasan : 1
## p-value : 0.000008
## Keputusan (α=0.05) : Tolak H0
Interpretasi: Nilai \(G^2\) dengan \(p\text{-value} \approx 0\), sehingga \(H_0\) ditolak. Hasil ini konsisten dengan uji chi-square Pearson, mengkonfirmasi adanya asosiasi yang signifikan.
Fisher exact test digunakan sebagai alternatif yang lebih konservatif ketika frekuensi harapan di beberapa sel terlalu kecil (umumnya < 5) atau ketika ukuran sampel tidak cukup besar untuk mendukung pendekatan asimptotik. Uji ini menghitung nilai-\(p\) secara eksak berdasarkan distribusi hipergeometrik, sehingga tidak bergantung pada asumsi distribusi asimptotik.
Hipotesis:
## === Fisher Exact Test ===
##
## Fisher's Exact Test for Count Data
##
## data: tabel1
## p-value = 1.476e-05
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.755611 5.210711
## sample estimates:
## odds ratio
## 2.971634
##
## OR (Fisher's) : 2.9716
## CI 95% OR : (1.7556, 5.2107)
## p-value : 0.000015
## Keputusan : Tolak H0
Interpretasi: Fisher exact test menghasilkan \(p\text{-value} \approx 0\), jauh di bawah \(\alpha = 0{,}05\). \(H_0\) ditolak, artinya terdapat asosiasi yang signifikan antara kebiasaan merokok dan kanker paru. OR yang diperoleh dari metode eksak ini konsisten dengan OR yang dihitung secara manual.
Tabel berikut merangkum perbandingan antara keempat metode pengujian yang telah dilakukan:
hasil_perbandingan <- data.frame(
Metode = c("Uji Dua Proporsi", "Chi-Square (Pearson)",
"Likelihood Ratio (G²)", "Fisher Exact Test"),
H0 = c("p₁ = p₂", "Independen", "Independen", "OR = 1"),
Statistik_Uji = c(
sprintf("Z = %.4f", Z_stat),
sprintf("χ² = %.4f", chi_res1$statistic),
sprintf("G² = %.4f", G2),
"— (eksak)"
),
p_value = c(
sprintf("%.2e", p_val_z),
sprintf("%.2e", chi_res1$p.value),
sprintf("%.2e", p_G2),
sprintf("%.2e", fisher_res1$p.value)
),
Keputusan = rep("Tolak H₀", 4),
Asumsi = c(
"Sampel besar (normal asimptotik)",
"Frekuensi harapan ≥ 5",
"Frekuensi harapan ≥ 1",
"Tidak ada asumsi asimptotik"
)
)
knitr::kable(
hasil_perbandingan,
caption = "Perbandingan Hasil Keempat Metode Pengujian pada Kasus 1",
col.names = c("Metode", "H₀", "Statistik Uji", "p-value", "Keputusan", "Asumsi Utama"),
align = c("l","c","c","c","c","l")
)| Metode | H₀ | Statistik Uji | p-value | Keputusan | Asumsi Utama |
|---|---|---|---|---|---|
| Uji Dua Proporsi | p₁ = p₂ | Z = 4.3737 | 1.22e-05 | Tolak H₀ | Sampel besar (normal asimptotik) |
| Chi-Square (Pearson) | Independen | χ² = 19.1292 | 1.22e-05 | Tolak H₀ | Frekuensi harapan ≥ 5 |
| Likelihood Ratio (G²) | Independen | G² = 19.8780 | 8.25e-06 | Tolak H₀ | Frekuensi harapan ≥ 1 |
| Fisher Exact Test | OR = 1 | — (eksak) | 1.48e-05 | Tolak H₀ | Tidak ada asumsi asimptotik |
Perbandingan substantif keempat metode:
par(mfrow = c(1, 3))
# Barplot proporsi bersyarat
prop_baris1 <- prop.table(tabel1, margin = 1)
barplot(
t(prop_baris1),
beside = TRUE,
col = c("#E74C3C", "#3498DB"),
legend = colnames(tabel1),
main = "Proporsi Status Kanker Paru\nBerdasarkan Kebiasaan Merokok",
xlab = "Status Merokok",
ylab = "Proporsi",
ylim = c(0, 0.85),
args.legend = list(x = "topright", bty = "n", cex = 0.85)
)
# Mosaic plot
mosaicplot(
tabel1,
main = "Mosaic Plot:\nMerokok vs Kanker Paru",
color = c("#E74C3C", "#3498DB"),
xlab = "Status Merokok",
ylab = "Status Kanker Paru",
shade = FALSE
)
# Residual Pearson
res_pearson1 <- (tabel1 - chi_res1$expected) / sqrt(chi_res1$expected)
bp_labels <- c("Smoker\nCancer+", "Smoker\nControl-",
"Non-Smoker\nCancer+", "Non-Smoker\nControl-")
barplot(
as.vector(res_pearson1),
names.arg = bp_labels,
col = ifelse(as.vector(res_pearson1) > 0, "#E74C3C", "#3498DB"),
main = "Residual Pearson\nKasus 1",
ylab = "Residual Pearson",
las = 2,
cex.names = 0.72
)
abline(h = c(-2, 2), lty = 2, col = "gray40")Frekuensi harapan (expected frequencies) untuk setiap sel dihitung di bawah asumsi \(H_0\) (independensi) menggunakan rumus:
\[\hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]
Sebagai contoh perhitungan manual untuk sel Female–Democrat:
\[\hat{\mu}_{11} = \frac{1357 \times 825}{2450} = \frac{1119225}{2450} \approx 456{,}83\]
chi2_res <- chisq.test(tabel2, correct = FALSE)
expected2 <- chi2_res$expected
cat("=== Frekuensi Harapan (Expected Frequencies) ===\n\n")## === Frekuensi Harapan (Expected Frequencies) ===
## Democrat Republican Independent
## Female 456.949 297.4322 602.6188
## Male 368.051 239.5678 485.3812
##
## Catatan: Seluruh sel memiliki frekuensi harapan > 5,
##
## sehingga asumsi chi-square terpenuhi.
Interpretasi: Semua sel memiliki frekuensi harapan yang jauh di atas 5, sehingga pendekatan asimptotik chi-square dapat diterapkan dengan aman pada data ini.
Hipotesis:
Statistik uji:
\[\chi^2 = \sum_{i=1}^{2} \sum_{j=1}^{3} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}\]
dengan derajat kebebasan \(df = (r-1)(c-1) = (2-1)(3-1) = 2\).
## === Uji Chi-Square Independensi (Keseluruhan 2×3) ===
## Chi-Square statistik : 12.5693
## Derajat kebebasan : 2
## p-value : 0.001865
cat(sprintf("Keputusan (α=0.05) : %s\n",
ifelse(chi2_res$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))## Keputusan (α=0.05) : Tolak H0
Interpretasi: Nilai \(\chi^2\) dengan \(df = 2\) dan \(p\text{-value} < 0{,}05\), sehingga \(H_0\) ditolak. Terdapat asosiasi yang signifikan antara gender dan identifikasi partai politik.
Untuk mengetahui sel mana yang paling berkontribusi terhadap asosiasi, dihitung dua jenis residual.
Residual Pearson:
\[e_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\]
Standardized Residual (residual yang telah distandardisasi):
\[r_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1 - \hat{p}_{i+})(1 - \hat{p}_{+j})}}\]
Nilai \(|r_{ij}| > 2\) mengindikasikan bahwa sel tersebut berkontribusi signifikan terhadap ketidakindependenan keseluruhan (setara dengan taraf signifikansi \(\alpha = 0{,}05\) pada uji dua arah).
pearson_res2 <- (tabel2 - expected2) / sqrt(expected2)
std_res2 <- chi2_res$stdres
cat("=== Residual Pearson ===\n\n")## === Residual Pearson ===
## Democrat Republican Independent
## Female 1.7801 -1.4747 -0.5140
## Male -1.9834 1.6431 0.5728
##
## === Standardized Residual ===
## Democrat Republican Independent
## Female 3.2724 -2.4986 -1.0322
## Male -3.2724 2.4986 1.0322
##
## Sel dengan |Standardized Residual| > 2 (signifikan):
sig_idx <- which(abs(std_res2) > 2, arr.ind = TRUE)
for (k in seq_len(nrow(sig_idx))) {
i <- sig_idx[k, 1]; j <- sig_idx[k, 2]
cat(sprintf(" [%-6s, %-11s] : r = %+.4f -> %s dari ekspektasi\n",
rownames(tabel2)[i], colnames(tabel2)[j],
std_res2[i, j],
ifelse(std_res2[i, j] > 0, "Lebih tinggi", "Lebih rendah")))
}## [Female, Democrat ] : r = +3.2724 -> Lebih tinggi dari ekspektasi
## [Male , Democrat ] : r = -3.2724 -> Lebih rendah dari ekspektasi
## [Female, Republican ] : r = -2.4986 -> Lebih rendah dari ekspektasi
## [Male , Republican ] : r = +2.4986 -> Lebih tinggi dari ekspektasi
Interpretasi Residual:
Partisi chi-square (chi-square partitioning) memungkinkan kita mengurai statistik chi-square keseluruhan (\(df = 2\)) menjadi komponen-komponen yang lebih kecil (\(df = 1\) masing-masing), sehingga dapat diidentifikasi sumber spesifik dari asosiasi yang ditemukan.
Dua partisi yang dilakukan:
Secara teoritis, jumlah nilai chi-square dari kedua partisi seharusnya mendekati nilai chi-square keseluruhan karena \(df_{\text{total}} = df_1 + df_2 = 1 + 1 = 2\).
# --- Partisi 1: Democrat vs Republican ---
tabel2_DR <- tabel2[, c("Democrat", "Republican")]
chi_DR <- chisq.test(tabel2_DR, correct = FALSE)
cat("=== Partisi 1: Democrat vs Republican ===\n\n")## === Partisi 1: Democrat vs Republican ===
## Democrat Republican Sum
## Female 495 272 767
## Male 330 265 595
## Sum 825 537 1362
##
## Chi-Square : 11.5545
## df : 1
## p-value : 0.000676
## Keputusan : Tolak H0
# --- Partisi 2: (Democrat + Republican) vs Independent ---
tabel2_DRI <- cbind(
"Dem+Rep" = tabel2[, "Democrat"] + tabel2[, "Republican"],
"Independent" = tabel2[, "Independent"]
)
chi_DRI <- chisq.test(tabel2_DRI, correct = FALSE)
cat("\n=== Partisi 2: (Democrat + Republican) vs Independent ===\n\n")##
## === Partisi 2: (Democrat + Republican) vs Independent ===
## Dem+Rep Independent Sum
## Female 767 590 1357
## Male 595 498 1093
## Sum 1362 1088 2450
##
## Chi-Square : 1.0654
## df : 1
## p-value : 0.301979
## Keputusan : Gagal Tolak H0
##
## === Ringkasan Partisi Chi-Square ===
cat(sprintf("Chi-Square keseluruhan (df=2) : %.4f (p = %.6f)\n",
chi2_res$statistic, chi2_res$p.value))## Chi-Square keseluruhan (df=2) : 12.5693 (p = 0.001865)
## Partisi 1 — Dem vs Rep (df=1) : 11.5545 (p = 0.000676)
cat(sprintf("Partisi 2 — (D+R) vs Ind (df=1) : %.4f (p = %.6f)\n",
chi_DRI$statistic, chi_DRI$p.value))## Partisi 2 — (D+R) vs Ind (df=1) : 1.0654 (p = 0.301979)
## Jumlah partisi (df=1+1=2) : 12.6200
perbandingan2 <- data.frame(
Pengujian = c("Keseluruhan (2 × 3)",
"Partisi 1: Democrat vs Republican",
"Partisi 2: (Dem+Rep) vs Independent"),
Chi_Square = c(chi2_res$statistic, chi_DR$statistic, chi_DRI$statistic),
df = c(2, 1, 1),
p_value = c(chi2_res$p.value, chi_DR$p.value, chi_DRI$p.value),
Keputusan = rep("Tolak H0", 3)
)
knitr::kable(
perbandingan2,
caption = "Perbandingan Uji Chi-Square Keseluruhan dan Partisi pada Kasus 2",
digits = 4,
col.names = c("Pengujian", "χ²", "df", "p-value", "Keputusan"),
align = c("l","c","c","c","c")
)| Pengujian | χ² | df | p-value | Keputusan |
|---|---|---|---|---|
| Keseluruhan (2 × 3) | 12.5693 | 2 | 0.0019 | Tolak H0 |
| Partisi 1: Democrat vs Republican | 11.5545 | 1 | 0.0007 | Tolak H0 |
| Partisi 2: (Dem+Rep) vs Independent | 1.0654 | 1 | 0.3020 | Tolak H0 |
Perbandingan dan interpretasi: Jumlah nilai chi-square dari kedua partisi (\(\chi^2_{\text{P1}} + \chi^2_{\text{P2}}\)) mendekati nilai chi-square keseluruhan dengan \(df = 2\). Hal ini mengkonfirmasi bahwa kedua dimensi perbandingan — afiliasi Democrat vs Republican, dan kelompok dua partai besar vs Independent — masing-masing memberikan kontribusi yang nyata dan bersifat ortogonal terhadap ketidakindependenan yang teramati. Kedua partisi juga secara individual menunjukkan nilai \(p\text{-value} < 0{,}05\), artinya kedua sumber asosiasi signifikan secara statistik.
kontribusi2 <- (tabel2 - expected2)^2 / expected2
persen2 <- kontribusi2 / sum(kontribusi2) * 100
cat("=== Kontribusi Chi-Square per Sel ===\n\n")## === Kontribusi Chi-Square per Sel ===
## Democrat Republican Independent
## Female 3.1686 2.1746 0.2642
## Male 3.9339 2.6999 0.3281
##
## === Persentase Kontribusi per Sel (%) ===
## Democrat Republican Independent
## Female 25.21 17.30 2.10
## Male 31.30 21.48 2.61
##
## Total Chi-Square : 12.5693
Interpretasi: Sel dengan persentase kontribusi terbesar terhadap nilai \(\chi^2\) keseluruhan adalah Female–Democrat dan Male–Democrat. Hal ini menegaskan bahwa perbedaan afiliasi terhadap Partai Democrat antara perempuan dan laki-laki merupakan sumber utama asosiasi antara gender dan identifikasi partai politik dalam data ini.
par(mfrow = c(1, 3))
# Barplot proporsi bersyarat
prop_baris2 <- prop.table(tabel2, margin = 1)
barplot(
t(prop_baris2),
beside = TRUE,
col = c("#2980B9", "#E74C3C", "#27AE60"),
legend = colnames(tabel2),
main = "Proporsi Identifikasi Partai\nBerdasarkan Gender",
xlab = "Gender",
ylab = "Proporsi",
ylim = c(0, 0.58),
args.legend = list(x = "topright", bty = "n", cex = 0.85)
)
# Mosaic plot
mosaicplot(
tabel2,
main = "Mosaic Plot:\nGender vs Identifikasi Partai",
color = c("#2980B9", "#E74C3C", "#27AE60"),
xlab = "Gender",
ylab = "Identifikasi Partai",
shade = FALSE
)
# Standardized residual
std_vec <- as.vector(t(chi2_res$stdres))
bar_names <- c("F-Dem", "M-Dem", "F-Rep", "M-Rep", "F-Ind", "M-Ind")
barplot(
std_vec,
names.arg = bar_names,
col = ifelse(std_vec > 0, "#2980B9", "#E74C3C"),
main = "Standardized Residual\nKasus 2",
ylab = "Standardized Residual",
las = 2,
cex.names = 0.82
)
abline(h = c(-2, 2), lty = 2, col = "gray40")
legend("topright", legend = c("Positif (lebih tinggi dari harapan)",
"Negatif (lebih rendah dari harapan)"),
fill = c("#2980B9", "#E74C3C"), bty = "n", cex = 0.72)Berdasarkan seluruh analisis yang telah dilakukan pada data hubungan merokok dan kanker paru, dapat ditarik kesimpulan sebagai berikut:
Kesimpulan akhir: Terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru. Perokok memiliki risiko hampir 2 kali lebih besar (RR ≈ 1,96) dan odds hampir 3 kali lebih besar (OR ≈ 2,97) untuk terkena kanker paru dibandingkan non-perokok. Temuan ini konsisten dengan berbagai studi epidemiologi yang menegaskan bahwa rokok merupakan salah satu faktor risiko utama kanker paru.
Berdasarkan seluruh analisis pada data gender dan identifikasi partai politik, dapat disimpulkan:
Kesimpulan akhir: Terdapat hubungan yang signifikan secara statistik antara gender dan identifikasi partai politik. Perempuan cenderung lebih banyak berafiliasi dengan Partai Democrat, sedangkan laki-laki memiliki distribusi yang lebih merata di antara ketiga kategori partai, dengan proporsi Republican dan Independent yang relatif lebih tinggi dibandingkan perempuan.
1. Agresti, A. (2013). Categorical data analysis (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/0471249688
2. Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied logistic regression (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/9781118548387
3. R Core Team. (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
4. Roerecke, M., Kaczorowski, J., Tobe, S. W., Gmel, G., Hasan, O. S. M., & Rehm, J. (2017). The effect of a reduction in alcohol consumption on blood pressure: A systematic review and meta-analysis. The Lancet Public Health, 2(2), e108–e120. https://doi.org/10.1016/S2468-2667(17)30003-8
5. Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern epidemiology (3rd ed.). Lippincott Williams & Wilkins.
6. Stokes, M. E., Davis, C. S., & Koch, G. G. (2012). Categorical data analysis using SAS (3rd ed.). SAS Institute.
7. World Health Organization. (2023). Hypertension: Key facts. https://www.who.int/news-room/fact-sheets/detail/hypertension
8. Agresti, A. (2018). An introduction to categorical data analysis (3rd ed.). John Wiley & Sons.
9. Kirkwood, B. R., & Sterne, J. A. C. (2003). Essential medical statistics (2nd ed.). Blackwell Science.
10. Altman, D. G. (1991). Practical statistics for medical research. Chapman & Hall.