Statistik modern dan machine learning sangat bergantung pada pemahaman mengenai ketergantungan antar variabel, baik secara langsung (independensi) maupun bersyarat (conditional independence). Dua konsep fundamental dalam konteks ini adalah Statistical Independence dan Conditional Independence. Pengukuran yang akurat terhadap dua konsep tersebut sangat penting dalam berbagai aplikasi seperti pemilihan variabel (variable selection), penemuan kausalitas (causal discovery), dan pembelajaran struktur (structure learning).
Pendekatan klasik dalam mengukur ketergantungan biasanya menggunakan koefisien korelasi Pearson, yang sangat terbatas pada hubungan linear dan distribusi Gaussian. Alternatif lainnya adalah Mutual Information (MI), yang merupakan pendekatan berbasis teori informasi dan mampu menangkap ketergantungan non-linear, namun memiliki keterbatasan dalam kasus multivariat dan sulit diestimasi secara nonparametrik.
Dalam makalah ini, Jian Ma memperkenalkan Copula Entropy (CE), sebuah konsep berbasis teori copula yang secara matematis ekuivalen dengan Mutual Information. CE menawarkan kelebihan karena bersifat: - Multivariat, - Simetris, - Non-negatif (dan hanya nol jika independen), - Invarian terhadap transformasi monoton.
Selain itu, makalah ini juga membahas Transfer Entropy (TE), yaitu metode untuk mengukur kausalitas sebagai bentuk conditional independence. Uniknya, TE dapat direpresentasikan menggunakan Copula Entropy, sehingga CE berperan sebagai kerangka kerja teoritis yang menyatukan pengukuran independensi dan kausalitas.
Untuk mengimplementasikan metode-metode ini, penulis mengembangkan
sebuah paket R bernama copent, yang
tersedia di CRAN dan GitHub. Paket ini menyediakan fungsi-fungsi untuk
mengestimasi CE dan TE secara nonparametrik,
menggunakan metode seperti empirical copula dan estimasi entropi
berbasis k-nearest neighbors (kNN).
Dalam review ini, kami akan membahas isi paper tersebut dengan menyoroti kontribusi teoritis, struktur algoritma, serta implementasi dalam R, dan kami akan mendemonstrasikan aplikasinya pada data simulasi maupun data nyata sebagaimana ditunjukkan dalam paper.
Makalah berjudul “copent: Estimating Copula Entropy and Transfer
Entropy in R” karya Jian Ma membahas metode nonparametrik untuk
mengukur independensi dan kausalitas statistik menggunakan pendekatan
Copula Entropy (CE) dan Transfer Entropy
(TE), serta memperkenalkan paket copent
dalam R yang mengimplementasikan metode tersebut.
copent sebagai
alat bantu praktis.Copula Entropy didefinisikan sebagai: \[ H_c(X) = -\int c(u) \log c(u) \, du \] dengan \(c(u)\) adalah kepadatan copula.
Mutual Information (MI) terbukti ekuivalen dengan nilai negatif dari CE: \[ I(X) = -H_c(X) \]
Transfer Entropy (TE) juga dapat direpresentasikan hanya menggunakan tiga istilah CE: \[ TE_{Y \to X} = -H_c(x_{t+1}, x_t, y_t) + H_c(x_{t+1}, x_t) + H_c(x_t, y_t) \]
copent:Paket ini menyediakan fungsi-fungsi berikut: -
construct_empirical_copula() – membuat empirik copula dari
data. - entknn() – mengestimasi entropi menggunakan kNN. -
copent() – fungsi utama untuk mengestimasi CE. -
ci() – menguji conditional independence. -
transent() – mengestimasi Transfer Entropy.
Copula Entropy menjadi pendekatan yang kokoh secara teori dan efisien
secara komputasi untuk mengukur hubungan ketergantungan dan kausalitas
dalam data multivariat. Implementasi dalam paket copent
memungkinkan pengguna R untuk menerapkan metode ini pada berbagai
aplikasi nyata tanpa memerlukan asumsi model yang ketat.
Makalah ini memperkenalkan pendekatan estimasi nonparametrik untuk
Copula Entropy (CE) dan Transfer Entropy (TE), yang telah
diimplementasikan ke dalam R melalui paket copent. Proses
estimasi dilakukan dalam dua langkah utama:
library(copent)
Dataset airquality berisi data kualitas udara harian di New York pada tahun 1973. Kita gunakan beberapa variabel numerik untuk mengestimasi CE.
# Memuat dataset
data("airquality")
# Mengambil empat kolom pertama
x1 <- airquality[, 1:4]
x1
# Estimasi Copula Entropy
ce_value <- copent(x1)
ce_value
## [1] 0.03305222
Nilai CE yang dihasilkan akan bernilai kecil jika variabel-variabel relatif independen, dan akan meningkat jika ada ketergantungan kuat antar variabel.
Kita juga bisa mensimulasikan data dari distribusi Gaussian bivariate dan membandingkan estimasi CE dengan nilai teoritis.
library(mnormt)
# Parameter korelasi
rho <- 0.75
sigma <- matrix(c(1, rho, rho, 1), 2, 2)
sigma
## [,1] [,2]
## [1,] 1.00 0.75
## [2,] 0.75 1.00
# Simulasi 500 data bivariate normal
x <- rmnorm(500, c(0, 0), sigma)
# Estimasi CE
copent(x)
## [1] 0.3407073
Transfer Entropy (TE) mengukur pengaruh kausal antara dua variabel
waktu, misalnya dari variabel Y ke X dengan jeda waktu tertentu (lag).
Dalam R, estimasi TE dapat dilakukan menggunakan fungsi
transent() dari paket copent.
# Simulasi data waktu sederhana
set.seed(123)
n <- 100
y <- rnorm(n)
# Buat lag dari y
lag_y <- c(0, y[1:(n - 1)])
# Gunakan lag_y untuk membuat x
x <- 0.8 * lag_y + rnorm(n, sd = 0.5)
x
## [1] -0.35520328 -0.31993866 -0.30748793 1.07319535 -0.41940257 0.08091633
## [7] 0.97959975 -0.46523800 -1.20216225 -0.08998398 -0.64420306 1.28324760
## [13] -0.52109029 0.29283618 0.34824977 -0.29409623 1.48236861 0.07792738
## [19] -1.99814590 0.04902033 -0.31940983 -1.32799627 -0.41965865 -0.94884965
## [25] 0.33881802 -0.82600637 -1.23166136 0.70921006 -0.35822982 -0.94616359
## [31] 1.72532737 0.56692340 -0.21544073 0.50485211 -0.32411682 1.22293347
## [37] -0.17940783 0.81310788 0.90502242 -0.96671671 0.04651537 -0.68686433
## [43] -0.95240590 -1.76965091 0.93439669 0.70091634 -1.62936466 0.02165052
## [49] 0.67673019 -0.01954314 0.32717417 0.58717593 0.14326389 -0.53848467
## [55] 1.03515552 -0.32081446 1.49467125 -1.42522162 0.95617769 -0.08820703
## [61] 0.69910899 -0.22087692 -1.03193638 1.35395406 -1.02328910 -0.70831919
## [67] 0.56110775 0.11667751 0.30083440 0.92229624 1.53237749 -0.36017842
## [73] -1.86436873 1.86881677 -0.93802866 -1.09840503 0.83935130 -0.07257803
## [79] -0.75831243 -0.08413988 -0.64277616 0.63620394 0.13339913 -0.72928446
## [85] 0.39736145 -0.27497720 0.82038572 0.91983986 0.72517209 -0.51039128
## [91] 1.02626875 0.63246013 0.48600933 -0.25669629 -1.15772563 2.08712865
## [97] -0.17985326 1.12423071 0.92050554 -0.78130033
copentPaket copent adalah implementasi dalam R dari metode
estimasi nonparametrik untuk Copula Entropy (CE) dan
Transfer Entropy (TE). Paket ini tersedia di CRAN dan
GitHub, serta ditulis dengan antarmuka yang sederhana namun efisien.
Tabel berikut merangkum lima fungsi utama dalam paket
copent:
| Fungsi | Deskripsi Singkat |
|---|---|
construct_empirical_copula(x) |
Mengestimasi empirical copula dari data x menggunakan
statistik urutan. |
entknn(x, k, dtype) |
Mengestimasi entropi dari data x menggunakan metode
k-nearest neighbors. |
copent(x, k, dtype) |
Fungsi utama estimasi Copula Entropy (gabungan dua fungsi di atas). |
ci(x, y, z, k, dtype) |
Menguji independensi bersyarat antara x dan
y dengan kondisi pada z. |
transent(x, y, lag, k, dtype) |
Mengestimasi Transfer Entropy dari y ke x
dengan jeda waktu lag. |
Catatan: Parameter
kadalah jumlah tetangga dalam metode kNN, dandtypeadalah tipe jarak (Euclidean atau maksimum).
Fungsi copent() merupakan pintu masuk utama untuk
pengguna, dengan alur sebagai berikut:
construct_empirical_copula(x) membangun copula empiris
dari data input x.entknn() untuk menghitung nilai entropi.Contoh:
library(copent)
data("airquality")
x1 <- airquality[, 1:4]
x1
# Estimasi CE
copent(x1)
## [1] 0.03305222
Fungsi ci() digunakan untuk menguji apakah dua variabel x dan y bersifat independen bersyarat terhadap z. Fungsi transent() digunakan untuk estimasi Transfer Entropy berdasarkan CE.
Contoh umum:
# Simulasi data waktu
set.seed(123)
n <- 100
y <- rnorm(n)
x <- 0.5 * c(0, y[1:(n-1)]) + rnorm(n, sd = 0.5)
# Estimasi Transfer Entropy dari y ke x
transent(x, y, lag = 1)
## [1] 0.2765854
mtcars)Untuk mendemonstrasikan penggunaan Copula Entropy
(CE) dalam pemilihan variabel, kita menggunakan dataset
mtcars yang tersedia secara default di R. Di sini kita
anggap bahwa variabel mpg (miles per gallon) adalah
target, dan kita ingin mengevaluasi seberapa kuat
hubungan (dependensi) antara mpg dengan variabel-variabel
lainnya.
# Muat library
library(copent)
# Tampilkan ringkasan
str(data)
## function (..., list = character(), package = NULL, lib.loc = NULL, verbose = getOption("verbose"),
## envir = .GlobalEnv, overwrite = TRUE)
# Gunakan dataset bawaan R
data <- mtcars
data
# Inisialisasi vektor hasil CE
ce_values <- numeric(ncol(data))
# Hitung CE antara setiap variabel dengan 'mpg'
for (i in 1:ncol(data)) {
if (colnames(data)[i] == "mpg") next
pair_data <- data[, c("mpg", colnames(data)[i])]
ce_values[i] <- copent(pair_data)
}
# Ubah menjadi data.frame
ce_df <- data.frame(
Variable = colnames(data),
CE = ce_values
)
# Hilangkan CE dari mpg dengan dirinya sendiri (kosong/tidak dihitung)
ce_df <- ce_df[ce_df$Variable != "mpg", ]
ce_df
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.2
ggplot(ce_df, aes(x = reorder(Variable, CE), y = CE)) +
geom_bar(stat = "identity", fill = "skyblue") +
coord_flip() +
labs(title = "Copula Entropy antara mpg dan Variabel Lain",
x = "Variabel",
y = "Nilai Copula Entropy")
Nilai Copula Entropy (CE) yang lebih tinggi menunjukkan hubungan ketergantungan yang lebih kuat antara variabel tersebut dengan target (mpg). Misalnya, jika wt (berat mobil) atau hp (horsepower) memiliki nilai CE yang tinggi, maka mereka adalah kandidat variabel penting untuk digunakan dalam model regresi atau prediksi konsumsi bahan bakar.
Dalam paper aslinya, penulis mengaplikasikan Transfer Entropy
(TE) untuk menguji hubungan kausal antara tekanan
udara (pressure) dan PM2.5
(partikulat polusi udara) menggunakan data harian dari Beijing. Transfer
Entropy digunakan untuk mendeteksi arah pengaruh: apakah
pressure memengaruhi PM2.5, atau
sebaliknya.
Karena dataset asli tidak tersedia langsung, kita buat simulasi data waktu yang meniru pola hubungan tersebut.
set.seed(123)
n <- 200
# pressure sebagai penyebab
pressure <- arima.sim(n = n, list(ar = 0.8), sd = 1)
# pm25 dipengaruhi oleh tekanan udara masa lalu + noise
pm25 <- 0.5 * c(NA, head(pressure, -1)) + rnorm(n, sd = 0.7)
# hilangkan NA awal
pressure <- pressure[-1]
pm25 <- pm25[-1]
pressure
## [1] -0.62123535 -0.07052406 -0.35149073 0.61393308 1.36927995 1.91700504
## [7] 2.22224429 2.33171308 1.80345876 1.13680434 0.52897247 -0.27152900
## [13] -0.42514048 -1.60550874 0.88454898 1.91560118 0.40937236 -0.07538695
## [19] -0.52696491 0.35839319 0.20334549 0.41599490 0.30424917 0.20052888
## [25] 1.52902538 0.99744932 2.31443006 0.30279125 0.82684675 0.78533164
## [31] 0.84420688 1.05500499 0.34168054 -0.05986295 -1.06646575 -1.92496382
## [37] -1.23644242 -0.54094416 -0.37975110 0.61846659 2.54485796 1.54485520
## [43] -1.07328472 0.14711075 -0.59151216 -1.16121835 0.09659669 -0.20749565
## [49] -1.38671423 -0.92806791 -0.88134569 -0.69931236 -0.17416949 -0.50999562
## [55] 0.23638005 -0.03138252 0.30667595 1.34217977 1.50892531 0.88120866
## [61] 1.85377455 2.47652349 2.52961575 2.26242434 1.18203339 2.30627916
## [67] 1.24476374 3.18314399 4.07912582 3.02760029 1.39565934 0.40612090
## [73] 0.58178043 0.21873247 -0.17255663 -1.08966387 -0.91675882 -1.51831152
## [79] -2.88259116 -2.68629945 -1.23004295 -1.55938132 -0.63954073 -2.12951530
## [85] -1.75917420 -0.88793216 -0.40919236 -0.22167770 -0.81804817 -1.50414288
## [91] -2.22744309 -1.66430788 -2.27892092 -2.31369418 -2.10704753 0.15822398
## [97] -0.52537072 -0.18491000 -0.06996715 -1.01783036 -0.88557237 0.73609296
## [103] 1.04037842 0.87353566 0.27633170 -1.83218187 -0.33440828 -1.72816669
## [109] -0.64258584 1.39503489 -0.32786525 0.43949214 0.08939622 -1.50062718
## [115] -2.71516940 -3.77367169 -3.54984388 -4.30163069 -2.75338778 -0.10260128
## [121] -1.36911150 -0.30755035 0.52300196 0.75060415 -0.40789329 -0.44576724
## [127] -0.63700913 0.05338223 -0.32973297 0.71318701 0.19596875 1.20948647
## [133] -0.08158783 -1.32542551 2.18069953 1.32770203 1.36038922 1.72488105
## [139] 0.89612421 1.23376141 1.35597366 0.86939842 0.76081177 0.57458216
## [145] 2.58811763 1.32915801 -0.03266986 0.01165251 0.31980276 0.69236568
## [151] 0.09552721 -0.98690436 0.47366169 0.02927896 -0.84208969 -0.90995132
## [157] -0.92513695 0.36981073 0.38058587 1.05852248 0.34752597 0.49246609
## [163] 0.06928696 0.15001309 -0.77535288 -1.93108384 0.45234631 0.96258587
## [169] -0.48120266 -0.99612805 -1.98238252 0.61290433 1.80273644 1.17704410
## [175] 1.48482934 0.77352352 0.14257192 -0.67454530 -1.13425351 0.74350466
## [181] 0.54077560 0.55186572 0.68518001 1.78061988 0.90843208 -0.26576149
## [187] 1.46308774 0.72930698 -0.13962039 -1.34796943 -2.36309127 -2.46444649
## [193] -1.35357138 0.02699104 0.72918118 0.21968765 0.23550006 -0.51619642
## [199] -1.13017530
pm25
## [1] -1.882821227 1.058088099 -0.098485747 -0.025568187 -0.210002856
## [6] 0.282567891 0.036591227 0.983074371 1.459144225 1.128742419
## [11] 0.021326629 -0.287549144 -0.487303604 0.834672229 -1.598866902
## [16] 0.316938373 2.289453865 0.134003761 -0.989581966 -0.728821060
## [21] 0.519018580 -0.161249268 -0.185316003 -0.088617481 0.163612091
## [26] 1.883468832 0.436729083 1.913774678 0.592923504 0.333875446
## [31] -0.680365582 0.057321318 0.184593177 0.203848371 0.880207597
## [36] 1.071922409 0.120824830 -0.711426884 -1.500041255 -0.462021454
## [41] 0.371678351 1.863938082 1.446197178 -0.057625757 -0.903136669
## [46] 0.298994051 -0.893199224 0.170660237 -0.051562002 -0.393640382
## [51] -0.446761466 -1.607905413 0.165890993 0.183133852 -0.440953950
## [56] 0.200891182 0.078135790 0.308051601 1.819682201 0.601127388
## [61] 0.558250099 1.744755984 1.976188463 2.066492054 0.726984568
## [66] 1.992754608 1.199830192 1.929178163 0.645940114 2.054251419
## [71] 2.388740347 0.197160137 -0.323821826 -0.366086876 -0.627393062
## [76] -0.392289986 -0.313006513 -1.868326758 -0.610769459 -0.575623046
## [81] 0.083152090 0.295801721 -0.249948325 -1.528481646 -1.485812343
## [86] -1.126019621 0.048500653 -0.278566116 -0.991892888 0.770080913
## [91] -0.114097535 -0.947520356 0.020522088 -2.076602459 -0.694272880
## [96] -1.419562430 0.557733854 -0.305260728 0.350617498 0.899878754
## [101] -0.503812115 0.269504860 -0.463857344 0.015066103 1.500220228
## [106] 0.402337429 -2.352646907 -1.122030356 -1.004630058 0.284752661
## [111] 0.626199168 0.272998607 0.891049834 1.214436491 -0.711101878
## [116] -1.393972034 -3.114101998 -1.705392622 -2.551110384 -2.058500596
## [121] -0.177235002 0.025904471 -1.548699118 -0.037594522 0.456948172
## [126] -0.829191945 0.010848440 -0.030503619 0.003565804 -1.890995221
## [131] 2.156614207 -0.045725105 1.060578530 0.150842627 0.054558508
## [136] 1.662711375 0.516995796 0.944912049 0.200654342 1.047908214
## [141] 0.294153870 2.369728177 -0.721035017 0.055614814 0.865056985
## [146] 1.651151597 0.251942276 -0.714081451 0.106959248 0.149886189
## [151] -0.907014024 0.071949354 -0.360290960 0.359139321 -0.723872449
## [156] -0.087751552 0.510023434 -0.143202994 -0.610006566 -0.114658892
## [161] 0.771533776 -0.279168957 -1.264119392 0.653619053 -0.505627781
## [166] -0.789168631 0.087188506 -0.315728294 1.073305015 -1.123079346
## [171] -0.746243705 -1.042680474 -0.511603831 0.457044435 0.568332961
## [176] 1.211901846 -0.768620820 -0.173542006 0.192211857 -0.944293166
## [181] 0.530856676 0.614947801 0.463417371 0.799870378 0.804413879
## [186] 0.164642478 -1.983085012 0.666485157 0.665852775 0.304968994
## [191] -1.062679561 0.064106403 -1.031726153 -0.588364588 0.904082264
## [196] -0.138335763 -0.205393212 1.795966765 -0.250307778
library(copent)
# Estimasi TE dari pressure → pm25
te_p_to_pm <- transent(pm25, pressure, lag = 1)
# Estimasi TE dari pm25 → pressure
te_pm_to_p <- transent(pressure, pm25, lag = 1)
# Tampilkan hasil
cat("TE (pressure → PM2.5):", te_p_to_pm, "\n")
## TE (pressure → PM2.5): 0.2632761
cat("TE (PM2.5 → pressure):", te_pm_to_p, "\n")
## TE (PM2.5 → pressure): -0.04164244
df <- data.frame(
time = 1:length(pressure),
pressure = pressure,
pm25 = pm25
)
library(ggplot2)
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.2
df_long <- pivot_longer(df, cols = c("pressure", "pm25"))
ggplot(df_long, aes(x = time, y = value, color = name)) +
geom_line() +
labs(title = "Simulasi Time Series: Pressure dan PM2.5",
x = "Waktu",
y = "Nilai",
color = "Variabel") +
theme_minimal()
Berdasarkan nilai Transfer Entropy (TE) yang diestimasi: - Jika TE(pressure → PM2.5) > TE(PM2.5 → pressure), maka tekanan udara memiliki pengaruh informasi lebih kuat terhadap kadar PM2.5 di masa depan. - Hasil ini selaras dengan pengetahuan domain bahwa kondisi atmosfer (tekanan) bisa berdampak pada dispersi partikel udara. -Dalam simulasi kita, nilai TE mengindikasikan bahwa pengaruh tekanan udara terhadap PM2.5 lebih signifikan, mendukung hipotesis kausalitas satu arah seperti yang juga ditemukan dalam studi asli oleh Jian Ma.
Paper “copent: Estimating Copula Entropy and Transfer Entropy in R” oleh Jian Ma menyajikan pendekatan inovatif untuk mengukur ketergantungan statistik dan kausalitas antar variabel menggunakan konsep Copula Entropy (CE) dan Transfer Entropy (TE). Konsep-konsep ini didasarkan pada teori copula dan informasi, yang mampu menangkap hubungan non-linear dan multivariat secara nonparametrik.
Melalui implementasi dalam paket R
copent, penulis berhasil menyediakan alat yang
praktis, efisien, dan fleksibel untuk berbagai keperluan, seperti: -
Seleksi variabel dengan dasar ketergantungan murni
(tanpa model prediktif), - Deteksi kausalitas antar
variabel waktu, - Analisis independensi bersyarat.
Dalam proyek ini, kami: - Menggunakan copent untuk
mengestimasi CE dari data mtcars sebagai simulasi pemilihan
fitur, - Menyimulasikan Transfer Entropy antara tekanan udara dan PM2.5,
- Mereplikasi alur estimasi CE dengan contoh yang dapat dijalankan
langsung.
Pendekatan berbasis CE dan TE ini sangat layak digunakan dalam berbagai studi data science, machine learning, hingga ekonomi dan epidemiologi, terutama saat hubungan antar variabel bersifat non-linear atau tidak diketahui bentuknya secara eksplisit.