Laporan 5 Praktikum Pemrograman Statistik - Tugas Satria June Adwendi

Link Rpubs : klik disini

Praktikum Pertemuan 11 - Komputasi Untuk Regresi

Prosedur Sweep Operator (Eliminasi)

Secara numerik pendugaan koefisien regresi dilakukan dengan suatu algoritma yang disebut Sweep Operator. Algoritma ini berdasarkan eliminasi (Gauss elimination) terhadap matriks simetrik, A, yang berukuran m×m. Unsur diagonal utama matriks A, yaitu akk≠0 , k=1,2,…,m

Prosedur ini digunakan untuk menentukan :

  1. matriks kebalikan (inverse) -> A-1
  1. penduga koefisien regresi ->𝜷duga
  1. JKG (Jumlah Kuadrat Galat)

Latihan

library(fastmatrix)
y = c(1, 3, 3, 2, 2, 1) # vector y
x1 = c(1, 2, 3, 1, 2, 3)    # vector x1
x2 = c(1, 1, 1, -1, -1, -1)  # vector x2
s = c(1,1,1,1,1,1)  # vector ‘satu’
X=cbind(s,x1,x2)    # menggabungkan vector s, x1, dan x2
XX=t(X)%*%X # X’X
Xy=t(X)%*%y # X’y
yX=t(y)%*%X # y’X
yy=t(y)%*%y # y’y
b1=cbind(XX,Xy) # menggabungkan X’X dan X’y
b2=cbind(yX,yy) # menggabungkan y’X dan y’y
b=rbind(b1,b2)  # menggabungkan X’X , X’y , y’X , dan y’y

sweep.operator(b, 1:3)
##            s    x1         x2          
## s   1.166667 -0.50  0.0000000 1.5000000
## x1 -0.500000  0.25  0.0000000 0.2500000
## x2  0.000000  0.00  0.1666667 0.3333333
##    -1.500000 -0.25 -0.3333333 3.0833333
round(sweep.operator(b, 1:3),3)
##         s    x1     x2      
## s   1.167 -0.50  0.000 1.500
## x1 -0.500  0.25  0.000 0.250
## x2  0.000  0.00  0.167 0.333
##    -1.500 -0.25 -0.333 3.083
k1=sweep.operator(b, k = 1)
k1
##             s x1 x2  
## s   0.1666667  2  0 2
## x1 -2.0000000  4  0 1
## x2  0.0000000  0  6 2
##    -2.0000000  1  2 4
k2=sweep.operator(b, k = 1:2)
k2
##            s    x1 x2     
## s   1.166667 -0.50  0 1.50
## x1 -0.500000  0.25  0 0.25
## x2  0.000000  0.00  6 2.00
##    -1.500000 -0.25  2 3.75
k3=sweep.operator(b, k = 1:3)
k3
##            s    x1         x2          
## s   1.166667 -0.50  0.0000000 1.5000000
## x1 -0.500000  0.25  0.0000000 0.2500000
## x2  0.000000  0.00  0.1666667 0.3333333
##    -1.500000 -0.25 -0.3333333 3.0833333
k4=sweep.operator(b, k=c(1,3))
k4
##             s x1         x2          
## s   0.1666667  2  0.0000000 2.0000000
## x1 -2.0000000  4  0.0000000 1.0000000
## x2  0.0000000  0  0.1666667 0.3333333
##    -2.0000000  1 -0.3333333 3.3333333

Dekomposisi Cholesky

Menghasilkan matriks segitiga bawah (akar kuadrat) dari matriks simetrik.

Penyelesaian persamaan linier berdasarkan matriks segitiga bawah (sederhana).

Untuk regresi linier sederhana dan berganda.

Faktorisasi matriks.

Latihan

#Solve the equation X’X β = X’y
#Dekomposisi Cholesky terhadap X’X -> LL’, Ll = X’y -> l , dan L’β = l -> 𝜷duga.

cho=t(chol(XX)) # LL’
el=solve(cho,Xy)    # Lc = X’y (el adalah c ) -> L’β = c 
el
##         [,1]
## s  4.8989795
## x1 0.5000000
## x2 0.8164966
beta=solve(t(cho),el)   # L’β = c  (beta adalah 𝜷 ̂)
beta
##         [,1]
## s  1.5000000
## x1 0.2500000
## x2 0.3333333
t(y)%*%y - t(el)%*%el      # d2 = y’y-l’l = y’y -y’X(X’X)-1X’y = JKG
##          [,1]
## [1,] 3.083333

Praktikum Pertemuan 12 - EM Algorithm

Suatu prosedur iteratif untuk pendugaan parameter menggunakan metode kemungkinan maksimum (maximum likehood). Konsep dasar: menggabungkan data pengamatan dengan data tidak teramati (hilang/tersembunyi) sehingga bentuk fungsi kemungkinannya lebih mudah untuk dianalisis.

Algoritma (EM):

  1. begin

  2. initialize θ0, T, i=0

  3. do i <- i + 1

  4. E step: compute Q(θ; θi)

  5. M step: θi+1 <- arg max Q(θ; θi)

  6. until [Q(θi+1; θi) - Q(θi; θi-1)] ≤ T

  7. return 𝜃cap <- θi+1

  8. end

Contoh 1

Pendugaan parameter pada data tabulasi dua arah dengan satu buah data hilang (Pawitan, 2001). Pendugaan berdasarkan model rancangan berikut: yij = Miyu + Alphai + Betaj + εij, i =1,2 dan j=1,2,3 Data pengamatan berdasarkan model itu adalah yij:

y11 10

y12 15

y13 17

y21 22

y22 23

y23 ==> data hilang

# Rumus EM dalam rancob

emrancob <- function(ftn, x,yij,i, j, tol = 1e-9, max.iter = 100) {
  yold <- yij
  ynew <- ftn(x,yold,i,j)
  iter <- 1
  cat("At iteration 1 value of x is:", ynew, "\n")
  
  while ((abs(ynew-yold) > tol) && (iter < max.iter)) {
    yold <- ynew;
    ynew <- ftn(x,yold,i,j);
    iter <- iter + 1
    cat("At iteration", iter, "value of x is:", ynew, "\n")
  }
  
  if (abs(ynew-yold) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    return(ynew)
  }
}


# Masukkan urutan matrix yang akan dicari (y23)
ftn <- function(x,yij,i,j){
  x <- matrix(c(10,15,17,22,23,yij),ncol=3,byrow=TRUE)
  mu <- mean(x)
  alfai <- mean(x[i,])- mu
  betaj <- mean(x[,j])- mu
  yij <- mu + alfai + betaj
  return(yij)
}

# Cari y23, dengan nilai awal 0, i=2, j=3
emrancob(ftn, x,0,2,3, tol = 1e-4, max.iter = 100) 
## At iteration 1 value of x is: 9 
## At iteration 2 value of x is: 15 
## At iteration 3 value of x is: 19 
## At iteration 4 value of x is: 21.66667 
## At iteration 5 value of x is: 23.44444 
## At iteration 6 value of x is: 24.62963 
## At iteration 7 value of x is: 25.41975 
## At iteration 8 value of x is: 25.9465 
## At iteration 9 value of x is: 26.29767 
## At iteration 10 value of x is: 26.53178 
## At iteration 11 value of x is: 26.68785 
## At iteration 12 value of x is: 26.7919 
## At iteration 13 value of x is: 26.86127 
## At iteration 14 value of x is: 26.90751 
## At iteration 15 value of x is: 26.93834 
## At iteration 16 value of x is: 26.95889 
## At iteration 17 value of x is: 26.9726 
## At iteration 18 value of x is: 26.98173 
## At iteration 19 value of x is: 26.98782 
## At iteration 20 value of x is: 26.99188 
## At iteration 21 value of x is: 26.99459 
## At iteration 22 value of x is: 26.99639 
## At iteration 23 value of x is: 26.99759 
## At iteration 24 value of x is: 26.9984 
## At iteration 25 value of x is: 26.99893 
## At iteration 26 value of x is: 26.99929 
## At iteration 27 value of x is: 26.99952 
## At iteration 28 value of x is: 26.99968 
## At iteration 29 value of x is: 26.99979 
## At iteration 30 value of x is: 26.99986 
## Algorithm converged
## [1] 26.99986

Teladan 1

Pendugaan parameter pada data genetika (Rao 1973, hal 369), diasumsikan data fenotipe y=(y1,y2,y3,y4)=(125,18,20,34) memiliki distribusi multinomial dengan peluang

{1/2+θ/4,1−θ/4,1−θ/4,θ/4} sehingga fungsi peluang bagi y adalah

Dugalah data hilang x1 dan x2 dengan EM algorithm!

expectation1 <- function(theta) {125*( 1/2 / ((1/2)+(1/4)*theta) )}
expectation2 <- function(theta) {125*( ((1/4)*theta) / ((1/2)+(1/4)*theta) )}
maximization <- function(x2) {(x2 + x5) / (x2 + x3 + x4 + x5)}

x1 <- 10 #initial value
x2 <- 20 #initial value 
x3 <- 18
x4 <- 20
x5 <- 34
niter <- 100
theta0 <- 100 #initial value
save_iter <- data.frame("iter"=0,"theta"=theta0,"x1"=x1,"x2"=x2)
for (i in 1:niter){
  x1 <- expectation1(theta0)
  x2 <- expectation2(theta0)
  theta <- maximization(x2)
  criteria <- abs(theta-theta0)
  theta0 <- theta
  save_iter <- rbind(save_iter,c(i,theta0,x1,x2))
  if (criteria<10^-7) break
}

save_iter
##    iter       theta       x1        x2
## 1     0 100.0000000 10.00000  20.00000
## 2     1   0.8046765  2.45098 122.54902
## 3     2   0.6477018 89.13684  35.86316
## 4     3   0.6295520 94.42151  30.57849
## 5     4   0.6271833 95.07323  29.92677
## 6     5   0.6268695 95.15895  29.84105
## 7     6   0.6268279 95.17031  29.82969
## 8     7   0.6268223 95.17182  29.82818
## 9     8   0.6268216 95.17202  29.82798
## 10    9   0.6268215 95.17205  29.82795

Praktikum Pertemuan 13 - Resampling

Proses pendugaan parameter selalu didasari dengan asumsi sebaran dan ukuran contoh yang memadai. Asumsi sebaran ini menjadi dasar penentuan selang kepercayaan bagi parameter (misal 𝜇). Selang kepercayaan bagi 𝜇 juga bisa diperoleh meskipun contoh acak berukuran kecil tetapi kita mengasumsikan populasinya memiliki sebaran Normal. Seandainya contoh acak berukuran kecil dan sebaran populasinya tidak diketahui, selang kepercayaan bagi parameter tidak bisa diperoleh tanpa sebaran.

Contoh acak berukuran kecil tidak jarang diperoleh dan bahkan tidak ada informasi tentang sebarannya.Pendugaan selang bagi parameter harus dengan metode yang didasarkan pada asumsi sebaran. Sebaran populasi data tidak diketahui sehingga kita tidak mempunyai dasar yang kuat untuk menduga selang kepecayaan tanpa sebaran. Bootstrap dan Jackknife dapat digunakan sebagai cara pendugaan selang dalam kondisi data berukuran kecil dan tidak memenuhi asumsi sebaran.

library(boot)

Boostrap

Jacknife

Cross-Validation

Salah satu metode evaluasi pemodelan statistik

Kasus khusus dari validasi

Menggunakan konsep dari jackknife

Validasi vs validasi silang (CV)

Pada proses validasi, setiap observasi hanya berperan sebagai anggota data latih/training saja atau sebagai anggota data validasi saja. Jika dilakukan pengulangan, pengacakan pembagian data latih dan validasi dilakukan pada setiap ulangan.

Pada proses validasi silang, setiap observasi berperan menjadi data latih dan validasi, yaitu satu kali menjadi data validasi dan sisanya menjadi data latih. Pengacakan pembagian data menjadi k bagian dilakukan satu kali di awal, kemudian setiap bagian secara bergantian menjadi data latih dan data validasi.

Jenis CV yg banyak digunakan: LOO-CV (leave-one-out CV) dan k-fold CV

LOO-CV

  1. Sisihkan satu buah amatan sebagai gugus data validasi, sedangkan (n-1) amatan lainnya sebagai gugus data training

  2. Susun model analisis menggunakan data training, dan lakukan prediksi terhadap data validasi yang hanya berisi satu amatan tadi

3.Hitung galat prediksi. Misal jika respon berupa numerik: cv(−k) = 1/nk √(Σ(y_cap−y)^2)

4.Ulangi langkah 1-3 dengan menggunakan satu amatan lainnya sebagai gugus validasi

K-fold CV

  1. Bagi gugus data menjadi k buah bagian yang berisi amatan dengan banyaknya yang sama (hampir sama). Misal k=10 dan n=250 maka tiap bagian berisi 25.

  2. Gunakan salah satu bagian sebagai gugus data validasi dan (k-1) bagian lain sebagai gugus data training.

3.Susun model analisis menggunakan data training, dan lakukan prediksi respon pada data validasi. 4. Hitung galat prediksi. Misal jika respon berupa numerik: cv(−k) = 1/nk √(Σ(y_cap−y)^2)

5.Ulangi langkah 1-4 dengan menggunakan satu bagian lainnya sebagai gugus validasi dan sisanya sebagai data training. Ulangi hingga seluruh k buah bagian pernah menjadi data validasi.

Latihan 1

Tabel di bawah ini melaporkan jumlah populasi dari n=49 kota di USA pada tahun 1920 dan 1930, yang dinotasikan dengan u dan x.

Berdasarkan data ini, peniliti tertarik untuk menghitung rasio dari mean yang nantinya dapat digunakan untuk menduga populasi total USA pada tahun 1930 berdasarkan jumlah populasi pada tahun 1920. Jika kota-kota ini merupakan sampel acak dengan (U,X) menotasikan pasangan nilai populasi dari kota yang terpilih secara acak, maka total populasi 1930 merupakan hasil perkalian antara total populasi 1920 dengan rasio dari ekspetasi θ=E(X)/E(U), yang merupakan parameter rasio yang akan diduga. Dengan menggunakan bootstrap dan jackknife, hitunglah galat baku (standard error) dari θ_cap, yang merupakan √V(θ_cap), jika diketahui θ_cap=(x/u)!

Jawab:

Bootstrap

# Import data ke R
dataCity <- read.table(header = TRUE,text=
'u  x 
138 143
93  104
61  69
179 260
48  75
37  63
29  50
23  48
30  111
2   50
38  52
46  53
71  79
25  57
298 317
74  93
50  58
76  80
381 464
387 459
78  106
60  57
507 634
50  64
77  89
64  77
40  60
136 139
243 291
256 288
94  85
36  46
45  53
67  67
120 115
172 183
66  86
46  65
121 113
44  58
64  63
56  142
40  64
116 130
87  105
43  61
43  50
161 232
36  54
')
  1. Cara Pertama : Boostraping dengan program R sendiri
  1. Bangkitan sampel baru dengan menggunakan metode penarikan sampel/contoh dengan pengembalian (with replacement) sebanyak B kali.
n <- nrow(dataCity)
B <- 1000
# sampel diambil berdasarkan urutan amatan/index
set.seed(123)
index <- replicate(B,sample.int(n,size =n,replace = TRUE))
  1. Hitung penduga untuk setiap sampel baru
#penduga theta
thetaHat <- function(data) {mean(data$x) / mean(data$u)}
thetaBoost <- NULL
for (i in 1:B){  
  thetaBoost <- c(thetaBoost, thetaHat(dataCity[index[ ,i], ]))
}
head(thetaBoost,n=20)
##  [1] 1.332714 1.189381 1.248475 1.251276 1.323737 1.228723 1.228209 1.231559
##  [9] 1.279538 1.263938 1.245061 1.191353 1.271465 1.215520 1.289922 1.309773
## [17] 1.266583 1.206254 1.194978 1.208488
mean(thetaBoost)
## [1] 1.23997
  1. Gunakan hasil pada (b) untuk menghitung ragam V(θ_cap)

Ragam V(θ_cap) bisa didekati menggunakan ragam bootstrap V(θ^(B)).

# ragam
ragamTheta <- var(thetaBoost)
ragamTheta
## [1] 0.001208174
# galat baku
sqrt(ragamTheta)
## [1] 0.03475879
  1. Cara Kedua : Boostraping dengan menggunakan package boot
thetaBoost2 <- function(data,index){
  dataBoost <- data[index, ]
  mean(dataBoost$x) / mean(dataBoost$u)
}
bootCity <- boot(data = dataCity,R = 1000,statistic = thetaBoost2)
bootCity
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = dataCity, statistic = thetaBoost2, R = 1000)
## 
## 
## Bootstrap Statistics :
##     original      bias    std. error
## t1* 1.239019 0.003905339    0.036673

Jacknife

  1. Bangkitan sampel baru dengan menghilangkan satu amatan pada setiap ulangan.
n <- nrow(dataCity)
# menghilangkan satu amatan
removeOne <- function(i,data) seq(nrow(data))[-i]
set.seed(123)
index <- sapply(1:n,removeOne,data=dataCity)
  1. Hitung penduga untuk setiap sampel baru
#penduga theta
thetaHat <- function(data) {mean(data$x) / mean(data$u)}
thetaJack <- NULL
for (i in 1:n){  
thetaJack <- c(thetaJack, thetaHat(dataCity[index[ ,i], ]))
}
thetaJack
##  [1] 1.244711 1.241282 1.240336 1.231179 1.235917 1.235599 1.236219 1.235142
##  [9] 1.224323 1.229612 1.238038 1.239816 1.240819 1.233844 1.250000 1.238755
## [17] 1.239808 1.241864 1.240745 1.243411 1.237138 1.242491 1.237739 1.238609
## [25] 1.240305 1.239479 1.236937 1.245018 1.241114 1.245102 1.245363 1.238741
## [33] 1.239569 1.242230 1.245845 1.245186 1.238172 1.237420 1.246503 1.238323
## [41] 1.242285 1.224490 1.236139 1.241798 1.239581 1.237478 1.239673 1.232373
## [49] 1.237146
mean(thetaJack)
## [1] 1.239054
  1. Gunakan hasil pada b untuk menghitung ragam V(θ_cap)

Ragam V(θ_cap) bisa didekati menggunakan ragam jacknife V(θ_cap^(Jack)).

# ragam
ragamTheta2 <- (((n-1)^2)/n)*var(thetaJack)
ragamTheta2
## [1] 0.001192619
# standard error
sqrt(ragamTheta2)
## [1] 0.03453431
matrix(c(mean(thetaBoost),sqrt(ragamTheta),
         mean(thetaJack),sqrt(ragamTheta2)),ncol=2,byrow=T,
       dimnames=list(c("Bootstrap","Jackknife"),c("estimator","std error")))
##           estimator  std error
## Bootstrap  1.239970 0.03475879
## Jackknife  1.239054 0.03453431

Latihan 2

Gunakanlah data swiss yang ada di R, lalu hitunglah 5-folds CV dan LOO-CV (Leave-One-Out Cross Validation) berdasarkan regresi yang dilakukan pada data tersebut, dengan peubah respon adalah Fertility dan peubah lainnya merupakan peubah prediktor!

# Import data
data(swiss)
swiss
##              Fertility Agriculture Examination Education Catholic
## Courtelary        80.2        17.0          15        12     9.96
## Delemont          83.1        45.1           6         9    84.84
## Franches-Mnt      92.5        39.7           5         5    93.40
## Moutier           85.8        36.5          12         7    33.77
## Neuveville        76.9        43.5          17        15     5.16
## Porrentruy        76.1        35.3           9         7    90.57
## Broye             83.8        70.2          16         7    92.85
## Glane             92.4        67.8          14         8    97.16
## Gruyere           82.4        53.3          12         7    97.67
## Sarine            82.9        45.2          16        13    91.38
## Veveyse           87.1        64.5          14         6    98.61
## Aigle             64.1        62.0          21        12     8.52
## Aubonne           66.9        67.5          14         7     2.27
## Avenches          68.9        60.7          19        12     4.43
## Cossonay          61.7        69.3          22         5     2.82
## Echallens         68.3        72.6          18         2    24.20
## Grandson          71.7        34.0          17         8     3.30
## Lausanne          55.7        19.4          26        28    12.11
## La Vallee         54.3        15.2          31        20     2.15
## Lavaux            65.1        73.0          19         9     2.84
## Morges            65.5        59.8          22        10     5.23
## Moudon            65.0        55.1          14         3     4.52
## Nyone             56.6        50.9          22        12    15.14
## Orbe              57.4        54.1          20         6     4.20
## Oron              72.5        71.2          12         1     2.40
## Payerne           74.2        58.1          14         8     5.23
## Paysd'enhaut      72.0        63.5           6         3     2.56
## Rolle             60.5        60.8          16        10     7.72
## Vevey             58.3        26.8          25        19    18.46
## Yverdon           65.4        49.5          15         8     6.10
## Conthey           75.5        85.9           3         2    99.71
## Entremont         69.3        84.9           7         6    99.68
## Herens            77.3        89.7           5         2   100.00
## Martigwy          70.5        78.2          12         6    98.96
## Monthey           79.4        64.9           7         3    98.22
## St Maurice        65.0        75.9           9         9    99.06
## Sierre            92.2        84.6           3         3    99.46
## Sion              79.3        63.1          13        13    96.83
## Boudry            70.4        38.4          26        12     5.62
## La Chauxdfnd      65.7         7.7          29        11    13.79
## Le Locle          72.7        16.7          22        13    11.22
## Neuchatel         64.4        17.6          35        32    16.92
## Val de Ruz        77.6        37.6          15         7     4.97
## ValdeTravers      67.6        18.7          25         7     8.65
## V. De Geneve      35.0         1.2          37        53    42.34
## Rive Droite       44.7        46.6          16        29    50.43
## Rive Gauche       42.8        27.7          22        29    58.33
##              Infant.Mortality
## Courtelary               22.2
## Delemont                 22.2
## Franches-Mnt             20.2
## Moutier                  20.3
## Neuveville               20.6
## Porrentruy               26.6
## Broye                    23.6
## Glane                    24.9
## Gruyere                  21.0
## Sarine                   24.4
## Veveyse                  24.5
## Aigle                    16.5
## Aubonne                  19.1
## Avenches                 22.7
## Cossonay                 18.7
## Echallens                21.2
## Grandson                 20.0
## Lausanne                 20.2
## La Vallee                10.8
## Lavaux                   20.0
## Morges                   18.0
## Moudon                   22.4
## Nyone                    16.7
## Orbe                     15.3
## Oron                     21.0
## Payerne                  23.8
## Paysd'enhaut             18.0
## Rolle                    16.3
## Vevey                    20.9
## Yverdon                  22.5
## Conthey                  15.1
## Entremont                19.8
## Herens                   18.3
## Martigwy                 19.4
## Monthey                  20.2
## St Maurice               17.8
## Sierre                   16.3
## Sion                     18.1
## Boudry                   20.3
## La Chauxdfnd             20.5
## Le Locle                 18.9
## Neuchatel                23.0
## Val de Ruz               20.0
## ValdeTravers             19.5
## V. De Geneve             18.0
## Rive Droite              18.2
## Rive Gauche              19.3

5-folds CV

  1. Bagi amatan data menjadi k bagian.
#banyaknya amatan
n <- nrow(swiss)
# mengacak urutan amatan
set.seed(123)
randomIndex <- sample.int(n,n)
k <- 5
# menentukan folds/bagian untuk tiap amatan
folds <- rep(sample.int(k,k),length.out=n)
# membagi amatan berdasarkan folds yang ditentukan
indexfolds <- split(randomIndex,folds)
indexfolds
## $`1`
## [1] 14 25 28 39  4 12 36 43  1
## 
## $`2`
## [1]  3 26  9  7 41 46 30 20  2
## 
## $`3`
##  [1] 15 45 38  8 19 33 21 22  6 40
## 
## $`4`
##  [1] 31 37  5 44 34 11 13 16 32 24
## 
## $`5`
## [1] 42 27 29 10 17 35 18 23 47
  1. Bagian ke-k digunakan untuk menduga respons, sedangkan bagian lainnya digabungkan untuk menduga model.

  2. Hitung galat prediksi: cv(−k) = 1/nk √(Σ(y_cap − y)^2)

  3. Ulangi sampai setiap bagian pernah digunakan untuk menduga galat prediksi

cv1 <- NULL
for(j in 1:k){
  #menduga model
  indexModel <- unlist(indexfolds[-j])
  dataModel <- swiss[indexModel, ]
  regresiSwiss <- lm(Fertility~.,data = dataModel)
  # menduga respon
  indexRespon <- unlist(indexfolds[j])
  dataRespon <- swiss[indexRespon, ]
  responseSwiss <- predict(regresiSwiss,newdata=dataRespon)
  # menghitung galat prediksi
  galat <- dataRespon$Fertility - responseSwiss
  cv1 <- c(cv1,1/(n*k)*sqrt(sum(galat^2)))
}
cv1
## [1] 0.08892357 0.08021139 0.13716277 0.11542136 0.09583984
  1. Hitung RMSEP
RMSEP1 <- mean(cv1)
RMSEP1
## [1] 0.1035118

LOO-CV

Untuk LOO-CV bisa menggunakan program untuk k-fold dengan menetapkan nilai k=n. Atau bisa juga hanya mengambil program inti agar lebih sederhana.

cv2 <- NULL
for(j in 1:n){
  #menduga model
  regresiSwiss <- lm(Fertility~.,data = swiss[-j,])
  # menduga respon
  responseSwiss <- predict(regresiSwiss,newdata=swiss[j,])
  # menghitung galat prediksi
  galat <- swiss$Fertility[j] - responseSwiss
  cv2 <- c(cv2,1/(n*k)*sqrt(sum(galat^2)))
}
cv2
##  [1] 0.0281845164 0.0028616702 0.0338942605 0.0415164841 0.0559431792
##  [6] 0.0764369943 0.0203921731 0.0535268370 0.0049220519 0.0162970146
## [11] 0.0171026663 0.0235181736 0.0023376615 0.0137463865 0.0179616749
## [16] 0.0242204121 0.0004833863 0.0009529467 0.0233628193 0.0079161546
## [21] 0.0153134215 0.0501196972 0.0226890718 0.0321692177 0.0050210089
## [26] 0.0082059576 0.0027083520 0.0068050767 0.0244371035 0.0323969395
## [31] 0.0039094563 0.0359695286 0.0060425348 0.0275140671 0.0180155765
## [36] 0.0383084947 0.0760281997 0.0386535480 0.0221452050 0.0348836887
## [41] 0.0195380342 0.0582634572 0.0232653423 0.0280304009 0.0015825468
## [46] 0.0520888356 0.0735220543
RMSEP2 <- mean(cv2)
RMSEP2
## [1] 0.02602562

Praktikum Pertemuan 14 - Metode Monte Carlo

library(ggplot2)
library(mvtnorm)
library(MBESS)

Simulasi Monte Carlo yang memanfaatkan informasi mengenai sebaran data yang diketahui (dihipotesiskan, dianggap tahu) dengan pasti.

Pendugaan Peluang:

P(Y>a)atauP(Y<a)

dengan Y=g(x),X f(x)

Latihan 1

Seorang peneliti ingin melihat bagaimana kesalahan tipe 1 (α) dari uji t (t test) dan uji peringkat bertanda Wilcoxon (Wilcoxoan signed-rank test) [https://sixsigmastudyguide.com/1-sample-wilcoxon-non-parametric-hypothesis-test/] untuk satu populasi pada berbagai ukuran sampel. Hipotesis yang akan diujikan adalah sebagai berikut:

H0:μ=1500

H1:μ≠1500

Bangkitan data berdasarkan distribusi N(μ=1500,σ=200), α=0.05 dan ulangan sebanyak 10.000. Ukuran sampel yang diteliti adalah 5 sampai 50. Berilah kesimpulan atas hasilnya!

Jawaban:

Langkah 1 ada mendefinisikan parameter-parameter yang digunakan untuk simulasi

# mendefinisikan ukuran sampel dari 5 saampai 50
n <- seq(5,50) 
# mendefinisikan miu distribusi normal
mu0 <- 1500
# mendefinisikan sigma distribusi normal
sigma0 <- 200
# mendefinisikan banyaknya ulangan
num_rep <- 10000
# mendefinisikan alpha
alpha <- 0.05

Langkah 2 medefinisikan fungsi untuk mengextract p-value dari masing-masing uji (test).

t_test_pvalue <- function(x,alt="two.sided",mu=mu0){
t.test(x, alternative = alt, mu = mu)$p.value  
}

wilcox_test_pvalue <- function(x,alt="two.sided",mu=mu0){
wilcox.test(x, alternative = alt, mu = mu)$p.value  
}

Langkah 3 Menjalankan Simulasi

# membuat objek data.frame dummy untuk menyimpan hasil simulasi
result_sim1 <- data.frame(n=0,alpha_empiris=0,test_name="")
set.seed(2020)
# iterasi simulasi berdasarkan ukuran sampel
for(i in seq_along(n)){
# membangkitan data berdistribusi normal dengan ulangan 10rb
sim_mc_norm <- replicate(num_rep,                     rnorm(n[i],mu0,sigma0))
# menghitung p value uji t dari 10rb data hasil bangkitan
t_test_res <- apply(sim_mc_norm,2,t_test_pvalue)
# menghitung p value uji wilcoxon dari 10rb data hasil bangkitan
wilcox_test_res <- apply(sim_mc_norm,2,wilcox_test_pvalue)
# menghitung alpha empiris dari uji t
t_p_value_sim <- mean(t_test_res<alpha)
# menghitung alpha empiris dari uji wilcoxon
wilcox_p_value_sim <- mean(wilcox_test_res<alpha)
# menyimpan hasil simulasi 
result_sim1 <- rbind(result_sim1,list(n[i],t_p_value_sim,"t_test"),
                  list(n[i],wilcox_p_value_sim,"wilcox_test")
)
}
# membuang baris dummy
result_sim1 <- result_sim1[-1,]

Langkah 4 Membuat Grafik dari hasil simulasi

ggplot(data = result_sim1,aes(n,alpha_empiris))+
  geom_point(aes(color=test_name))+geom_hline(yintercept = 0.05)+scale_y_continuous(limits = c(0,0.1))

Latihan 2

Seorang peneliti ingin melihat bagaimana nilai koefisien korelasi dari metode korelasi pearson dan metode korelasi spearman untuk satu populasi pada berbagai ukuran sampel jika datanya terdapat pencilan. Bangkitan data pencilan dengan cara berikut:

  1. Bangkitkan data berdasarkan distribusi multivariate Normal dengan vektor rataan (10,12) dan korelasi 0.85 serta vektor simpangan baku (2,3)

  2. Bangkitan outlier pada kedua peubah dengan berdasarkan distribusi N(17,2) sebanyak 20% dari ukuran sampel pada langkah a.

  3. Ganti amatan dari hasil bangkitan pada langkah a dengan hasil bangkitan pada langkah b secara acak.

Bangkitkan data dengan ulangan 10000 dan ukuran sampel yang diteliti adalah 10,20,30,40,50,60,70,80,90,100. Berikan kesimpulan dari hasil simulasi!

Jawaban

Langkah 1 abstraksi bangkitan data

langkah a

set.seed(1212)
# mendefinisikan vektor simpangan baku
sd0 <- c(2,3)
# mendefinisikan matrix korelasi
cor_mat <- matrix(c(1,0.85,0.85,1),nrow=2)
# mengubah matrix korelasi ke kovarians
cov_mat <- MBESS::cor2cov(cor_mat,sd0)
# mendefinisikan vektor rataan
mu_mvn <- c(10,12)
# membangkitkan data berdistribus multivariate normal
x_mvn <- rmvnorm(n=40, mean=c(10,12), sigma=cov_mat)

langkah b

set.seed(1212)
#membangkitkan data berdasarkan distribusi normal
x1_out <- rnorm(8,17,2)
y1_out <- rnorm(8,17,2)
x1y1_out <-cbind(x1_out,y1_out)

langkah c

# memilih secara acak amatan yang akan diganti dengan pencilan
index_out <- sample.int(nrow(x_mvn),8)
# mengganti amatan dari langkah a dengan amatan dari langkah b
x_mvn[index_out,] <- x1y1_out
qplot(x = V1,y=V2,data = as.data.frame(x_mvn))

Langkah 2 ada mendefinisikan parameter-parameter yang digunakan untuk simulasi

# mendefinisikan ukuran sampel yang dikaji
n <- seq(10,100,10)
# mendefinisikan jumlah ulangan
num_rep2 <- 10000
# mendefinisikan vektor simpangan baku
sd0 <- c(2,3)
# mendefinisikan matrix korelasi
cor_mat <- matrix(c(1,0.85,0.85,1),nrow=2)
# mengubah matrix korelasi ke kovarians
cov_mat <- MBESS::cor2cov(cor_mat,sd0)
# mendefinisikan vektor rataan
mu_mvn <- c(10,12)
# mendefinisikan mu dan sigma untuk data pencilan
mu1 <- 17
sigma1 <- 2

Langkah 3 mendefinisikan fungsi-fungsi yang dibutuhkan

# generate multivariate normal dengan pencilan
gen_mvn_out <- function(n0,mu0,sigma0,n1,mu1,sigma1){
x_mvn <- rmvnorm(n=n0, mean=mu0, sigma=sigma0)
x1_out <- rnorm(n1,mu1,sigma1)
y1_out <- rnorm(n1,mu1,sigma1)
x1y1_out <-cbind(x1_out,y1_out)
index_out <- sample.int(nrow(x_mvn),n1)
x_mvn[index_out,] <- x1y1_out
return(x_mvn)
}

# extract koefisien korelasi
cor_res <- function(x_mat,method){
  cor(x_mat[,1],x_mat[,2],method = method)
}

Langkah 4 Menjalankan simulasi

set.seed(1212)
# membuat objek data.frame dummy untuk menyimpan hasil simulasi
result_sim2 <- data.frame(n=0,correlation=0,type="")
for(i in seq_along(n)){
# membangkitan data berdistribusi multivariate normal dengan ulangan 10rb
sim_mc_mvn <- replicate(num_rep2,                     gen_mvn_out(n0 = n[i],mu_mvn,cov_mat,n1=0.2*n[i],mu1,sigma1),
                        simplify = F)
# menghitung keofisien korelasi pearson dari 10rb data hasil bangkitan
pearson_res <- sapply(sim_mc_mvn,cor_res,method="pearson")
# menghitung keofisien spearman pearson dari 10rb data hasil bangkitan
spearman_res <- sapply(sim_mc_mvn,cor_res,method="spearman")
# menghitung rata-rata koefisien
pearson_sim <- mean(pearson_res)
spearman_sim <- mean(spearman_res)
# menyimpan hasil simulasi
result_sim2 <- rbind(result_sim2,list(n[i],pearson_sim,"pearson"),
                  list(n[i],spearman_sim,"spearman")
)
}
result_sim2 <- result_sim2[-1,]

Langkah 5 Membuat Grafik berdsarkan hasil simulasi

ggplot(data = result_sim2,aes(n,correlation))+
  geom_point(aes(color=type))+geom_hline(yintercept = 0.85)+scale_y_continuous(limits = c(0.5,1))

Latihan 3

Bangkitkan peubah Y,X1,X2 dan X3 berdasarkan model regresi linear berganda berikut ini:

Y=10+3X1+5X2+7X3+ϵ dengan mengasumsikan bahwa ϵ N(0,1). Banyaknya amatan yang dibangkitkan adalah 1000

Jawaban

  1. Bangkitkan residual berdasarkan distribusi normal ϵ∼N(0,σ)
#banyaknya amatan
n <- 1000
set.seed(12)
epsilon <- rnorm(n,mean = 0,sd = 1)

2.Bangkitkan peubah penjelas Xi yang saling bebas.

set.seed(10)
X <- replicate(3,rnorm(n,mean=0,sd=1.5))
head(X)
##             [,1]       [,2]        [,3]
## [1,]  0.02811926  1.5750205 -0.46179747
## [2,] -0.27637881  0.4291389  1.13712837
## [3,] -2.05699582  0.3608472 -0.86079512
## [4,] -0.89875157  1.2490578 -1.40811669
## [5,]  0.44181769 -0.3344748 -0.04154899
## [6,]  0.58469145  0.4325163 -1.59937298

Pembangkitan peubah penjelas Xi dapat dilakukan juga dengan fungsi mvnorm jika ingin melakukan simulasi multikolinearitas.

  1. Bangkitkan peubah respon Y dengan menggunakan model regresi
betas <- matrix(c(10,3,5,7),nrow = 4,ncol = 1)
Xgab <- cbind(1,X)

Y <- Xgab%*%betas+epsilon

dataRegresi <- data.frame(Y,X)
colnames(dataRegresi) <- c("Y","X1","X2","X3")
head(dataRegresi)
##           Y          X1         X2          X3
## 1 13.246310  0.02811926  1.5750205 -0.46179747
## 2 20.853626 -0.27637881  0.4291389  1.13712837
## 3 -1.349062 -2.05699582  0.3608472 -0.86079512
## 4  2.772212 -0.89875157  1.2490578 -1.40811669
## 5  7.364594  0.44181769 -0.3344748 -0.04154899
## 6  2.448749  0.58469145  0.4325163 -1.59937298

** Note : ** sintaks Xgab <- cbind(1,X) digunakan untuk menggabungkan peubah penjelas yang ada di matrik X dengan vektor yang isinya 1. Vektor ini digunakan sebagai pengkali konstanta model (dalam hal ini bernilai 10).

Untuk membuktikan bahwa bangkitan kita benar, maka kita akan memodelkan data tersebut dengan fungsi lm yang ada id R.

modelRegresi <- lm(Y~.,data = dataRegresi)
summary(modelRegresi)
## 
## Call:
## lm(formula = Y ~ ., data = dataRegresi)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0364 -0.6052 -0.0207  0.6087  3.1774 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.97484    0.03033   328.8   <2e-16 ***
## X1           2.97225    0.02042   145.6   <2e-16 ***
## X2           4.97282    0.01939   256.5   <2e-16 ***
## X3           7.00493    0.01989   352.2   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9589 on 996 degrees of freedom
## Multiple R-squared:  0.9955, Adjusted R-squared:  0.9954 
## F-statistic: 7.275e+04 on 3 and 996 DF,  p-value: < 2.2e-16

Berdasarkan output regresi diatas, nilai koefisien regresi yang dihasilkan mendekati nilai koefisien regresi yang kita bangkitkan. Hal ini membuktikan bahwa data sudah sesuai dengan model regresi yang kita inginkan.

Latihan 4

Berdasarkan Latihan 3 lakukan pengulangan sebanyak 100 ulangan dan kemudian hitung rata-rata dan simpangan baku dari masing-masing koefisien regresi.

Jawaban

#banyaknya amatan
n <- 1000
ulangan <- 100

# membuat tempat penyimpanan
# koefisien tiap ulangan
koefisien_ulangan <- NULL

set.seed(13)
for(i in seq(ulangan)){
epsilon <- rnorm(n,mean = 0,sd = 1)
X <- replicate(3,rnorm(n,mean=0,sd=1.5))
Xgab <- cbind(1,X)
Y <- Xgab%*%betas+epsilon
dataRegresi <- data.frame(Y,X)
colnames(dataRegresi) <- c("Y","X1","X2","X3")
modelRegresi <- lm(Y~.,data = dataRegresi)
# rbind digunakan untuk menggabungkan baris
koefisien_ulangan <- rbind(koefisien_ulangan,coef(modelRegresi))
}
head(koefisien_ulangan)
##      (Intercept)       X1       X2       X3
## [1,]    9.998451 2.997131 4.961536 7.019022
## [2,]    9.999899 2.981410 5.012151 6.977783
## [3,]    9.971732 2.986735 4.992031 7.019945
## [4,]    9.940730 3.013790 5.006416 7.003125
## [5,]   10.029303 3.033154 5.009336 6.972909
## [6,]   10.008416 3.019092 5.010800 6.999371
#menghitung mean dari setiap koefisien
colMeans(koefisien_ulangan)
## (Intercept)          X1          X2          X3 
##    9.997236    3.002950    5.000115    7.001103
#menghitung sd dari setiap koefisien
apply(koefisien_ulangan,2,sd)
## (Intercept)          X1          X2          X3 
##  0.02972359  0.01960207  0.01923794  0.02379381

Demikian, Terima Kasih


  1. Satria June Adwendi, IPB University, ↩︎