Package adalah kumpulan fungsi R, data, dan kode yang dikompilasi dalam format yang terdefinisi dengan baik. Direktori tempat penyimpanan paket disebut library.
Untuk dapat mengikuti materi ini, peserta diharapkan sudah menginstall beberapa packages di bawah ini. Apabila package tersebut belum terinstall, silahkan melakukan instalasi package dengan copy dan jalankan code berikut pada bagian console
install.packages(c(“knitr”, “rmarkdown”, “dplyr”,“tidyr”,“lubridate”, “ggcorplot”, “ggplot2”, “gplots”, “foreign”, “plotly”,“plm”,“lfe”,“lmtest”,“car”,“tseries”,“MLmetrics”))
Apabila package sudah terinstall, silahkan jalankan code dibawah ini untuk mengaktifkan package-package yang akan digunakan pada materi ini.
#Packages untuk pengolahan dataframe
library(dplyr)
library(tidyr)
library(lubridate)
#Packages untuk membuat visualisasi
library(ggcorrplot)
library(gplots)
library(ggplot2)
library(plotly)
library(foreign)
#Packages untuk melakukan analisis
library(plm)
library(lfe)
library(lmtest)
library(car)
library(tseries)
library(MLmetrics)Data panel merupakan gabungan data cross section dan time series (runtun/ deret waktu). Dengan kata lain, data panel merupakan data dari beberapa individu sama yang diamati dalam kurun waktu tertentu. Terkadang data pane
contoh data panel”
1. Keuntungan Data Panel
Data panel yang menggabungkan data data cross section dan time series, memiliki beberapa keunggulan dibandingkan data cross-sectional saja atau data deret waktu saja, antara lain:
Mendapatkan sampel yang besar sehingga lebih banyak informasi dan lebih sedikit multikolinieritas di antara variabel-variabel sehingga meningkatkan efisiensi estimasi ekonometrika
Model yang dapat diinterpretasikan, kita dapat menginterpretasikan koefisien regresi dalam kerangka efek cross-section dan time-series.
2. Struktur Data Panel
Data panel memiliki tiga jenis data, yaitu cross section, pooled cross section, dan panel.
Data cross sectional adalah jenis data yang dikumpulkan dengan mengamati banyak subjek pada satu titik atau periode waktu.
Pooled Cross sectional adalah jenis data yang mengamati satu subjek pada banyak titik atau periode waktu.
Panel data adalah jenis data yang mengamati banyak subjek pada banyak titik atau periode waktu.
Jika jumlah unit waktu sama untuk setiap individu, maka data disebut balanced panel. Jika sebaliknya, yakni jumlah unit waktu berbeda untuk setiap individu, maka disebut unbalanced panel
3. Model Data Panel
Jika kita memiliki T periode waktu (t = 1, 2, …, T) dan N jumlah individu (i = 1, 2, …, N), maka dengan data panel kita akan memiliki total unit observasi sebanyak NT.
\[y_{it} = \beta_0+\beta _{1t}*x_{1t}+u_{it}\] Dimana:
berdasarkan model tersebut indeks i menjadi dimensi
untuk cross sectional dan indeks t menjadi dimensi untuk
deret waktu. Sedangkan \(u_{it}\)
adalah nilai yang menunjukkan heterogenitas antar cross sectional dan
deret waktu di dalam mode, yang didefinisikan sebagai berikut:
\[u_{it} = \mu _i+\lambda _t+\upsilon _{it}\] dimana:
Dua komponen pertama \(\mu _i\) dan \(\lambda _t\) disebut juga sebagai within component sedangkan komponen terakhir \(\upsilon _{it}\) merupakan panel or between component
Terdapat tiga pendekatan yang digunakan dalam model panel yaitu Common/ Polled Effects, Fixed Effects dan Random Effects.
1. Model Common/ Pooled Effects (CEM)
Model gabungan atau common effect model (CEM) atau pooled least
square (PLS) merupakan pendekatan model data panel yang sederhana karena
mengkombinasikan data time series dan cross section, tanpa memperhatikan
pengaruh spesifik waktu maupun individu. Koefisien regresi (intersep
ataupun kemiringan) diasumsikan konstan antar individu dan waktu. Metode
ini bisa menggunakan pendekatan ordinary least square (OLS) atau metode
kuadrat terkecil (MKT) untuk mengestimasi model data panel. Untuk
membuat model CEM di R dapat menggunakan fungsi plm() dari
package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “pooling”2. Fixed Effects
Model pengaruh tetap atau fixed effect model (FEM) merupakan model
yang mengasumsikan antara unit individu atau waktu memiliki perilaku
yang berbeda, terlihat dari nilai intersep yang berbeda untuk setiap
unit individu atau waktu, tetapi konstan pada nilai koefisien kemiringan
dan koefisien regresi antara unit individu maupun waktu (Gujarati dan
Porter 2009). Pendugaan parameter model pengaruh tetap dapat menggunakan
Metode Kuadrat Terkecil Peubah Boneka (least square dummy variable) dan
MKT. Untuk membuat model CEM di R dapat menggunakan fungsi
plm() dari package plm dengan parameter sebagai
berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “within”3. Random Effects
Menurut Baltagi (2011), model pengaruh acak atau random effect model
digunakan ketika individu amatan mengikuti kaidah pengacakan dari
sejumlah populasi yang besar sehingga pengaruh pada setiap individu
bersifat acak. Pendugaan parameter pada model pengaruh acak yaitu dengan
metode kuadrat terkecil terampat (generalized least square). Model ini
memiliki asumsi bahwa tidak ada korelasi antara pengaruh spesifik
individu dan pengaruh spesifik waktu dengan peubah bebas sehingga
komponen sisaan dari kedua pengaruh spesifik dimasukkan ke dalam model.
Untuk membuat model CEM di R dapat menggunakan fungsi plm()
dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “random”Untuk memilih model mana yang terbaik dari ketiga model diatas, perlu dilakukan pengujian hipotesis berikut ini:
Uji Chow
Menurut Ghozali dan Ratmono (2013), uji chow digunakan untuk memilih
pendekatan yang lebih baik antara model gabungan dengan model pengaruh
tetap. Untuk melakukan uji Chow dapat menggunakan fungsi
pooltest(model_cem, model_fem), dengan hipotesis yang
diujikan adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.
Uji Hausman
Uji spesifikasi Hausman membandingkan model pengaruh tetap dan model
pengaruh acak. Jika hipotesis nol yang menyatakan tidak ada korelasi
antara pengaruh individu dengan regresor tidak ditolak, model pengaruh
random disarankan daripada pengaruh tetap (Susanti 2013). Untuk
melakukan uji Chow di R dapat menggunakan fungsi
phtest(model_rem, model_fem), dengan Hipotesis yang diuji
adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.
Pengujian Lanjutan
Apabila model gabungan atau model pengaruh acak yang terpilih sebagai model terbaik, perlu dilakukan uji lanjutan untuk memeriksa apakah model dipengaruhi oleh individu/waktu/individu & waktu. Untuk memeriksa pengaruh tersebut digunakan Uji Lagrange Multiplier.
Di R untuk melakukan Uji Lagrange Multiplier dapat dilakukan dengan
menggunakan fungsi plmtest() dari package plm
dengan parameter:
"bp" , menggunakan Breusch Pagan test"time" : untuk menguji pengaruh waktu"individual" : untuk menguji pengaruh individu"twoways" : untuk menguji pengaruh individu &
waktuberikut hipotesis pengujian untuk pemeriksaan setiap pengaruh:
Pemeriksaan Pengaruh Individu & Waktu
Hipotesis yang diuji adalah sebagai berikut.
Pemeriksaan Pengaruh Individu
Hipotesis yang diuji adalah sebagai berikut.
Pemeriksaan Pengaruh Waktu
Hipotesis yang diuji adalah sebagai berikut.
dengan ketentuan untuk ketiga hipotesis adalah H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
dikarenakan analisis data panel menggunakan konsep regresi dan time series maka ada beberapa Asumsi yang perlu dipenuhi sebagai berikut:
Asumsi model linear regression:
Asumsi Time Series:
Note: Pengujian Asumsi hanya perlu dilakukan untuk model yang akan digunakan
1. Pemeriksaan Multikolinieritas
Multicollinearity adalah kondisi adanya korelasi antar
prediktor yang kuat. Hal ini tidak diinginkan karena menandakan
prediktor redundan pada model, yang seharusnya dapat dipilih salah satu
saja dari variable yang hubungannya amat kuat tersebut. Harapannya
tidak terjadi multicollinearity. Pemeriksaan
Multikolinieritas bisa dilakukan dengan menggunakan fungsi fungsi
vif(), dengan ketentuan
Note: Pemeriksaan asumsi multikolinieritas bisa
dilakukan diawal sebelum dilakukan pemodelan data panel, dengan cara
terlebih dahulu dilakukan pembuatan model regresi dengan fungsi
lm() dan akan diujikan menggunakan fungsi
vif().
2. Pengujian Asumsi Normalitas Residual
Model diharapkan menghasilkan error yang berdistribusi
normal. Dengan begitu, error lebih banyak berkumpul di sekitar
angka nol. Pengujian asumsi normalitas di R dapat dilakukan dengan
menggunakan fungsi shapiro.test(). dengan hipotesis yang
diujikan adalah sebagai berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
3. Pengujian Asumsi Homogenitas Residual
Diharapkan error yang dihasilkan oleh model menyebar secara acak atau
dapat dikatakan variasi konstan. Pengujian asumsi
Homogenitas di R dapat dilakukan dengan menggunakan fungsi
bptest(), dengan hipotesis yang diujikan adalah sebagai
berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
4. Pengujian Asumsi Autokorelasi
Untuk mengecek ada/tidaknya bisa menggunakan uji Ljung-box dengan
menggunakan fungsi
Box.test(residual model, type = "Ljung-Box), dengan
hipotesis yang diujikan adalah sebagai berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
Analisis data panel di R dapat dilakukan dengan mengikuti alur kerja
berikut ini:
Asia Tenggara adalah wilayah yang kaya akan keragaman budaya, ekonomi, dan sosial. Negara-negara di kawasan ini telah mengalami perkembangan yang signifikan selama beberapa tahun terakhir, dengan perubahan ekonomi, demografis, dan politik yang berdampak pada kualitas hidup penduduk. Studi mengenai tingkat kebahagiaan di negara-negara Asia Tenggara menjadi semakin relevan seiring dengan pergeseran fokus dari pertumbuhan ekonomi semata menuju peningkatan kesejahteraan dan kualitas hidup. Dalam kerangka ini, analisis regresi data panel dapat memberikan wawasan mendalam tentang bagaimana berbagai faktor memengaruhi kebahagiaan di kawasan ini, dengan mempertimbangkan perbedaan antar negara serta evolusi hubungan tersebut dari waktu ke waktu, sejalan dengan indikator-indikator yang dipantau dalam World Happiness Report.
Sebagai data scientis kita diminta untuk menganalisis tingkat kebahagiaan beberapa negara di asia tenggara berdasarkan informasi socio demografi yang tersedia pada World Happiness Report.
Untuk menganalisis tingkat kebahagiaan beberapa negara di asia tenggara menggunakan data yang diperoleh dari World Happiness Report 2023 yang dipublish melalui kaggle oleh USAMA BUTTAR.
Berikut adalah beberapa informasi dari setiap kolom:
Country.Name : Informasi nama negaraRegional.Indicator : Informasi regional negaraYear : tahunLife.Ladder : tingkat kebahagiaan [1-10]Log.GDP.Per.Capita : Log Gross Domestic Product per
orang di suatu negaraSocial.Support : memiliki seseorang yang dapat
diandalkan di saat-saat sulit.Healthy.Life.Expectancy.At.Birth :Freedom.To.Make.Life.Choices : kebebasan untuk
menentukan pilihan [0-1]Generosity : seberapa sering seseorang mengeluarkan
uang untuk donasi perbulanPerceptions.Of.Corruption : Persepsi terhadap korupsi
[0-1]Positive.Affect : rata-rata ukuran efek hari sebelumnya
untuk tawa, kesenangan, dan interestNegative.Affect : rata-rata dari ukuran efek hari
sebelumnya untuk kekhawatiran, kesedihan, dan kemarahanConfidence.In.National.Goverment : seberapa percaya
terhadap pemerintahanPada tahapan preparasi data ini akan dilakukan beberapa hal berikut:
# 1. import dataset
df <- read.csv("data_input/World_Happiness_Report.csv")
# 2. mengambil data wilayah asia tenggara dan membuang kolom regional indikator
df_asia <- df %>% filter(Regional.Indicator == "East Asia") %>% select(-Regional.Indicator)
head(df_asia)Untuk memeriksa apakah dta kita sudah balance dapat kita gunakan 2 cara yakni:
1. Melihat frekuensi data berdasarkan index individu
#>
#> China Hong Kong S.A.R. of China Japan
#> 16 12 17
#> Mongolia South Korea Taiwan Province of China
#> 15 17 15
Result : Kita akan membuang data
Hong Kong S.A.R. of China karena jumlah datanya 12 sangat
jauh dengan data yang paling banyak = 17.
2. Menggunakan fungsi is.pbalanced()
Untuk melakukannya dapat kita gunakan fungsi
is.pbalanced() dengan catatan data dalam format
pdata.frame. Apabila data belum dalam format pdata.frame, kita dapat
menambahkan parameter
index("kolom individu", "kolom waktu"). Hasil yang
diharapkan dari pemeriksaannya adalah TRUE yang artinya data
panel sudah seimbang.
#> [1] FALSE
Dari hasil pemeriksaan frekuensi dan balancing data diatas terlihat bahwa:
df_asia <- df_asia %>% filter(Country.Name %in% c("China","Japan","Mongolia","South Korea","Taiwan Province of China"))1. Membuat Panel Data Frame
Agar data kita dapat melakukan balancing, kita perlu mengubah format
data yang kita miliki menjadi sebuah panel data frame terlebih dahulu.
Untuk memembuat panel data frame dapat kita lakukan dengan fungsi
pdata.frame() dengan parameter:
data : data yang akan digunakanindex : c(“informasi individu”,“informasi waktu”)#membuat pdata.frame
df_asia <- df_asia %>% pdata.frame(index=c("Country.Name","Year"))
#memeriksa struktur data
glimpse(df_asia)#> Rows: 80
#> Columns: 12
#> $ Country.Name <fct> China, China, China, China, China, C…
#> $ Year <fct> 2006, 2007, 2008, 2009, 2010, 2011, …
#> $ Life.Ladder <pseries> 4.560495, 4.862862, 4.846295, 4.…
#> $ Log.GDP.Per.Capita <pseries> 8.696139, 8.823968, 8.910974, 8.…
#> $ Social.Support <pseries> 0.7470113, 0.8108524, 0.7482873,…
#> $ Healthy.Life.Expectancy.At.Birth <pseries> 65.660, 65.920, 66.180, 66.440, …
#> $ Freedom.To.Make.Life.Choices <pseries> NA, NA, 0.8530720, 0.7711433, 0.…
#> $ Generosity <pseries> NA, -0.17888285, -0.09518377, -0…
#> $ Perceptions.Of.Corruption <pseries> NA, NA, NA, NA, NA, NA, NA, NA, …
#> $ Positive.Affect <pseries> 0.6576588, 0.6639774, 0.7051333,…
#> $ Negative.Affect <pseries> 0.1695804, 0.1586135, 0.1469630,…
#> $ Confidence.In.National.Government <pseries> NA, NA, NA, NA, NA, NA, NA, NA, …
Dengan pengubahan tipe data menjadi pdata.frame akan otomatis mengubah type data dari setiap kolom,
2. Mememeriksa Dimensi Data
untuk memeriksa dimendi data panel dapat kita gunakan fungsi
pdim()
#> Unbalanced Panel: n = 5, T = 15-17, N = 80
dari pemeriksaan dimensi data panel diatas dapat kita ketahui bahwa:
Apabila data panel yang kita miliki tidak balance kita dapat
melakukan balancing menggunakan fungsi make.pbalanced
dengan parameter balance.type yang dapat diisi dengan 3
opsi berikut:
fill : untuk setiap kolom waktu yg hilang akan
diberikan nilai NAshared.times : akan diambil keseluruhan individu dgn
ketentuan informasi waktu terdapat di semua individushared.individuals : akan individu dengan ketentuan
informasi waktu lengkap1. Balancing menggunakan fill
# Your Code Here
balance1 <- df_asia %>% make.pbalanced(balance.type = "fill")
table(balance1$Country.Name)#>
#> China Japan Mongolia
#> 18 18 18
#> South Korea Taiwan Province of China
#> 18 18
2. Balancing menggunakan shared.times
# Your Code Here
balance2 <- df_asia %>% make.pbalanced(balance.type = "shared.times")
table(balance2$Country.Name)#>
#> China Japan Mongolia
#> 13 13 13
#> South Korea Taiwan Province of China
#> 13 13
3. Balancing menggunakan shared.individuals
# Your Code Here
balance3 <- df_asia %>% make.pbalanced(balance.type = "shared.individuals")
table(balance3$Country.Name)#>
#> China Japan Mongolia
#> 0 0 0
#> South Korea Taiwan Province of China
#> 0 0
Berdasarkan kondisi data yang dimiliki, kita akan menggunakan data
hasil balancing dengan metode fill untuk mendapatkan
informasi paling optimal yang akan tersimpan pada objek bernama
balance1.
#> [1] TRUE
#> Balanced Panel: n = 5, T = 18, N = 90
sebelum kita periksa kelengkapan data kita perlu mengetahui berapa banyak informasi waktu yang ditambahkan dari tahapan sebelumnya
#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 10 10
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 10 10
#> Freedom.To.Make.Life.Choices Generosity
#> 10 10
#> Perceptions.Of.Corruption Positive.Affect
#> 10 10
#> Negative.Affect Confidence.In.National.Government
#> 10 10
berdasarkan pemeriksaan diatas dapat diketahui bahwa dari data df_asia ketika dilakukan balancing terjadi penambahan 10 baris nilai NA untuk setiap kolom.
Tahap selanjutnya adalah memeriksa kelengkapan data hasil balancing
#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 10 13
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 10 22
#> Freedom.To.Make.Life.Choices Generosity
#> 15 17
#> Perceptions.Of.Corruption Positive.Affect
#> 26 10
#> Negative.Affect Confidence.In.National.Government
#> 10 30
Berdasarkan hasil pemeriksaan diatas kita melihat secara keseluruhan terdapat cukup banyak kolom yang memiliki nilai missing
Healthy.Life.Expectancy.At.Birth,Perceptions.Of.Corruption,Confidence.In.National.Government
yang memiliki nilai na > 20balance1 <- balance1%>%select(-Confidence.In.National.Government,-Healthy.Life.Expectancy.At.Birth,-Perceptions.Of.Corruption)Untuk pemeriksaan dan melakukan pengisian nilai yang hilang maka akan dilakukan dengan cara interpolasi secara terpisah untuk setiap negara.
1. China
# periksa nilai missing per negara
chn <- balance1 %>% filter(Country.Name=="China")
colSums((is.na(chn))) #> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 2 2
#> Social.Support Freedom.To.Make.Life.Choices
#> 2 7
#> Generosity Positive.Affect
#> 3 2
#> Negative.Affect
#> 2
insight: Freedom.To.Make.Life.Choices memiliki nilai na
paling banyak = 7
untuk mengisi nilai yang hilang dengan nilai rata-rata dari nilai
yang dekat dengan nilai missing menggunakan fungsi
na.fill() dengan fill = "extend"
# mengisi nilai missing
chn <- chn %>% mutate(Life.Ladder=na.fill(Life.Ladder,fill="extend"),
Log.GDP.Per.Capita =na.fill(Log.GDP.Per.Capita,fill="extend"),
Social.Support=na.fill(Social.Support,fill="extend"),
Freedom.To.Make.Life.Choices=na.fill(Freedom.To.Make.Life.Choices,fill="extend"),
Generosity=na.fill(Generosity,fill="extend"),
Positive.Affect=na.fill(Positive.Affect,fill="extend"),
Negative.Affect=na.fill(Negative.Affect,fill="extend")
)
anyNA(chn)#> [1] FALSE
2. Japan
# periksa nilai missing per negara
jpn <- balance1 %>% filter(Country.Name=="Japan")
colSums((is.na(jpn))) #> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Freedom.To.Make.Life.Choices
#> 1 1
#> Generosity Positive.Affect
#> 3 1
#> Negative.Affect
#> 1
insight: Generossity memiliki nilai na paling banyak =
3
# mengisi nilai missing
jpn <- jpn %>% mutate(Life.Ladder=na.fill(Life.Ladder,fill="extend"),
Log.GDP.Per.Capita =na.fill(Log.GDP.Per.Capita,fill="extend"),
Social.Support=na.fill(Social.Support,fill="extend"),
Freedom.To.Make.Life.Choices=na.fill(Freedom.To.Make.Life.Choices,fill="extend"),
Generosity=na.fill(Generosity,fill="extend"),
Positive.Affect=na.fill(Positive.Affect,fill="extend"),
Negative.Affect=na.fill(Negative.Affect,fill="extend")
)
anyNA(jpn)#> [1] FALSE
3. Mongolia
# periksa nilai missing per negara
mon <- balance1 %>% filter(Country.Name == "Mongolia")
colSums(is.na(mon))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 3
#> Social.Support Freedom.To.Make.Life.Choices
#> 3 3
#> Generosity Positive.Affect
#> 3 3
#> Negative.Affect
#> 3
insight: Mongolia memiliki nilai na sama untuk semua field = 3
# mengisi nilai missing
mon <- mon %>% mutate(Life.Ladder=na.fill(Life.Ladder,fill="extend"),
Log.GDP.Per.Capita =na.fill(Log.GDP.Per.Capita,fill="extend"),
Social.Support=na.fill(Social.Support,fill="extend"),
Freedom.To.Make.Life.Choices=na.fill(Freedom.To.Make.Life.Choices,fill="extend"),
Generosity=na.fill(Generosity,fill="extend"),
Positive.Affect=na.fill(Positive.Affect,fill="extend"),
Negative.Affect=na.fill(Negative.Affect,fill="extend")
)
anyNA(mon)#> [1] FALSE
4. South Korea
# periksa nilai missing per negara
skr <- balance1 %>% filter(Country.Name == "South Korea")
colSums(is.na(skr))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Freedom.To.Make.Life.Choices
#> 1 1
#> Generosity Positive.Affect
#> 2 1
#> Negative.Affect
#> 1
insight : Generossity memiliki nilai na paling banyak =
2
# mengisi nilai missing
skr <- skr %>% mutate(Life.Ladder=na.fill(Life.Ladder,fill="extend"),
Log.GDP.Per.Capita =na.fill(Log.GDP.Per.Capita,fill="extend"),
Social.Support=na.fill(Social.Support,fill="extend"),
Freedom.To.Make.Life.Choices=na.fill(Freedom.To.Make.Life.Choices,fill="extend"),
Generosity=na.fill(Generosity,fill="extend"),
Positive.Affect=na.fill(Positive.Affect,fill="extend"),
Negative.Affect=na.fill(Negative.Affect,fill="extend")
)
anyNA(skr)#> [1] FALSE
5. Taiwan Province of China
# periksa nilai missing per negara
tw <- balance1 %>% filter(Country.Name == "Taiwan Province of China")
colSums(is.na(tw))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 6
#> Social.Support Freedom.To.Make.Life.Choices
#> 3 3
#> Generosity Positive.Affect
#> 6 3
#> Negative.Affect
#> 3
insight: Generossity dan Log.GDP.Per.Capita
memiliki nilai na paling banyak = 6
#mengisi nilai missing
tw <- tw %>% mutate(Life.Ladder=na.fill(Life.Ladder,fill="extend"),
Log.GDP.Per.Capita =na.fill(Log.GDP.Per.Capita,fill="extend"),
Social.Support=na.fill(Social.Support,fill="extend"),
Freedom.To.Make.Life.Choices=na.fill(Freedom.To.Make.Life.Choices,fill="extend"),
Generosity=na.fill(Generosity,fill="extend"),
Positive.Affect=na.fill(Positive.Affect,fill="extend"),
Negative.Affect=na.fill(Negative.Affect,fill="extend")
)
anyNA(tw)#> [1] FALSE
insight: …
Setelah semua negara tidak lagi terdapat nilai yang missing, selanjutnya kita akan gabungkan kembali dan akan disimpan pada objek dengan nama balanced2
Pemeriksaan Kembali keseimbangan data
#> Balanced Panel: n = 5, T = 18, N = 90
Pemeriksaan Kembali kelengkapan data
#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 0 0
#> Social.Support Freedom.To.Make.Life.Choices
#> 0 0
#> Generosity Positive.Affect
#> 0 0
#> Negative.Affect
#> 0
Data telah siap untuk digunakan pada tahapan selanjutnya
#> Country.Name Year Life.Ladder Log.GDP.Per.Capita
#> China :18 2005 : 5 Min. :4.454 Min. : 8.696
#> Japan :18 2006 : 5 1st Qu.:5.157 1st Qu.: 9.365
#> Mongolia :18 2007 : 5 Median :5.854 Median :10.513
#> South Korea :18 2008 : 5 Mean :5.671 Mean :10.058
#> Taiwan Province of China:18 2009 : 5 3rd Qu.:6.115 3rd Qu.:10.629
#> 2010 : 5 Max. :6.947 Max. :10.797
#> (Other):60
#> Social.Support Freedom.To.Make.Life.Choices Generosity
#> Min. :0.7378 Min. :0.4841 Min. :-0.26659
#> 1st Qu.:0.8080 1st Qu.:0.6831 1st Qu.:-0.15041
#> Median :0.8738 Median :0.7526 Median :-0.05837
#> Mean :0.8551 Mean :0.7426 Mean :-0.05856
#> 3rd Qu.:0.9017 3rd Qu.:0.8145 3rd Qu.: 0.02133
#> Max. :0.9513 Max. :0.9274 Max. : 0.21715
#>
#> Positive.Affect Negative.Affect
#> Min. :0.4832 Min. :0.08274
#> 1st Qu.:0.5632 1st Qu.:0.14773
#> Median :0.6696 Median :0.17507
#> Mean :0.6437 Mean :0.17850
#> 3rd Qu.:0.7050 3rd Qu.:0.20653
#> Max. :0.7792 Max. :0.33815
#>
Berdasarkan ringkasan diatas dapat kita ketahui beberapa hal berikut:
Untuk mengetahui seberapa besar tingkat hubungan antar variabel
prediktor terhadap variabel target, dapat kita gunakan fungsi
ggcorrplot.
# Your Code Here
balanced2 %>% select(-Country.Name,-Year) %>%cor()%>%ggcorrplot(type="lower",lab=TRUE)
Berdasarkan hasil plot heatmap diatas, dapat diketahui bahwa
Untuk melihat lebih dalam informasi dari data yang kita miliki dapat
kita lakukan dengan menggunakan fungsi coplot() dengan
parameter
formula = diisikan dengan target ~ index1 given
index2type = "l" untuk line dan "b"
untuk point & line plotdata = datasetrows = banyaknya baris panel plot yang dibuatcol = warna plot yang disajikan1. Life.ladder
# Your Code Here
coplot(Life.Ladder ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")
Berdasarkan Line plot diatas dapat kita ketahui bahwa :
2. Log.GDP.Per.Capita
# Your Code Here
coplot(Log.GDP.Per.Capita ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")Berdasarkan plot diatas dapat kita ketahui bahwa :
3. Social.Support
# Your Code Here
coplot(Social.Support ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")
Berdasarkan plot diatas dapat kita ketahui bahwa :
4. Freedom.To.Make.Life.Choices
# Freedom.To.Make.Life.Choices
coplot(Freedom.To.Make.Life.Choices ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")
Berdasarkan Line plot diatas dapat kita ketahui bahwa :
Freedom.To.Make.Life.Choices. Padahal, China terkenal
dengan sistem komunis nyaFreedom.To.Make.Life.ChoicesUntuk melihat heterogenitas antar individu dan waktu kita dapat
menggunakan fungsi plotmeans() dari package gplots dengan
parameter:
1. Heterogenitas antar negara
plotmeans( Life.Ladder ~ Country.Name, data = balanced2, main="Heterogenitas Life.Ladder antar Negara")
Insight : Taiwan, Korea Selatan dan Jepang memiliki tingkat
life.ladder yang tinggi. Sedangkan China dan Mongolia, jauh
ketinggalan di bawah.
2. Heterogenitas antar Waktu
Insight : Tahun 2011,2020-2022 adalah tahun dimana orang dari beberapa
negara di Asia Timur paling bahagia di rentang tahun 2005-2022.
Tahapan cross validation akan selalu dilakukan sebelum pembuatan model, data akan dibagi menjadi data train dan data test. Dikarenakan data panel memiliki informasi keterangan waktu maka pembagian data tidak boleh diambil secara acak melainkan dibagi dengan cara dipisah secara berurutan.
untuk melakukannya kita bisa menggunakan bantuan fungsi
filter()
#membuat data train
ladder_train <- balanced2 %>% filter(Year != 2022)
#membuat data test
ladder_test <- balanced2 %>% filter(Year == 2022)setelah dilakukan cross validation kita perlu memastikan kembali bahwa data train sudah balance dengan melakukan balancing
ladder_train <- ladder_train %>%
droplevels() %>% # menghapus informasi waktu yang diambil sebagai data test (tahun 2022)
make.pbalanced() # melakukan balancing kembali
is.pbalanced(ladder_train)#> [1] TRUE
Dikarenakan pada hasil pemeriksaan korelasi pada tahapan EDA
sebelumnya menunjukkan adanya indikasi multikolinieritas antar variabel
prediktor, maka akan dilakukan pemeriksaan asumsi multikolinieritas
terlebih dahulu dengan cara pembuatan model regresi dengan fungsi
lm() dan dilanjutkan pengujian menggunakan fungsi
vif().
nilai VIF > 10: terjadi multicollinearity pada model nilai VIF < 10: tidak terjadi multicollinearity pada model
#> Log.GDP.Per.Capita Social.Support
#> 2.263397 1.663773
#> Freedom.To.Make.Life.Choices Generosity
#> 2.560800 2.430170
#> Positive.Affect Negative.Affect
#> 4.284035 2.228092
Insight: Tidak ada yang memiliki nilai di atas 10 sehingga kita bisa menggunakan semua prediktor yang telah dipersiapkan sebelumnya.
Untuk setiap pembuatan model akan digunakan fungsi plm()
dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model =
"pooling" : untuk model CEM"within" : untuk model FEM"random" : untuk model REMdimana
Model Gabungan (CEM)
membuat Common effect model dan disimpan kedalam objek
cem
# membuat Common effect model
cem <- plm(Life.Ladder ~ Log.GDP.Per.Capita + Social.Support + Freedom.To.Make.Life.Choices + Generosity + Positive.Affect + Negative.Affect,
data = ladder_train,
index = c("Country.Name","Year"),
model = "pooling")Model Pengaruh Tetap (FEM)
membuat model FEM dengan memberikan parameter tambahan
effect = "twoways" untuk memasukan pengaruh individu dan
waktu, kemudian disimpan kedalam objek fem.two
# membuat fixed effect model
fem <- plm(Life.Ladder ~ Log.GDP.Per.Capita + Social.Support + Freedom.To.Make.Life.Choices + Generosity + Positive.Affect + Negative.Affect,
data = ladder_train,
index = c("Country.Name","Year"),
model = "within")Uji Chow
Uji chow dilakukan untuk memilih model terbaik antara model gabungan
(cem) dengan model fixed effec (fem). untuk melakukan uji Chow dapat
menggunakan fungsi pooltest(model_cem, model_fem)
Hipotesis yang diuji adalah sebagai berikut:
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
#>
#> F statistic
#>
#> data: Life.Ladder ~ Log.GDP.Per.Capita + Social.Support + Freedom.To.Make.Life.Choices + ...
#> F = 2.7441, df1 = 4, df2 = 74, p-value = 0.03463
#> alternative hypothesis: unstability
Berdasarkan hasil uji chow diatas, kita peroleh nilai p-value < α. artinya Model terbaik untuk digunakan pada data World Happines adalah fixed effect model.
Model Pengaruh Acak (REM)
membuat random effect model dan disimpan kedalam objek
rem
# membuat random effect model
# Error model random effect karena jumlah variabel prediktor dan target > jumlah index individu
#rem <- plm(Life.Ladder ~ Log.GDP.Per.Capita + Social.Support + Freedom.To.Make.Life.Choices + Generosity + Positive.Affect + Negative.Affect,
# data = ladder_train,
# index = c("Country.Name","Year"),
# model = "random")Uji Hausman
Untuk melakukan uji Chow di R dapat menggunakan fungsi
phtest(model_rem, model_fem), dengan Hipotesis yang diuji
adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α. Karena REM tidak dibuat karena jumlah individu > jumlah prediktor, kita tidak melakukan uji ini
Artinya Model terbaik untuk digunakan pada data World Happines adalah fixed effect model. Dikarenakan model fem adalah model terbaik maka tidak perlu dilakukan uji efek lanjutan, dan bisa langsung dilakukan pengujian asumsi.
Normalitas
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
#>
#> Shapiro-Wilk normality test
#>
#> data: .
#> W = 0.91461, p-value = 0.00003201
Berdasarkan hasil pengujian normalitas sisaan diperoleh nilai p-value < 0.05, artinya sisaan menyebar secara TIDAK normal.
Homogenitas
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
#>
#> studentized Breusch-Pagan test
#>
#> data: .
#> BP = 4.0277, df = 6, p-value = 0.6729
Berdasarkan hasil pengujian homogenitas diperoleh nilai p-value > 0.05, artinya sisaan memiliki ragam yang homogen.
Autokorelasi
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
#>
#> Box-Ljung test
#>
#> data: .
#> X-squared = 11.227, df = 1, p-value = 0.0008064
Berdasarkan hasil pengujian autokorelasi diperoleh nilai p-value < 0.05, artinya terjadi permasalahan autokorelasi antar sisaan.
1. Koefisien
#> Oneway (individual) effect Within Model
#>
#> Call:
#> plm(formula = Life.Ladder ~ Log.GDP.Per.Capita + Social.Support +
#> Freedom.To.Make.Life.Choices + Generosity + Positive.Affect +
#> Negative.Affect, data = ladder_train, model = "within", index = c("Country.Name",
#> "Year"))
#>
#> Balanced Panel: n = 5, T = 17, N = 85
#>
#> Residuals:
#> Min. 1st Qu. Median 3rd Qu. Max.
#> -0.579882 -0.123936 -0.020388 0.114011 0.918328
#>
#> Coefficients:
#> Estimate Std. Error t-value Pr(>|t|)
#> Log.GDP.Per.Capita 0.88749 0.16275 5.4530 0.0000006255 ***
#> Social.Support 2.27912 1.26491 1.8018 0.07565 .
#> Freedom.To.Make.Life.Choices 1.08858 0.47612 2.2864 0.02510 *
#> Generosity 0.98735 0.50356 1.9607 0.05367 .
#> Positive.Affect 1.49794 1.10717 1.3529 0.18019
#> Negative.Affect -1.59825 1.00230 -1.5946 0.11507
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Total Sum of Squares: 9.9668
#> Residual Sum of Squares: 4.0801
#> R-Squared: 0.59063
#> Adj. R-Squared: 0.53531
#> F-statistic: 17.7944 on 6 and 74 DF, p-value: 0.0000000000011927
Interpretasi:
\[life.ladder = (0.88749 * Log.GDP.Per.Capita) + (2.27912 * Social.Support) + (1.08858 * Freedom.To.Make.Life.Choices) + (0.98735 * Generosity) + (1.49794 * Positive.Affect) - 1.59825 Negative.Affect + uit\]
2. Mengekstrak informasi Efek dari model fix
Untuk mengekstrak informasi efek dari model FEM kita dapat
menggunakan fungsi fixef(model fem),
#> China Japan Mongolia
#> -6.4799 -6.8878 -6.5678
#> South Korea Taiwan Province of China
#> -6.4140 -6.8491
Interpretasi:
Untuk melakukan prediksi akan kita gunakan fungsi
predict() dengan parameter:
Untuk menguji apakah model yang kita miliki sudah baik dalam
memprediksi data baru maka kita akan evaluasi dengan menggunakan nilai
error, salah satu metric eror yang biasa digunakan adalah MAPE. Kita
dapat melakukannya menggunakan fungsi MAPE() dengan
parameter:
#> [1] 0.04158097
Insight: tingkat kesalahan prediski model fem dalam memprediksi nilai baru adalah sebesra 4,16%, artinya model sudah cukup baik untuk digunakan dalam memprediksi data yang baru.
Dari serangkaian proses analisis yang telah dilakukan, dapat kita peroleh kesimpulan sebagai berikut:
Saran: