Sunday, February 23, 2014

BelajarVBA 102 - ComboBox 02

Coretan Mr. Kid

Isilah masa sehat dengan kebaikan sebelum tiba masa sakit.

Pada pembahasan tentang combobox yang lalu, sumber data merujuk ke suatu area range yang diisikan ke dalam combobox dengan memanfaatkan properti ListFillRange (combobox di dalam worksheet) atau RowSource (combobox di dalam userform). Properti ListFillRange akan membuat daftar dalam combobox menjadi terikat erat dengan sumbernya, sehingga pengubahan isi daftar tanpa mengubah sumber data tidak dimungkinkan. Pengubahan bisa dilakukan bila yang diubah adalah nilai-nilai dalam sumber data.

Bahasan kali ini masih akan menggunakan data sumber untuk combobox list dari suatu range. Hanya saja, kali ini pengisian daftar combobox dilakukan tanpa properti ListFillRange atau RowSource, tetapi menggunakan methods AddItem ataupun properti List dari combbox. Hal ini akan membuat daftar menjadi lebih terbuka untuk diubah isinya. Kadang kala pengubahan isi daftar juga dibutuhkan pada beberapa kasus.

File yang akan digunakan adalah BelajarVBA102_02.xlsm. Data yang digunakan diletakkan pada sheet bernama 'populate' dengan nama object di dalam VBProject adalah Sheet2. Data tersebut seperti gambar berikut :


ComboBox list berisi satu kolom

Kali ini, pembahasan combobox akan memanfaat userform. Pada bahasan tentang combobox berisi satu kolom ini, akan menggunakan userform bernama frmNomor2 seperti gambar berikut :
yang berisi object controls utama sebagai berikut :
  • Combobox bernama cboProd : combobox dengan list berisi satu kolom yang dibaca dari sheet bernama populate (object Sheet2) pada range A2:A5.
  • Textbox bernama txtListIndex : menampilkan nilai yang disimpan oleh properti ListIndex milik cboProd.
  • Textbox bernama txtText : menampilkan nilai yang disimpan oleh properti Text milik cboProd.
  • Textbox bernama txtValue : menampilkan nilai yang disimpan oleh properti Value milik cboProd.
Pada kasus ini, textbox digunakan untuk menampilkan data dan tidak mengijinkan user untuk bisa mengubah nilainya. Maka properti Locked milik seluruh textbox diset bernilai TRUE. Properti milik cboProd menggunakan nilai default setiap pembuatan object baru di sebuah userform, yang antara lain adalah :
  • BoundColumn dan ColumnCount bernilai 1
  • ColumnHeads bernilai FALSE
  • ColumnWidths, ControlSource, RowSource, Text, Value dalam keadaan kosong
  • ListWidth bernilai 0pt
  • TextColumn bernilai -1
Alur proses pada frmNomor2 adalah sebagai berikut :
  1. Saat frmNomor2 dimuat ke memori komputer, maka dilakukan pengisian item-item daftar pilihan combobox, yang dilanjutkan dengan manampilkan frmNomor2 kepada user. Artinya, proses pengisian dilakukan saat frmNomor2 sedang diinisialisasi ke memori komputer. Jadi, proses pengisian item ke combobox llist dilakukan pada sebuah event milik userform frmNomor2, yaitu event Initialize.
  2. Ketika user mengubah pada combobox cboProd, maka akan dilakukan proses penulisan nilai-nilai yang disimpan oleh properti ListIndex, Text, dan Value dari cboProd ke :
    • sheet bernama populate (Sheet2 di VBProject Explorer) pada range B13 sampai B15.
    • textbox control terkait, yaitu txtListIndex, txtText, dan txtValue
    Proses ini dilaksanakan saat user mengubah isi cboProd, yang berarti akan memicu event Change milik cboProd. Jadi proses dilakukan didalam event Change milik cboProd.
  3. Saat userform frmNomor2 ditutup oleh user, maka dilakukan pembersihan isi range B13 sampai B15 yang ada di sheet bernama populate. Proses ini terjadi saat ada permintaan penutupan userform oleh user, yang akan memicu event milik userform yang bernama QueryClose. Jadi, proses pembersihan isi range tertentu tersebut diletakkan di dalam event QueryClose milik userform.
Setelah desain userform frmNomor2 terbentuk dan alur proses terjabarkan dengan jelas, maka penulisan script VBA untuk setiap proses tersebut bisa dilakukan dengan tartil. Berikut ini langkah penulisan script VBA untuk contoh kasus di atas.
  1. Event Initialize milik userform frmNomor2
    Diisi dengan proses pengisian daftar untuk combobox cboProd dengan langkah penyusunan sebagai berikut :
    • Membuat blok prosedur sub event Initialize milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2, sehingga muncul blok event Click milik userform frmNomor2
      • pada combobox prosedur (sudut kanan atas area penulisan script) -> pilih Initialize
      • letakkan cursor ke dalam blok prosedur sub event Initialize yang terbentuk
    • Mendeklarasikan variabel yang dibutuhkan selama proses pengisian Pengisian item list combobox cboProd bisa dilakukan dengan 2 (dua) cara, yaitu : (pilih salah satu)
      • Memanfaatkan methods AddItem dengan cara melakukan loop terhadap setiap item sumber data. Sumber data yang berada di sheet populate (object Sheet2) pada range A2:A5 membutuhkan variabel loop bertipe Range. Maka perlu pendeklarasian variabel tersebut, yang misalnya diberi nama rngCurrent. Baris kode deklarasi tersebut berbunyi :
        Dim rngCurrent As Range
      • Memanfaatkan properti List dengan cara menyediakan array seluruh item dari sumber data. Berarti, sumber data yang ada di sheet populate (object Sheet2) pada range A2:A5 dibaca dan disimpan sebagai sebuah array. Area range sebenarnya adalah suatu array dan tipe data yang memungkinkan dengan mudah untuk menyimpan array dari suatu range adalah tipe Variant. Maka perlu pendeklarasian variabel bertipe variant, yang misalnya diberi nama vSumber. Baris kode deklarasi tersebut berbunyi :
        Dim vSumber As Variant
    • Menyusun baris kode proses pengisian
      Sumber data di sheet populate (Sheet2) pada range A2:A5.
      • Jika memilih menggunakan methods AddItem, maka dibutuhkan proses loop terhadap setiap item dalam range A2:A5. Di dalam proses loop tersebut diisi proses penambahan item ke list milik combobox dengan methods AddItem. Baris-baris kode proses ini adalah :
        For Each rngCurrent In Sheet2.Range("a2:a5")
           cboProd.AddItem rngCurrent.Value
        Next rngCurrent
      • Jika memilih menggunakan properti List, maka dibutuhkan proses penyimpanan sumber data range A2:A5 menjadi array, yaitu ke dalam variabel vSumber. Kemudian array dalam variabel vSumber dimasukkan ke properti List. Baris-baris kode proses ini adalah :
        vSumber = Sheet2.Range("a2:a5")
        cboProd.List = vSumber
    • Bentuk akhir prosedur sub event Initialize menjadi :
      • Methods AddItem
        Private Sub UserForm_Initialize()
           Dim rngCurrent As Range

           For Each rngCurrent In Sheet2.Range("a2:a5")
              cboProd.AddItem rngCurrent.Value
           Next rngCurrent
        End Sub
      • Properti List
        Private Sub UserForm_Initialize()
           Dim vSumber As Variant

           vSumber = Sheet2.Range("a2:a5")
           cboProd.List = vSumber
        End Sub
  2. Event Change milik cboProd
    Diisi dengan proses penulisan ke lokasi target dengan langkah penyusunan sebagai berikut :
    • Membentuk blok prosedur sub event Change milik cboProd dengan cara double click object control combobox cboProd yang ada di dalam userform frmNomor2 dan meletakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis nilai-nilai properti ListIndex, Text, dan Value secara berurutan ke :
      • Sheet populate pada range B13 sampai B15 dengan baris-baris kode :
        Sheet2.Range("b13").Value = cboProd.ListIndex
        Sheet2.Range("b14").Value = cboProd.Text
        Sheet2.Range("b15").Value = cboProd.Value
      • Object controls textbox txtListIndex, txtText, dan txtValue dengan baris-baris kode :
        txtListIndex.Text = cboProd.ListIndex
        txtText.Text = cboProd.Text
        txtValue.Text = cboProd.Value
    • Bentuk akhir blok prosedur sub event Change milik cboProd :
      Private Sub cboProd_Change()
         Sheet2.Range("b13").Value = cboProd.ListIndex
         Sheet2.Range("b14").Value = cboProd.Text
         Sheet2.Range("b15").Value = cboProd.Value

         txtListIndex.Text = cboProd.ListIndex
         txtText.Text = cboProd.Text
         txtValue.Text = cboProd.Value
      End Sub
  3. Event QueryClose milik userform frmNomor2
    Diisi dengan proses menghapus isi range B13 sampai B15 pada sheet bernama populate (object Sheet2), yang menjadi lokasi penulisan pada proses di dalam event Change milik cboProd. Langkah-langkah penyusunannya adalah sebagai berikut :
    • Membentuk blok prosedur sub event QueryClose milik userform frmNomor2 dengan cara :
      • double click userform frmNomor2
      • pada combobox daftar prosedur (pojok kanan atas area penulisan script) -> pilih QueryClose
      • letakkan cursor di dalam blok prosedur yang terbentuk
    • Menulis baris kode untuk menghapus isi range B13 sampai B15 di sheet populate (object Sheet2) yang berbunyi :
      Sheet2.Range("b13:b15").ClearContents
    • Bentuk akhir blok prosedur sub event QueryClose menjadi :
      Private Sub UserForm_QueryClose( _
                                Cancel As Integer _
                              , CloseMode As Integer)
         Sheet2.Range("b13:b15").ClearContents
      End Sub
Prosedur-prosedur di atas membentuk sebuah proses sederhana tentang pengisian item list combobox dan pengambilan nilai dari item terpilih ke suatu lokasi target (range tertentu ataupun object control tertentu).

ComboBox list multi kolom hanya menampilkan satu kolom

Kali ini, dibuat sebuah userform yang diberi nama frmNomor3 yang mirip dengan userform frmNomor2. Perbedaannya adalah penambahan textbox bernama txtCol2 untuk menampilkan nilai dari kolom ke-3 list combobox. Properti BoundColumn di-set bernilai 2 dan properti TextColumn di-set bernilai 1. Sedangkan properti ColumnCount tetap bernilai 1 karena hanya akan menampilkan satu kolom saja. Sumber data untuk list combobox diambil dari sheet populate (object Sheet2) pada area range A2:C5 (3 kolom). Bentuk userform frmNomor3 seperti gambar berikut :

> Proses pend-disable-an event pada userform

Kebutuhan untuk membaca nilai dari kolom list yang tidak ditunjuk oleh properti BoundColumn maupun TextColumn, seperti ingin mengambil nilai dari kolom list ke-3 [indeks kolom bernilai 2 = Column(2)] bisa memicu timbulnya error ketika nilai pada kolom yang dirujuk tersebut belum terdefinisikan. Contohnya adalah ingin mengambil nilai dari kolom ke-3, tetapi pada baris item tersebut baru 2 kolom saja yang didefinisikan.

Error seperti ini sering terjadi ketika proses pengambilan nilai pada suatu kolom list dilakukan pada event Change milik combobox terkait (misal pada event Change milik cboProd). Artinya, dibutuhkan sebuah proses untuk mengabaikan kerja prosedur sub event change pada saat mengubah isi list, karena tidak ada pengaturan untuk men-disable event milik userform. Cara men-disable event di suatu userform dalam VBA dilakukan dengan menggunakan variabel ber-scope module yang diperiksa oleh setiap prosedur sub event yang tidak ingin dijalankan dengan alasan tertentu.

Pada contoh kasus ini, proses pada event Initialize userform frmNomor3 bisa memunculkan error, karena proses pengisian list combobox akan memicu event Change milik cboProd. Untuk men-disable event, maka dibuat sebuah variabel bernama bEventTidakBolehJalan dengan scope module. Baris kode deklarasi variabel ini diletakkan pada area General Declaration (di baris pertama area penulisan script atau setelah baris berbunyi Option Explicit). Baris kode tersebut berbunyi :
   Private bEventTidakBolehJalan As Boolean

Pada event Change milik cboProd, yaitu dibaris pertama setelah baris deklarasi variabel diberi proses cek terhadap nilai variabel bEventTidakBolehJalan dengan bentuk baris kode :
   If bEventTidakBolehJalan Then
      Exit Sub
   End If
yang berarti, jika variabel bEventTidakBolehJalan sedang bernilai TRUE, maka proses langsung keluar dari prosedur alias tidak ada proses dalam prosedur event tersebut yang dilakukan.

Cara menggunakannya, pada prosedur yang salah satu prosesnya bisa memicu si event Change milik cboProd untuk dijalankan, seperti pada event Initialize milik userform frmNomor3, diberi baris kode untuk mengubah nilai variabel bEventTidakBolehJalan menjadi TRUE. Penempatannya adalah tepat sebelum proses yang memicu berjalannya event Change milik cboProd. Pada kasus ini, berarti baris kode berbunyi :
   bEventTidakBolehJalan = TRUE
diletakkan tepat sebelum proses pengisian item list cboProd di dalam prosedur sub event Initialize. Pada bagian akhir event Initialize, yaitu tepat sebelum keluar dari prosedur atau sebelum baris End Sub, diberi baris kode untuk mengembalikan nilai variabel bEventTidakBolehJalan menjadi FALSE. Baris kode tersebut berbunyi :
   bEventTidakBolehJalan = FALSE

> Proses pengisian multi kolom list dengan methods AddItem

Cara mengisi multi kolom list menggunakan methods AddItem memerlukan sebuah variabel penyimpan indeks baris list yang akan ditambahkan. Misalkan variabel ini diberi nama lCboIndex. Maka pada event Initialize diberi penambahan deklarasi variabel tersebut. Maka baris deklarasi variabel pada event Initialize menjadi :
   Dim rngCurrent As Range, lCboIndex As Long

Kemudian nilai lCboIndex di-set dengan nilai awal indeks baris list yang base-0, yaitu dengan nilai 0 seperti dengan baris berbunyi :
   lCboIndex = 0

Proses loop yang tadinya berbentuk :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value
   Next rngCurrent

diubah menjadi :
   For Each rngCurrent In Sheet2.Range("a2:a5")
      cboProd.AddItem rngCurrent.Value  'pembuat item baru


      'pengisi kolom list ke-2 dan seterusnya
      cboProd.List(lCboIndex, 1) = rngCurrent.Offset(0, 1).Value
      cboProd.List(lCboIndex, 2) = rngCurrent.Offset(0, 2).Value

      'set nilai indeks baris list berikutnya yang akan diisi

      lCboIndex = lCboIndex + 1
   Next rngCurrent


> Proses pengisian multi kolom list dengan properti List

Jika menggunakan properti List, maka yang diubah adalah rujukan range yang tadinya merujuk ke A2:A5 menjadi merujuk ke A2:C5 (lihat bagian yang di-merah).
   vSumber = Sheet2.Range("a2:c5")

> Penambahan baris penulisan pada event Change cboProd

Pengambilan nilai kolom ke-3 (indeks kolom ke-2) dapat dilakukan dengan properti Column maupun properti List seperti yang telah dijelaskan pada coretan tentang combobox sebelum ini. Penulisan ke sheet populate pada kasus multi kolom list ini dilakukan ke range H18:H21, sehingga baris kode bagian penulisan ke sheet populate menjadi :
   Sheet2.Range("h18").Value = cboProd.ListIndex
   Sheet2.Range("h19").Value = cboProd.Text
   Sheet2.Range("h20").Value = cboProd.Value

   Sheet2.Range("h21").Value = cboProd.List(, 2)  'atau cboProd.Column(2)

Sedangkan pada penulisan ke textbox txtCol2 adalah dengan menambahkan baris kode :
   txtCol2.Text = cboProd.List(, 2)  'atau cboProd.Column(2)

Hasil akhir penyusunan script untuk userform frmNomor3 dapat dilihat pada file BelajarVBA102_02.xlsm.

Tambah, ubah, dan hapus item list combobox

> menambah sebuah item ke list combobox

Misalkan ada sebuah combobox bernama cboProd. Penambahan item list dilakukan dengan menggunakan methods AddItem dengan susunan :
   cboProd.AddItem nilai_baru, [indeks_posisi_penambahan]
Jika ingin menambahkan pada baris baru adalah dengan mengabaikan bagian [indeks_posisi_penambahan] seperti :
   cboProd.AddItem nilai_baru
Bagian nilai_baru adalah teks (bertipe String) yang akan menjadi nilai baru di kolom ke-1 (indeks kolom ke-0).
Contohnya adalah ingin menambahkan item baru 'X' di baris baru, maka baris kodenya adalah :
   cboProd.AddItem "X"
Jika item baru 'Y' ingin ditambahkan pada baris ke-1 list (indeks baris ke-0), maka baris kodenya adalah :
   cboProd.AddItem "Y", 0

Pada combobox dengan multi kolom list, maka bisa jadi dibutuhkan juga pengisian pada kolom ke-2 dan seterusnya (penambahan pada indeks kolom ke-1 dan seterusnya). Pengisian tersebut bisa dilakukan setelah ada penambahan item baru dengan methods AddItem di atas. Susunan penulisan item di kolom lain tersebut secara umum adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru

Misalkan ingin menambahkan item 'Z' pada baris baru dengan nilai kolom ke-2 bernilai 'Z01' dan nilai kolom ke-3 bernilai 'ZZ11P001', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "Z"
   cboProd.List( cboProd.ListCount-1 , 1) = "Z01"
   cboProd.List( cboProd.ListCount-1 , 2) = "ZZ11P001"
Properti ListCount dipergunakan untuk mendapatkan jumlah item dalam list. Karena properti ListIndex menggunakan base 0 (indeks baris item pertama bernilai 0), maka nilai properti ListCount - 1 adalah indeks baris item terakhir yang ada. Pada kasus di atas, berarti pada baris item 'Z' yang baru saja ditambahkan di baris baru.

Sedangkan jika ingin menyisipkan (menambah item pada baris tertentu) item 'M' pada baris ke-1 (indeks baris 0) dengan nilai kolom ke-2 bernilai 'M78' dan nilai kolom ke-3 bernilai 'KL98P113', maka baris-baris kode penambahan tersebut adalah :
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113"
Kadangkala, pemeriksaan posisi penyisipan perlu dilakukan, sehingga dapat dipastikan bahwa indeks baris penyisipan tidak lebih dari nilai properti ListCount. Nilai properti ListCount bisa diartikan juga sebagai indeks baris baru jika akan dilakukan penambahan data. Bentuk pemeriksaan tersebut adalah sebagai berikut :
'0 adalah indeks baris lokasi penyisipan dan bisa diganti dengan variabel tertentu
If cboProd.ListCount >= 0 Then 
   'proses penyisipan diletakkan disini
   cboProd.AddItem "M", 0
   cboProd.List( 0 , 1) = "M78"
   cboProd.List( 0 , 2) = "KL98P113" 
End If

> mengubah isi sebuah item yang ada di list combobox

Misalkan ada sebuah combobox bernama cboProd. Pengubahan isi sebuah kolom dalam list combobox dilakukan dengan memanfaatkan propeti List. Bentuk umum beris kodenya adalah :
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
dengan syarat bahwa idxrow (indeks baris yang akan diubah isinya) kurang dari jumlah item (nilai properti ListCount). Biasanya, bentuk diatas disertai pemeriksaan terhadap indeks baris yang akan diubah isinya. Bentuk lengkapnya menjadi :
'idxrow adalah indeks baris yang akan diubah isinya
If idxrow < cboProd.ListCount Then
   cboProd.List(idxrow, idxcol) = nilai_kolom_baru
End If

Misalkan akan mengubah isi kolom ke-3 (indeks kolom ke-2) pada item di baris pertama (indeks baris ke-0) menjadi 'GJ71P123', maka baris kodenya adalah :
If 0 < cboProd.ListCount Then
   cboProd.List(0, 2) = "GJ71P123"
End If

> menghapus isi list combobox

Misalkan ada sebuah combobox bernama cboProd. Jika akan menghapus seluruh isi list combobox, maka dapat menggunakan methods Clear. Baris kodenya adalah :
   cboProd.Clear

Jika yang akan dihapus adalah sebuah item di baris tertentu, maka dilakukan dengan menggunakan methods RemoveItem disertai indeks baris (base 0) yang akan dihapus. Bentuk umum baris kodenya adalah :
   cboProd.RemoveItem indeks_baris_yang_dihapus
Biasanya, penghapusan sebuah baris item dilakukan setelah diperiksa bahwa baris yang akan dihapus ada didalam list. Artinya, indeks baris yang akan dihapus (indeks_baris_yang_dihapus) kurang dari jumlah item list (nilai properti ListCount). Jadi bentuk umum menghapus sebuah item list combobox yang disertai pemeriksaan keberadaan baris yang akan dihapus adalah :
   If indeks_baris_yang_dihapus < cboProd.ListCount Then
      cboProd.RemoveItem indeks_baris_yang_dihapus
   End If
Misalkan ingin menghapus item di baris ke-4 (indeks baris ke-3), maka baris kodenya adalah :
   If 3 < cboProd.ListCount Then
      cboProd.RemoveItem 3
   End If

Contoh tentang penerapan penambahan item, pengubahan isi, dan penghapusan item bisa dilihat di file BelajarVBA102_02.xlsm pada userform bernama frmNomor4 yang bisa diaktifkan melalui tombol di sheet bernama 'sisip_ubah_buang'. Pada userform tersebut juga disertakan contoh pemanfaatan event Click milik object control Label yang bisa menjadi alternatif sebuah tombol seperti object control CommandButton.

:)

Insya Allah pembahasan berikutnya tentang object control ListBox pada properti yang tidak dimiliki oleh ComboBox, yaitu properti MultiSelect. Selain itu, juga akan dibahas tentang object control Label, khususnya pada pemanfaatan properti Caption dan MultiLine. Object control textbox juga memiliki properti MultiLine, tetapi ada properti PasswordChar yang bisa digunakan untuk me-masking inputan user pada control tersebut. Event KeyDown acapkali terasa bermanfaat ketika digunakan oleh textbox, seperti membatasi inputan untuk numerik saja atau karakter tertentu saja dan sebagainya. Event KeyDown pada textbox juga akan dibahas disana.


Saturday, February 22, 2014

BelajarVBA 102 - ComboBox 01

Coretan Mr. Kid

Sempatkan berbagi sebelum sempit.

Setelah sekian lama tak sempat, Alhamdulillah tiba juga masa sempat tersebut. Bahasan kali ini tentang ActiveX ComboBox. ActiveX Controls memiliki banyak properti dan event yang memudahkan pengaturan alur proses menampilkan sesuatu. Salah satu ActiveX Controls yang sering digunakan adalah ComboBox. File yang digunakan mendampingi coretan kali ini adalah BelajarVBA102_01.xlsm.



ComboBox

Object control ini dapat digunakan untuk menampilkan daftar pilihan kepada user. Daftar pilihan bisa disertai beberapa kolom tambahan yang dapat dijadikan sebagai informasi tambahan bagi user. Object control ini dapat digunakan di dalam Worksheet maupun di dalam UserForm.

Selain dengan cara memilih dari pilihan yang tersedia, user juga bisa menuliskan nama item yang dibutuhkannya pada suatu area penulisan layaknya menulis pada sebuah textbox. Jika yang ditulis user ada dalam daftar pilihan, maka combobox akan segera memilihkan item tersebut untuk user.

Jadi, combobox memiliki 2 bagian utama, yaitu :
  1. daftar pilihan
    • Pada umumnya, daftar ini ditampilkan bila user meng-click dropdown, tetapi pengaturan properti untuk hal ini bisa dilakukan pada properti bernama ShowDropButtonWhen
    • Daftar pilihan ditampilkan sebagai sebuah list yang mirip dengan control ListBox dan memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan listbox.
  2. penulisan nama item
    • Area penulisan ini memiliki karakteristik (properti, methods, events) yang sebagian besar sama dengan control TextBox.
    • Teks yang di-input akan membuat combobox berusaha mencari dan memilihkan item dari dalam daftar pilihan. Karakteristik pencarian dan pemilihan item yang dilakukan oleh combobox akibat inputan dapat diatur pada properti MatchEntry dan MatchRequired.
Data yang akan digunakan sebagai daftar pilihan dalam combobox adalah seperti gambar berikut :

Properti ListFillRange dan LinkedCell

Bahasan pertama adalah tentang combobox yang diletakkan di dalam sebuah worksheet (misal worksheet bernama list_fill_range). Ketika daftar item yang akan dipasang pada combobox berada di suatu area range, sebut saja pada range A2:A5 (lihat gambar data di atas dan anggap saja data tersebut ada di sheet list_fill_range), maka properti ListFillRange bisa memberi kemudahan. Pengisian daftar item dalam combobox bisa dilakukan dengan mengisi properti ListFillRange. Isi properti ListFillRange adalah alamat area range dari daftar item, seperti menuliskan teks berbunyi A2:A5. Properti dari combobox bisa dimunculkan ketika dalam keadaan Design Mode (lihat di ribbon Developer dan klik Design Mode). Cara menampilkan window properties dari si object adalah dengan klik kanan si object dan pilih Properties.

Setelah daftar terisi dan Design Mode telah di-off-kan, maka user bisa memilih sebuah item dari daftar yang ada. Pilihan user ini bisa dituliskan ke sebuah cell tanpa perlu script VBA dengan memanfaatkan properti bernama LinkedCell. Isian properti LinkedCell juga berupa alamat sebuah range. Misalkan, pada properti LinkCell diisi alamat range berbunyi B10. Setiap kali user memilih sebuah item dari combobox, maka pada cell B10 akan tertulis pilihan user tersebut. Ketika user mengosongkan pilihan atau menulis sesuatu dalam combobox yang tidak ada di dalam daftar, maka cell B10 akan berisi error value #N/A.

Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range pada file yang disebutkan di atas.

Jadi, properti :
  • ListFillRange : untuk mengisi daftar combobox atau listbox dari suatu area range.
  • LinkedCell : untuk mengikatkan properti Value milik object ke sebuah range.

Multiple Column dan Event Change

Pengaturan yang dilakukan pada properti combobox agar bisa menampilkan banyak kolom informasi tambahan adalah sebagai berikut :
  • ColumnCount : jumlah kolom yang ditampilkan pada list. Jadi, list bisa berisi lebih banyak kolom dibanding yang ditampilkan. Misalkan list berisi 8 kolom, tetapi hanya ditampilkan 5 kolom saja dengan mengisi ColumnCount dengan nilai 5.
  • ColumnHeads : status menampilkan header atau tidak (TRUE/FALSE) ketika sumber data dari suatu area range.
  • ColumnWidths : pengaturan lebar masing-masing kolom dalam satuan point (pt) yang dipisah karakter titik koma ( ; ), seperti 60pt;80pt;80pt untuk 3 kolom yang ditampilkan.
  • ListWidth : lebar list keseluruhan dalam satuan point (pt) ketika dimunculkan atau saat user mengklik dropdown combobox. Jika total lebar setiap kolom lebih dari ListWidth, maka akan dimunculkan horisontal scrollbar, seperti 220pt.
  • BoundColumn : indeks kolom yang akan dijadikan nilai bagi properti Value (base 1 -> kolom ke-1 mendapat nomor indeks kolom 1). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
  • TextColumn : indeks kolom yang akan dijadikan nilai bagi properti Text (base 1 dan defaultnya -1 yang berarti sama dengan BoundColumn). Nilai 0 berarti menampilkan nilai ListIndex atau indeks baris item (base 0).
Properti LinkedCell (jika digunakan) hanya bisa mengambil sebuah nilai yang dimiliki oleh properti Value yang terikat dengan kolom yang ditentukan pada properti BoundColumn. Sedangkan jumlah kolom dalam list ada lebih dari satu, maka sangat besar kemungkinan akan menggunakan script VBA untuk mendapatkan nilai dari kolom-kolom yang ada. Beberapa properti yang bermanfaat dalam pengambilan nilai dari kolom-kolom yang ada dalam list sebuah combobox antara lain adalah :
  • ListIndex : indeks baris list yang terpilih dengan nilai -1 yang berarti tidak ada yang terpilih dan nilai 0 sebagai item di baris pertama dalam list (base 0 -> item ke-1 diberi indeks bernilai 0).
  • Text : nilai yang ditampilkan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti TextColumn (base 1 -> kolom ke-1 dalam list diberi indeks kolom bernilai 1)
  • Value : nilai yang disimpan oleh combobox yang berasal dari indeks kolom yang ditentukan pada properti BoundColumn (base 1).
  • Column( idxcol ) : merujuk pada indeks kolom ke-idxcol (base 0), seperti Column(1) merujuk ke indeks kolom 1 yang berarti merujuk pada kolom ke-2 dalam list.
  • List( idxrow , idxcol ) : merujuk pada baris item dengan indeks baris ke-idxrow (base 0) dan kolom dengan indeks kolom ke-idxcol (base 0). Nilai idxrow pada baris terpilih adalah sebesar nilai properti ListIndex.
Pada saat user memilih sebuah item dari list, maka event yang bekerja adalah event Change. Jadi, jika diharapkan agar setiap user mengganti pilihan akan terjadi suatu proses tertentu seperti penulisan nilai-nilai ke suatu lokasi target, maka event change bisa diisi dengan script VBA tentang alur proses tersebut. Event Change milik combobox dapat dibuat dengan melakukan double click pada object control ketika dalam keadaan Design Mode. Gambar berikut ini adalah cuplikan dari sheet bernama list_fill_range yang menjadi contoh combobox dengan multiple column dan disertai dengan proses penulisan nilai ke suatu range.
Pada gambar, properti ListFillRange diisi dengan A2:C5 dengan jumlah kolom yang ditampilkan adalah 3 (isi ColumnCount) diisi 3. Jadi, sumber data list adalah range A2:C5 (3 kolom) ditampilkan dalam list sebanyak 3 kolom juga (ditampilkan seluruhnya). Properti LinkedCell juga digunakan dengan merujuk ke range B30 yang akan mengambil nilai di kolom ke-2 karena isi properti BoundColumn adalah 2 yang berarti properti Value akan mengambil nilai yang ada di kolom ke-2.

Pemanfaatan event Change milik combobox adalah untuk menulis beberapa informasi tentang nilai-nilai properti tertentu dari item yang terpilih, seperti properti ListIndex yang ditulis pada cell B33, Text pada cell B34 yang nilainya berasal dari kolom ke-1 berdasar isi properti TextColumn yang bernilai 1, Value yang nilainya berasal dari kolom ke-2 dan menghasilkan nilai yang sama dengan cell B30 yang diisi oleh properti LinkedCell. Juga nilai dari kolom ke-3 yang diambil dari list combobox menggunakan properti Column dengan idxcol bernilai 2 (cell B36) atau dengan properti List dengan idxrow senilai dengan nilai properti ListIndex (karena bagian idxrow dikosongkan) dan idxcol bernilai 2 (cell B37).

Prosedur Sub pada event change combobox tersebut berbunyi sebagai berikut :
Private Sub cboProd2_Change()
    'tulis informasi tentang data terpilih
    Range("b33").Value = cboProd2.ListIndex     'ListIndex
    Range("b34").Value = cboProd2.Text          'Text
    Range("b35").Value = cboProd2.Value         'Value
    Range("b36").Value = cboProd2.Column(2)     'Column indeks 2 [base 0]=kolom ke-3
    Range("b37").Value = cboProd2.List(, 2)     'List indeks kolom 2 [base 0]=kolom ke-3
End Sub


ComboBox pada sebuah UserForm

ActiveX Control memang lebih sering digunakan dalam UserForm yang tampak lebih cantik. ComboBox dalam sebuah UserForm juga bisa diisi dengan suatu data yang disimpan pada suatu area range secara mudah melalui pemanfaatan properti RowSource. Properti RowSource pada combobox di dalam UserForm setara dengan properti ListFillRange pada ComboBox yang diletakkan dalam sebuah worksheet. Properti LinkedCell di combobox dalam worksheet setara dengan properti ControlSource pada combobox di dalam sebuah UserForm.

Misalkan dibuat sebuah UserForm bernama frmNomor1 yang diberi combobox dengan nama cboProd. Pada cboProd, diatur dengan properti :
  • RowSource : berisi teks berbunyi list_fill_range!A2:C5
  • ColumnCount : berisi 3
  • ColumnHeads : TRUE
  • BoundColumn : berisi 2
  • ControlSource : berisi teks berbunyi list_fill_range!B57
  • TextColumn : berisi 1
Saat userform ditampilkan, maka cboProd akan berisi daftar yang bersumber dari sheet bernama list_fill_range pada area range A2:C5. Ketika user mengganti pilihan, maka cell B57 di sheet list_fill_range akan terisi dengan nilai dari kolom ke-2 dari list setelah combobox tidak lagi dalam keadaan aktif (kursor telah berpindah ke control lainnya). Hal ini diakibatkan oleh pengaturan properti ControlSource yang merujuk ke range di sheet tersebut. Sedangkan nilai yang diambil oleh ControlSource berasal dari properti Value yang diatur mengikuti isi properti BoundColumn yang merujuk pada kolom ke-2 dari list.

Event change pada cboProd bisa dimanfaatkan untuk menulis ke suatu range ataupun ke control lain saat user mengubah pilihan. Misalkan, saat user mengubah pilihan maka akan terjadi proses penulisan ke range tertentu seperti contoh prosedur sub pada event change cboProd berikut :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3

End Sub

Properti ControlSource juga dimiliki oleh control lain seperti TextBox. Misalnya di frmNomor1 tersebut juga ditambahkan 2 buah textbox. Textbox pertama diberi nama txtBound1 untuk terikat dengan range B57 (yang diisi oleh ControlSource milik combobox) dan textbox kedua diberi nama txtListIndex1 yang terikat dengan range B61. Isi properti ControlSource pada textbox txtBound1 berbunyi list_fill_range!B57 dan pada textbox txtListIndex1 berbunyi list_fill_range!B61. Setiapkali ada perubahan pada cell B57 dan B61, maka textbox juga akan berubah isinya ketika terjadi pembaruan tampilan frmNomor1. Pembaruan tampilan frmNomor1 bisa dipicu dengan mengganti control yang aktif melalui methods SetFocus. Jadi, pada event change milik cboProd juga bisa disertakan proses pembaruan tampilan ini dengan menambahkan baris-baris script berikut yang diletakkan pada bagian tepat sebelum End Sub setelah baris terakhir penulisan yang sudah ada.
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus


Penulisan item terpilih ke control yang ada dalam userform juga bisa dilakukan dengan script VBA dan tanpa properti ControlSource milik control yang menjadi target. Misalnya pada frmNomor1 diberi textbox berikut :
  • txtListIndex : diisi dengan nilai properti ListIndex dari cboProd
  • txtValue : diisi dengan nilai yang disimpan oleh properti Value milik cboProd
  • txtText : diisi dengan nilai yang disimpan oleh properti Text milik cboProd
  • txtCol2 : diisi dengan nilai yang diambil dari kolom ke-3 list yang berindeks kolom senilai 2
maka pada event change milik cboProd bisa tambahkan script penulisan tersebut yang berbunyi :
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1


Berikut ini adalah cuplikan gambar bentuk userform bernama frmNomor1 :
Contoh tampilan hasil penulisan yang dilakukan oleh proses yang ada dalam prosedur sub event change milik cboProd adalah :

Script lengkap dari prosedur sub event change milik cboProd berbunyi :
Private Sub cboProd_Change()
    'tulis informasi tentang data terpilih
   
    '>> ke worksheet 'Sheet1 (list_fill_range)'
    Sheet1.Range("b61").Value = cboProd.ListIndex   'ListIndex
    Sheet1.Range("b62").Value = cboProd.Text        'Text
    Sheet1.Range("b63").Value = cboProd.Value       'Value
    Sheet1.Range("b64").Value = cboProd.Column(2)   'Column indeks 2 [base 0]=kolom ke-3
    Sheet1.Range("b65").Value = cboProd.List(, 2)   'List indeks kolom 2 [base 0]=kolom ke-3
   
    '>> supaya textbox control yang menggunakan properti ControlSource terupdate
    txtBound1.SetFocus      'salah satu control di-set focus
    'jika ingin dikembalikan ke combobox cboProd, maka set focus ke cboprod
    cboProd.SetFocus
   
    '>> ke TextBox di frame fraScript dalam userform frmNomor1
    txtListIndex.Text = cboProd.ListIndex   'ListIndex
    txtValue.Text = cboProd.Value           'Value -> tergantung BoundColumn
    txtText.Text = cboProd.Text             'Text  -> tergantung TextColumn
   
    'mengambil nilai dari kolom tertentu bisa dengan
    'properti Column(indeks kolom) atau properti List( nilai list index , indeks kolom )
    'seperti :
    txtCol2.Text = cboProd.Column(2)        'Column(2) -> column(0) adalah kolom ke-1
    'atau
    txtCol2.Text = cboProd.List(, 2)        'List(,2) -> column(0) adalah kolom ke-1
End Sub


:)

Insya Allah pembahasan tentang combobox akan dilanjutkan pada coretan berikutnya. Pembahasan combobox yang akan dibahas berikutnya antara lain tentang pengisian list dengan script VBA memanfaatkan methods AddItem maupun properti List yang diletakkan pada prosedur sub event initialize userform. Juga dibahas tentang methods Clear untuk menghapus seluruh isi list combobox. Proses pengubahan nilai suatu item dalam list, menghapus sebuah item, menambahkan sebuah item di baris baru ataupun disisipkan pada baris tertentu juga akan dibahas disana. Dampak pengubahan isi list combobox yang memicu dijalankannya event change beserta salah satu cara menghindarinya akan disertakan pada pembahasan tersebut.




Wednesday, February 19, 2014

Permasalahan dengan Data tidak normal: Penyebab dan strategi permasalahan

Data terdistribusi secara normal adalah konsep umum yang sering salah paham oleh beberapa orang. Beberapa orang percaya bahwa semua data yang dikumpulkan dan digunakan untuk analisis harus didistribusikan secara normal. Tapi distribusi normal tidak terjadi sesering orang pikirkan , dan itu bukan tujuan utama . Distribusi normal adalah sarana untuk mencapai tujuan , bukan tujuan itu sendiri .

Data terdistribusi secara normal diperlukan untuk menggunakan sejumlah alat statistik , seperti analisis regresi, analisis Cp / Cpk , uji-t, analisis varians ( ANOVA ) dan masih banyak lagi. Jika seorang praktisi tidak menggunakan alat khusus seperti itu, bagaimanapun , tidak penting apakah data terdistribusi secara normal . Distribusi menjadi masalah hanya ketika praktisi mencapai suatu titik dalam sebuah proyek di mana mereka ingin menggunakan alat statistik yang memerlukan data terdistribusi normal dan mereka tidak memilikinya .
data tidak normal

Probabilitas plot pada Gambar di atas adalah contoh dari uji normalitas. Dalam hal ini , asumsi normalitas jelas tidak dapat terpenuhi, nilai p kurang dari 0,05 dan lebih dari 5 persen dari titik data berada di luar interval kepercayaan 95 persen .

Apa yang bisa dilakukan? Pada dasarnya, ada dua pilihan :

  1. Mengidentifikasi dan, jika mungkin, menentukan alasan data tidak normal dan mengatasinya atau
  2. Gunakan alat yang tidak memerlukan asumsi normalitas

Mengidentifikasi alasan data tidak normal

Ketika data tidak terdistribusi normal , penyebab non - normalitas harus ditentukan dan tindakan perbaikan yang tepat harus diambil . Ada enam alasan yang sering dialami untuk data tidak normal .

Alasan 1 : Data Ekstrim

Terlalu banyak nilai-nilai ekstrim dalam satu set data yang akan menghasilkan distribusi skewness(miring). Normalitas data dapat dicapai dengan menghilangkan data tersebut. Hal ini kemungkinan terjadi karena kesalahan menentukan pengukuran, kesalahan data-entry dan outlier dan untuk mengatasinya dengan menghapus data tersebut dari data yang digunakan untuk alasan yang masuk akal.

sangatlah penting bahwa outlier diidentifikasi sebagai penyebab yang benar-benar membuat data tidak normal sebelum mereka dieliminasi . Jangan lupa : Sifat data terdistribusi normal adalah bahwa kecil persentase dari nilai-nilai ekstrim yang diharapkan, tidak setiap outlier disebabkan oleh alasan khusus.

Alasan 2 : Tumpang tindih dari Dua atau Lebih Proses

Data tidak dapat terdistribusi secara normal karena sebenarnya berasal dari lebih dari satu proses , penjumlahan atau pergeseran, atau dari sebuah proses yang sering bergeser . Jika dua atau lebih set data yang terdistribusi secara normal yang tumpang tindih, data mungkin terlihat bimodal atau multimodal - itu akan memiliki dua atau lebih nilai yang paling sering terjadi.

Tindakan perbaikan untuk situasi ini adalah untuk menentukan X penyebab bimodal atau distribusi multimodal dan kemudian stratifikasi data . Data harus diperiksa lagi untuk normalitas dan setelah proses stratified dapat bekerja secara terpisah .

Gambar berikut menunjukkan data waktu akses website yang memiliki  data tidak normal pada sebuah website.
Website Load Time Data


Setelah stratifikasi waktu akses website antara akhir pekan dibandingkan Data hari kerja, menunjukkan kedua kelompok berdistribusi normal. sehingga bisa dijadikan perimbangan dalam analisis data yang akan.
hasil stratifikasi

Alasan 3 : Kurangnya data Diskriminasi

Round- off error atau perangkat pengukuran dengan resolusi rendah dapat membuat benar-benar data continues dan data terdistribusi normal terlihat diskrit dan tidak normal . Kurangnya data diskriminasi dan karena terbatasnya jumlah nilai yang berbeda - dapat diatasi dengan menggunakan sistem pengukuran yang lebih akurat atau dengan mengumpulkan lebih banyak data.

Alasan 4 : Data yang diurutkan

Data yang dikumpulkan tidak mungkin terdistribusi normal jika itu merupakan hanya bagian dari seluruh data dalam suatu proses. Hal ini dapat terjadi jika data dikumpulkan dan dianalisis setelah penyortiran. Data pada Gambar dibawah diperoleh dari proses produksi botol di mana target adalah untuk menghasilkan botol dengan volume 100 ml . Spesifikasi minimal dan maksimal yang dapat diterima adalah 97,5 ml dan 102,5 ml dan di luar spesifikasi tersebut dihapus dari proses analisis. Sehingga terlihat pada gambar dibawah ini. Dari data tersebut tentunya data tidak terdistribusi normal karena hanya sebagian yang dimasukkan yaitu yang masuk dalam spesifikasi.
sorted data

Alasan 5 : Nilai Mendekati Nol

Jika proses memiliki banyak nilai mendekati nol, distribusi data akan miring (skewness) ke kanan atau kiri. Dalam hal ini, transformasi seperti tenaga transformasi Box - Cox, dapat membantu membuat data normal. Dalam metode ini , semua data dinaikkan , atau diubah , dengan eksponen tertentu , ditunjukkan dengan nilai Lambda . Ketika melakukan transformasi, semua data harus dilakukan perlakuan (diubah) yang sama.

Gambar di bawah ini menggambarkan contoh dari konsep ini. Gambar menunjukkan satu set data siklus - waktu;
limited zero

menunjukkan data yang sama diubah setelah dilakukan transformasi dengan logaritma natural.
transformation box cox
Untuk bahasan transformasi box cox silahkan ke link "transormasi box cox"

Perhatikan : Metode transformasi tidak memberikan jaminan distribusi normal . Selalu periksa dengan uji normalitas untuk menentukan apakah distribusi normal dapat diterpenuhi setelah transformasi .

Alasan 6 Data Mengikuti Distribusi Berbeda

Ada banyak tipe data yang mengikuti distribusi non-normal. Contoh berikut:
  • Distribusi Weibull , ditemukan dengan data survival seperti waktu kelangsungan hidup suatu produk
  • Distribusi log - normal, ditemukan dengan panjang data seperti ketinggian
  • Distribusi Largest-extreme-value, ditemukan dengan data seperti waktu terpanjang down setiap hari
  • Distribusi eksponensial, ditemukan dengan data pertumbuhan seperti pertumbuhan bakteri
  • Distribusi Poisson, ditemukan dengan peristiwa langka seperti jumlah kecelakaan
  • Distribusi binomial, ditemukan dengan " proporsi " data seperti persen barang cacat
Jika data berikut salah satu distribusi yang berbeda , harus ditangani dengan menggunakan alat dengan menggunakan disribusi yang sama.

Alat analisis yang tidak mensyaratkan data normal

Beberapa alat statistik tidak memerlukan data terdistribusi normal . Untuk membantu para praktisi memahami kapan dan bagaimana alat ini dapat digunakan , tabel di bawah ini menunjukkan perbandingan alat yang tidak memerlukan distribusi normal dengan setara - distribusi normal.

Perbandingan alat analisis untuk data berdistribusi normal dan tidak normal
Alat analisis yang menggunakan data normalAlat analisis untuk data tidak normalDistribusi yang diperlukan
T-testMann-Whitney test; Mood’s median test; Kruskal-Wallis testAny
ANOVAMood’s median test; Kruskal-Wallis testAny
uji t berpasanganOne-sample sign testAny
F-test; Bartlett’s testLevene’s testAny
Analisis regresianalisis regresi non parametrikAny
Cp/Cpk analysisCp/Cpk analysisWeibull; log-normal; largest extreme value; Poisson; exponential; binomial

Tuesday, February 11, 2014

[Tutorial Eviews] Error Correction Mechanism (ECM)

Pada postingan sebelumnya suda dijelaskan beberapa hal mengenai Error Correction Mechanism (ECM). Nah, pada post ini akan dipaparkan praktek eviews, tahap-tahap ECM yang sudah dijelaskan sebelumnya di Teori ECM. Untuk tutorial, silahkan download datanya di sini.
Lebih jelas mengenai praktek tahap-tahap ECM tersebut dalam eviews adalah sebagai berikut:

I. Pengecekan Stasioneritas

Hal penting yang harus diingat ketika menganalisis data time series adalah mengutamakan pengecekan stasioneritas datanya sebelum diproses lebih lanjut (lebih detail mengenai uji stasioneritas menggunakan eviews bisa dilihat di postingan ini).
Khusus untuk metode ECM, pastikan seluruh variabel yang digunakan, tidak ada yang stasioner pada Level. Oleh karena itu, tahap pertama dalam tutorial ini adalah menguji stasioneritas seluruh variabel. Supaya lebih memudahkan, stasioneritasnya tidak usah dicek satu-satu tapi secara bersamaan. Caranya, pada Workfile ECM, block semua variabel yg ingin digunakan, klik kanan lalu pilih Open > as Group. Setelah itu akan muncul tampilan seperti gambar di bawah:
data lengkap

Selanjutnya, pada window baru, klik View > Unit Root Test, dan kemudian akan muncul window dengan nama "Group Unit Root Test" seperti gambar di bawah. Untuk tahap awal, set tipe data ke Level.
ecm option

Untuk uji stasioneritas kumpulan variabel ini, yang berbeda dengan 1 variabel adalah Test Type-nya (kotak hijau). Supaya stasioneritas masing-masing variabel bisa dicek, pilih Test Type yang ada kata "Individual..."-nya. Setelah itu klik OK, yang lain tidak usah diubah.
Berikutnya akan muncul window yang berisi output seperti:
philips perron


Bagian yang perlu diperhatikan adalah kolom Probability yang posisinya paling bawah output. Karena hasil pengujian yang diinginkan adalah seluruh variabel tidak stasioner pada Level, nilai probabilitas masing-masing variabel harus lebih besar dari alpha yang ditetapkan.
Misalnya kita pakai alpha=0.05, karena semua nilainya memang lebih besar dari 0.05, semua variabel tidak ada yg stasioner pada Level dan penerapan metode ECM, boleh dilanjutkan.
Agar lain kali bisa langsung dilihat, jangan lupa outputnya disimpan. Caranya, klik Freeze, setelah itu akan muncul window baru yang tampilannya sama. Di window baru, klik Name, terserah teman2 outputnya mau dinamai apa. Output yang disimpan tadi akan muncul sebagai objek baru dengan simbol simbol tabel
Untuk output2 berikutnya, kalau mau disimpan, silahkan pakai cara tersebut.

Kalau sudah dipastikan tidak ada yang stasioner di Level, ulangi langkah uji stasioneritasnya tapi dengan data 1st difference (gambar 2). Untuk contoh yg saya berikan, semua variabelnya stasioner pada tahap ini (difference pertama), sehingga pada output berikutnya, nilai kolom Probability semua variabel berada di bawah 0.05.
philips perron difference

Misalkan saja ada kasus dimana 1 saja variabel tidak stasioner pada difference pertama seperti yg lain, maka kita harus men-difference-kan semua variabel lagi ke 2nd difference dan seterusnya, sampai semuanya stasioner.

II. Estimasi persamaan jangka panjang

Variabel-variabel yang ingin digunakan dan telah memenuhi syarat pada tahap 1, pada tahap ini akan dibuat persamaan regresinya, dengan Y sebagai variabel terikat sedangkan sisanya, semua sebagai variabel bebas. Kembali ke Workfile ECM, block lagi semua variabelnya pilih Open > as Equation..., setelah itu akan akan muncul window tempat kita mengisi persamaan. Tulis persamaannya persis seperti gambar di bawah:

Pilihan yang lain tidak perlu diubah, setelah tulis persamaan langsung klik OK. Berikutnya akan muncul output yang berisi estimasi dari koefisien2 tiap variabel bebas. Perhatikan nilai2 signifikansi yang dilingkari pada gambar di bawah:
output ecm


Cek nilai F-statistic (kotak hijau) lebih dulu, kalau memang sudah lebih kecil dari alpha (0.05), barulah bisa kita cek nilai signifikansi masing2 variabel (kotak biru). Signifikansi masinng2 variabel tidak harus semuanya berada di bawah 0.05, kalau di dalam suatu penelitian, hal tersebut tergantung pada kajian teorinya. Namun, apabila nilai probabilitas suatu variabel bebas berada di bawah 0.05, maka variabel bebas tersebut dikatakan berpengaruh terhadap variabel terikatnya.

III. Pengecekan Kointegrasi

Pada teori mengenai ECM sebelumnya telah dijelaskan bahwa kointegrasi suatu persamaan regersi dapat dilihat dari residualnya. Apabila residual stasioner, terdapat kointegrasi.
Pada workfile ECM ada variabel dengan nama resid, yang merupakan tempat menyimpan residual persamaan yang baru saja diestimasi, sehingga nilainya berubah-ubah. Padahal residual persamaan jangka panjang, akan diuji stasioneritasnya dan digunakan sebagai variabel pada persamaan berikutnya. Oleh karena itu, langsung setelah estimasi persamaan jangka panjang, kita harus menyimpa residualnya dalam bentuk variabel baru yang tetap. Caranya adalah meng-generate variabel baru yg nilainya sama dengan variabel resid. Misal kita buat variabel baru tersebut dengan nama res menggunakan perintah seperti gambar di bawah lalu klik enter:

kointegrasi
Variabel baru dengan nama res tersebut kemudian kita uji stasioneritasnya seperti pada langkah pertama, klik kanan di variabelnya, Open, di window baru pilih View > Unit root test, pilih tipe data Level  lalu klik OK. Apabila kolom Prob* berisi nilai di bawah alpha (0.05), maka kita bisa lanjut ke estimasi persamaan jangka pendek.
output kointegrasi


Output di atas memberikan informasi bahwa variabel res stasioner pada Level, dan secara tersirat menyatakan bahwa Y, X1, X2, X3, X4, X5, dan X6 sailing berkointegrasi.

IV. Estimasi persamaan jangka pendek

Pada tahap ini, buat lagi persamaan regresi menggunakan variabel-variabel sebelumnya (tapi yg sudah distasionerkan) ditambah variabel res (tahun sebelumnya). Caranya, munculkan lagi window untuk memasukkan persamaan dengan memilih "Estimation Equation..." yang ada pada menu Quick (paling atas). Setelah itu akan muncul tampilan:
estimasi jangka pendek

Karena variabel Y, X1, X2, X3, X4, X5, dan X6 stasioner pada difference pertama, gunakan transformasi variabel-variabel tersebut ke bentuk difference pertama dalam persamaan. Jangan lupa menyertakan variabel res(-1) yg merupakan residual pada tahun sebelumnya. Tuliskan persamaan persis seperti pada kotak merah gambar di atas lalu klik OK. Setelah itu akan muncul output sepert ini:
hasil jangka pendek

Untuk persamaan jangka pendek, pertama-tama pastikan nilai probabilitas F-statistic berada di bawah alpha (0.05). Setelah itu, cek speed of adjustment-nya (koefisien dari res(-1)). Nilai koefisien tersebut harus negatif dan signifikan (probabilitasnya berada di bawah 0.05). Barulah kemudian kita cek probabilitas masing-masing variabel, yg mana saja yang nilainya signifikan atau berada di bawah alpha (0.05), sama seperti pada persamaan jangka panjang.

V. Pengecekan Asumsi

Tahap ini sebenarnya adalah tahap yang harus ada untuk semua metode yang menggunakan regresi dalam proses analisisnya. Pada bagian teori ECM juga hanya disinggung sedikit karena nanti akan dibahas satu-satu beserta tutorialnya pada postingan yang berbeda.

VI. Interpretasi

Setelah seluruh tahap-tahap ECM terpenuhi kita mendapatkan 2 persamaan yang menjadi inti dari digunakan metode ini. Dari sinilah pengaruh variabel-variabel bebas terhadap variabel terikat yang ingin kita teliti, dapat dijelaskan.
Berdasarkan output persamaan jangka panjang, didapatkan:

Yt = -8.0993 + 0.7422 X1t* - 0.3207 X2t* + 0.9738 X3t* + 0.4464 X4t - 0.1172 X5t* - 0.0253 X6t

ket : (*) --> variabel yang signifikan (<0.05)
        (t) --> periode atau tahun 


Persamaan ini hanya dapat memberikan kita informasi bahwa dalam jangka panjang, X1, X2, X3, dan X5 berpengaruh signifikan terhadap Y.
Sedangkan dari output persamaan jangka pendek, didapatkan:

ΔYt = 0.0025 + 0.4157 ΔX1t* - 0.3156 ΔX2t* + 1.0558 ΔX3t* + 0.0816 ΔX4t - 0.0739 ΔX5t* - 0.0741 ΔX6t - 0.6899 RESt-1

Persamaan tersebut memberikan kita informasi bahwa dalam jangka pendek, X1, X2, X3, dan X5 berpengaruh signifikan terhadap Y.
  1. Kenaikan perubahan X1 sebesar 1 unit akan menyebabkan kenaikan perubahan Y sebesar 0.42 unit,
  2. Kenaikan perubahan X2 sebesar 1 unit akan menyebabkan penurunan perubahan Y sebesar 0.32 unit,
  3. Kenaikan perubahan X3 sebesar 1 unit akan menyebabkan kenaikan perubahan Y sebesar 1.06 unit, dan
  4. Kenaikan perubahan X5 sebesar 1 unit akan menyebabkan penurunan perubahan Y sebesar 0.07 unit
Berdasarkan nilai speed of adjustment, ada sebesar 69% ketidakseimbangan, pada pengaruh jangka pendek X1, X2, X3, X4, X5, dan X6 terhadap Y, yg terkoreksi setiap periodenya.

Sunday, February 9, 2014

[Tutorial Minitab] Cara Mengatasi/Membuat Asumsi Data Normal dengan Box Cox Power Transformation

Sebelum ini sudah dibahas materi mengenai box cox transformation. penjelasan lengkap mengenai box cox transformation bisa ke link berikut Materi Box Cox Transformation. Kali ini akan dibahas mengenai tutorial box cox transformation diharapkan dapat mengubah data tidak normal menjadi normal. Software yang digunakan kali ini adalah minitab 16. Data yang digunakan berasal dari jurnal. data ini awalnya tidak normal dan diharapkan data menjadi normal setelah dilakukan box cox transformation. bagi yang pengen coba datanya berikut linknya Data Tidak Normal.

Langkah-langkah dalam Box Cox Transformation

Buka Aplikasi Minitab dan masukkan data sebagai berikut kedalam lembar kerja/Worksheet. berikut tampilannya.
data tidak normal

Proses Cek Data Normal

  1. Sebelum memulai langkah pertama kita cek dulu kenormalan data sehingga bisa dibuktikan apakah ampuh atau tidak box cox ini. caranya Klik Stat >> Basic Statistics >> Normality Test. Seperti pada gambar dibawah ini.
    tidak normal
  2. Maka akan tampil kotak dialog “Normality Test”. Masukkan nama kolom dari data hasil transformasi pada teks box “Variable”. dan pastikan bahwa “Percentile Lines” adalah “None”. Pada “Test for Normality” ada tiga jenis uji normalitas yaitu Anderson darling, Ryan-joiner (mirip shapiro Wilk) dan Kolmogorov Smirnov. Pilih yang Shapiro Wilk. Klik “OK”.

    output tidak normal
  3. Pehatikan gambar di atas. Nilai P-Value adalah 0,018 dimana <0,050 sehingga dapat ditarik kesimpulan bahwa data hasil tranformasi tidak terdistribusi secara normal. Selain itu dilihat dari plot yang tidak berada disekitar garis lurus menunjukkan data tidak normal. Nah, untuk itu diperlukan transformasi agar datanya normal.

Proses Transformasi Box Cox

  1. Mulai melakukan Transformasi Box-Cox dengan cara, Klik Stat >> Control Charts >> Box-Cox Transformation. Lihat gambar dibawah ini.
    box cox transformation
  2. Maka akan tampil kotak dialog “Box-Cox Transformation” seperti pada gambar dibawah ini: Pada Combo Box pilih “All observation for a chart are in one column”. dan pada teks area masukkan nama kolom dari urutan data yang tidak normal “C1 (tidak normal)”. Pada bagian “Subgroup Sizes” isikan dengan angka 25 (Banyaknya jumlah data).
  3. Klik “Options” maka akan tampil kotak “Box-Cox Transformation Options” dialog seperti dibawah ini: Pada pilihan “Store transformation data in”, masukkan nama kolom tempat hasil transformasi data. Pada contoh diatas yaitu pada kolom “hasil”. Lalu Klik “OK”.
    option box cox
  4. Setelah anda mengklik “OK” maka akan tampil data hasil transformasi pada kolom “hasil” dan tampil output hasil transformasi seperti dibawah ini.
    hasil box cox

Intrepretasi Hasil transformasi

  1. Pada tampilan chart sebelah kiri menunjukkan hubungan antara lambda dan standar deviasi. lambda yang dcoba dari 5 sampai -5. Terlihat pada gambar nilai standar deviasi semakin kecil berada pada Lower CL dan Upper CL yang berupa garis vertikal. batas itulah yang menunjukkan bahwa lambda yang terbaik berada pada garis tersebut karena nilai standar deviasi yang kecil.
  2. Nilai lambda yang baik Lower CL dan Upper CL -1,43 sampai 0,47 dimana nilai lambda yang terbaik yaitu -0,46. Namun nilai lambda yang sebaiknya diambil yaitu lambda yang memiliki makna atau mudah dimengerti. Sehingga minitab menyarankan nilai lambda yang diambil pada bagian "Rounded Value" yaitu -0,5. Pada gambar diatas juga terlihat hasil transformasi pada "C2 hasil". hasil transformasi tersebut dengan lambda -0,5.
  3. Untuk melihat apakah data sudah berubah menjadi data yang terdistribusi secara normal. Lakukan uji normalitas seperti cara di atas tapi dengan data hasil transformasi. berikut hasil output uji normalitas.
    output normal
  4. Pada hasil di atas terlihat titik data sudah berada di sekitar garis lurus. Selain itu, nilai P Value >0,100 sehingga bisa dikatakan hasil transformasi tersebut menjadi normal.

Proses Lanjutan

Kemudian muncul pertanyaan. Bagaimana dengan interpretasi hasil transformasi data tersebut. dengan lambda -0,5 agak susah karena variabelnya dari Y menjadi 1/root. sehingga agak susah kali yaa. Saya sedikit memberikan masukkan. nilai lambda tersebut masih bisa diganti dengan nilai lainnya yang mungkin bisa punya makna misalnya jika nilai 0 maka variabel Y menjadi ln Y. ada beberapa yang mengatakan bahwa interpretasi dari ln adalah pertumbuhan dari data tersebut.
Dari hasil diatas terlihat bahwa lambda berada antara nilai -1,43 sampai 0,47. sehingga lambda yang mungkin adalah -1, -0,5 atau 0. Silahkan pilih yang mana yang kira-kira punya makna. kalau saya coba pakai lambda 0.

Caranya agar bisa transformasi pake lambda 0.Stat > Control Charts > Box-Cox Transformation. Kemudian setelah melakukan seperti cara di atas pilih option maka akan muncul tampilan berikut.
option pakai ln
Pada gambar tersebut terdapat Optimal or rounded lambda yang merupakan perintah untuk minitab transformasi dengan nilai rounded lambda. Nah, jika mau menentukan sendiri pilih Others dan masukkan nilai lambda antara 5 sampai -5. disini saya menggunakan lambda = 0. Setelah dilakukan transformasi dan di uji normalitas ternyata datanya juga normal. Kalau mau buktikan silahkan coba sendiri. yaaaaa.

Sumber: -www.slideshare.net/miradzji/transformasi-boxcox -www.scribd.com/doc/84753288/2-Box-Cox-Dwi-Isprianti(Jurnal) -Transformasi Box-Cox pada Analisis Regresi Linier Sederhana(Jurnal)

Saturday, February 8, 2014

Cara Mengatasi/Membuat Asumsi Data Normal dengan Box Cox Power Transformation

Analisis statistik sangatlah penting bagi ilmuwan, khususnya para peneliti, baik ilmuwan bidang sosial maupun eksakta. analisis statistik bisa digunakan untuk mengetahui keadaaan masa lalu, masa sekarang dan bahkan meramalkan keadaan masa depan yang tentunya bisa dijadikan bahan buat kebijakan yang akan diambil. Dalam melakukan analisis tentunya tidak semudah itu karena harus mengikuti rambu-rambu ilmiah yang biasa disebut asumsi. Asumsi yang biasa terkenal di bidang statistik yaitu kenormalan data , kehomogenan ragam dan linieritas tak dipenuhi dan sebagainya. Untuk mengatasi hal tersebut salah satu cara yang dapat dilakukan yaitu transformasi terhadap variabel respon.

Apa itu Transformasi?

Transformasi berarti bahwa setiap data dilakukan operasi matematika yang sama pada data aslinya. contoh transformsi pada kehidupan sehari-hari pertukaran nilai tukar. misalnya Dollar menjadi Rupiah, biasanya dikalikan dengan angka tertentu biasanya 10.000. dikalikan 10.000 ini yang dimaksud pada operasi matematika.contoh lain yaitu mengubah suhu derajat celsius menjadi fahrenheit. Pada kedua contoh diatas merupakan transformasi linear karena hanya mengali atau membagi data asli. Sehingga hanya mengubah ukuran tapi tidak mengubah bentuk yang tentu saja tidak akan membuat data jadi normal. Berikut contoh gambaran agar mempermudah pemahaman.
contoh transformasi

Box Cox power transformation

Berbeda dengan transformasi diatas, statistician George Box dan David Cox mencoba membuat transformasi data sehingga bisa mengatasi data normal. Transformasi ini dikenal dengan box cox yang berasal dari nama mereka berdua. Transformasi Box Cox yaitu transformasi pangkat berparameter tunggal λ(lambda), katakanlah terhadap Variabel Y, maka dapat dilakukan transfomasi terhadap Y yang dipangkatkan dengan parameter λ ,sehingga menjadi Yλ . nilai λ biasanya antara -5 sampe 5. Pendugaan parameter dapat dicari dengan menggunakan Metode Kemungkinan Maksimum ( Maximum Likehood Method). dari banyak nilai λ dipilih sedemikian sehingga didapat jumlah kuadrat sisaan paling minimum yang diharapkan memperoleh transformasi terbaik.

Nilai λ menetukan kekuatan relative dari sebuah transformasi. Tabel dibawah menunjukkan pengaruh nilai λ terhadap Y setelah dilakukan transformasi. untuk lebih jelasnya dapat dilihat pada tabel dibawah ini.
λ(lambda)
Transformasi
2
Y2
0,5
root
0
log Y/ln Y
-0.5
1/root
-1
1/Y

Contoh gambaran box cox transformation dalam mengubah data tidak normal menjadi data normal

Contoh berikut menggunakan data yang tidak normal. berikut plot dari data tidak normal sehingga bisa dibandingkan dengan hasillnya nanti.
data tidak normal

Setelah itu dilakukan transformasi box cox menggunakan software statistik. pada contoh dibawah ini menggunakan output dari minitab. sehingga diperoleh salah satu output seperti berikut.
box cox minitab

Nilai lower and upper confidence levels (CLs) pada gambar yang berupa garis vertikal menunjukkan nilai lambda yang terbaik untuk data normal yaitu -2,48003 dan -0,69483 dengan nilai lambda yang terbaik yaitu -1,53932. Tapi nilai lambda yang terbaik diambil yaitu berupa bilangan yang bisa dipahami transformasinya seperti pada tabel di atas. pada bagian bawah tersebut terdapat nilai best value -2 yang menunjukkan nilai lambda terbaik sebaiknya diambil. tapi untuk nilai -1 juga bisa karena berada pada batas tadi. silahkan putuskan dengan bijak karena datanya sudah normal untuk keduanya. berikut hasil data setelah ditransformasi dengan lambda = -1.
hasil transformasi

Apakah Box cox power transformation bekerja 100% untuk data normal?

Box-Cox power transformation bukanlah jaminan normalitas. Hal ini karena sebenarnya box cox tidak benar-benar memeriksa normalitas, box cox hanya mengecek metode berdasarkan standar deviasi terkecil. Asumsinya adalah bahwa di antara semua transformasi dengan nilai Lambda antara -5 dan +5, data yang ditransformasikan memiliki kemungkinan tertinggi - tapi bukan jaminan- terdistribusi secara normal ketika deviasi standar adalah yang terkecil. Oleh karena itu, sangatlah penting untuk selalu memeriksa data ditransformasikan normalitas menggunakan plot probabilitas.

Selain itu, Power transformasi Box-Cox hanya bekerja jika semua data positif dan lebih besar dari 0. Ini, bagaimanapun, biasanya dapat dicapai dengan mudah dengan menambahkan konstan (c) untuk semua data sedemikian rupa sehingga semua menjadi positif sebelum berubah.
Untuk Tutorial Box Cox Transformation Silahkan Klik Tutorial Minitab Box Cox Transformation

Resources: -www.isixsigma.com/tools-templates/normality/making-data-normal-using-box-cox-power-transformation -www.scribd.com/doc/84753288/2-Box-Cox-Dwi-Isprianti

Monday, February 3, 2014

Error Correction Mechanism (ECM)

Error Correction Mechanism (ECM) merupakan analisis data time series yang digunakan untuk variabel-variabel yang memilki ketergantungan yang sering disebut dengan kointegrasi. Metode ECM digunakan menyeimbangkan hubungan ekonomi jangka pendek variabel-variabel yang telah memiliki keseimbangan/hubungan ekonomi jangka panjang.

Apa itu Kointegrasi?

Analisis data time series mensyaratkan stasioneritas sebagai salah satu dasar penting keabsahan prosesnya. Pada postingan sebelumnya, telah dibahas sedikit mengenai teori dan cara mengecek stasioneritas pada suatu data time series (bagi yang belum baca, silahkan cek di sini). Berkaitan dengan topik tersebut, terdapat keadaan dimana kita dapat menganalisis hubungan variabel-variabel time series, walaupun ketika variabel-variabel tersebut tidak stasioner, yaitu ketika kombinasi linier variabel2 tersebut, stasioner. Kondisi tersebut dikenal sebagai kointegrasi. Misalkan ketika kita menganalisis pengaruh pendapatan (misal dilambangkan X) terhadap konsumsi (dilambangkan dengan Y), dengan kondisi kedua variabel tersebut tidak stasioner. Namun ketika variabel tabungan (dilambangkan dengan E), yang merupakan kombinasi linier dari X dan Y (E=X-Y), stasioner, X dan Y dikatakan saling berkointegrasi. Apabila dijelaskan dalam gambar, maka pergerakan Y dan X akan seperti ini:
Sepeti terlihat pada gambar, ciri khas dari variabel-variabel yang berkointegrasi adalah pergerakan yang sama atau beriringan. Oleh karena itu, pergerakan variabel E yang merupakan hasil X-Y akan stasioner seperti gambar di bawah:

Menurut Enders (2004) terdapat beberapa karakteristik penting mengenai kointegrasi beberapa variabel, yaitu:
  1. Kointegrasi mengacu pada kombinasi linier dari variabel-variabel nonstasioner.
  2. Semua variabel yang terkait harus dalam orde integrasi yang sama.
  3. Jika xt memiliki n komponen, maka ada sebanyak n-1 kombinasi linier yang mungkin terjadi → n-1 vektor kointegrasi yang mungkin.
  4. Kebanyakan kajian kointegrasi fokus pada variabel dengan l(d=1) karena jarang sekali variabel-variabel dalam ekonomi yang terintegrasi pada orde d>1.
*I(d=1) → difference pertama

Pengujian kointegrasi antara variabel bertujuan menunjukkan adanya hubungan atau keseimbangan jangka panjang pada variabel bebas terhadap variabel terikat. Akan tetapi, di dalam jangka pendek terdapat kemungkinan bahwa antar variabel tersebut terjadi ketidakseimbangan. Ketidakseimbangan inilah yang sering kita temui dalam perilaku ekonomi, dimana hal ini disebabkan ketidakmampuan pelaku ekonomi untuk segera menyesuaikan perubahan-perubahan yang terjadi dalam perilaku variabel ekonomi (Harris dan Sollis, 2003). Karena ketidakseimbangan inilah Error Correction Mechanism (ECM) digunakan. ECM memanfaatkan residual/error dari hubungan jangka panjang untuk menyeimbangkan hubungan jangka pendeknya. Oleh karena itu, dinamakan error correction.

Error Correction Mechanism (ECM)  membagi persamaan varabel-variabel yang saling berkointegrasi menjadi 2 persamaan yaitu persamaan jangka panjang dan jangka pendek. Keadaan konteegrasi dalam model ECM dilihat pada stasioneritas residualnya. Hal ini kemudian mengharuskan variabel-variabel yang kita miliki tidak ada yang stasioner pada level dan residual/error (e) persamaan regresi variabel-variabel tersebut stasioner pada level.


Sejarah singkat tentang ECM

Istilah Error Correction Mechanism (ECM) sudah diperkenalkan sejak tahun 1950an oleh beberapa pakar ekonometrik. Metode ini pertama kali digunakan oleh Prof. Dennis Sargan dalam penelitiannya tentang upah dan harga di UK. Dalam perkembangannya, metode ini kemudian dipopulerkan oleh Engle-Granger.

Keuntungan ECM sebagai model dinamik dalam analisis data runtun waktu:

  1. ECM dapat melakukan spesifikasi model atas bentuk umumnya, 
  2. ECM dapat menjelaskan informasi jangka panjang dan jangka pendek dari data (Vamvoukas, 1998), serta dapat diketahui konsisten tidaknya model empirik dengan teori ekonomi, 
  3. ECM sebagai salah satu model dinamik untuk mencari penyelesaian data runtun waktu yang tidak stasioner
  4. mencari penyelesaian masalah multikolliniaritas dan regresi lancung (Insukindro (1992:14, 1999:2), Thomas (1997:388 – 390)).

Tahap-Tahap  Penerapan ECM

1) Cek stasioneritas seluruh variabel → kalau tidak memenuhi syarat tadi, ECM tidak bisa digunakan
2) Estimasi persamaan jangka panjang persamaan jangka panjang pada ECM adalah persamaan regresi biasa dengan variabel y dan x, yang tidak stasioner pada level. Kemudian, error (e) pada persamaan regresi jangka panjang inilah yang menentukan adanya kointegrasi atau tidak pada variabel y dan x tersebut. Apabila e stasioner pada level, maka y dan x saling berkointegrasi. Persamaan jangka panjang ini sering disebut sebagai persamaaan keseimbangan dan hanya dapat digunakan apabila residual/error (e)-nya stasioner pada level.
Persamaan Jangka Panjang
3) Uji kointegrasi → cek stasioneritas dari residual/error (e), kalau stasioner di level, ECM-nya dilanjutkan
4) Persamaan jangka pendek e yang stasioner pada persamaan jangka panjang, tidak digunkan hanya untuk mengetahui ada tidaknya kointegrasi tapi juga digunakan sebagai salah satu variabel pada persamaan jangka pendek. Persamaan jangka pendek juga menggunakan variebel2 yang sama dengan variabel2 yang ada pada persamaan jangka panjang, hanya saja variabel2 tersebut telah distasionerkan, semuanya pada orde yang sama. Mungkin akan lebih dimengerti lewat persamaan berikut:

Persamaan Jangka Pendek

Koefisien γ pada persamaan di atas yang juga sering disebut sebagai speed of adjustment merupakan kecepatan residual/error (e) pada periode sebelumnya untuk mengoreksi perubahan variabel y menuju keseimbangan pada periode selanjutnya.
Nah, pada tahap ini ada syarat terakhir yang harus dipenuhi supaya ECM-nya sah; Koefisien γ harus signifikan dan negatif (referensinya mungkin bisa dilihat di buku Ekonometrik edisi 5 punyanya Baltagi).
Persamaan jangka panjang pada metode ECM memilki keterbatasan interpretasi, sedangkan persamaan jangka pendeknya bebas diinterpretasikan, tentu saja dengan pengujian asumsi2 regresi dulu sebelumnya. Koefisien regresi pada persamaan jangka panjang hanya dapat diinterpretasi berdasarkan arah pengaruhnya, positif atau negatif.

Sumber:
Enders, Walter. (2004). Applied Econometrics Time Series (2rd ed). New York: Wiley.
Gujarati, Damodar N. (2004). Basic Econometrics, (4th ed). The McGraw−Hill Companies.
Greene, Wlliam H. (2003). Econometric Analysis (5th ed). New York: Prentice Hall.
Baltagi, Badi H. (2011). Econometrics (5th ed). New York. Springer.