Tugas Praktikum Kelima STA561 Pemrograman Statistika

Klik disini untuk ke halaman rpubs.

Komputasi untuk Regresi (Praktikum Pertemuan Ke-11)

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

  2. penduga koefisien regresi ->𝜷duga

  3. JKG (Jumlah Kuadrat Galat)

Latihan

Diketahui data berikut

Lakukan prosedur Sweep

Jawab

#install.packages("fastmatrix")
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

Expectation-Maximization (EM) Algorithm (Praktikum Pertemuan Ke-12)

Algoritma EM

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 untuk missing value dalam rancop

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, toleransi = 1e-4, maksimal iterasi=100 (hasil= 26.99986)
emrancob(ftn, x,0,2,3, tol = 1e-4, max.iter = 100) #30x iterasi 26.99986
## 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
emrancob(ftn, x,17.4,2,3, tol = 1e-4, max.iter = 100) #27x iterasi 26.99983
## At iteration 1 value of x is: 20.6 
## At iteration 2 value of x is: 22.73333 
## At iteration 3 value of x is: 24.15556 
## At iteration 4 value of x is: 25.1037 
## At iteration 5 value of x is: 25.7358 
## At iteration 6 value of x is: 26.1572 
## At iteration 7 value of x is: 26.43813 
## At iteration 8 value of x is: 26.62542 
## At iteration 9 value of x is: 26.75028 
## At iteration 10 value of x is: 26.83352 
## At iteration 11 value of x is: 26.88901 
## At iteration 12 value of x is: 26.92601 
## At iteration 13 value of x is: 26.95067 
## At iteration 14 value of x is: 26.96712 
## At iteration 15 value of x is: 26.97808 
## At iteration 16 value of x is: 26.98538 
## At iteration 17 value of x is: 26.99026 
## At iteration 18 value of x is: 26.9935 
## At iteration 19 value of x is: 26.99567 
## At iteration 20 value of x is: 26.99711 
## At iteration 21 value of x is: 26.99808 
## At iteration 22 value of x is: 26.99872 
## At iteration 23 value of x is: 26.99914 
## At iteration 24 value of x is: 26.99943 
## At iteration 25 value of x is: 26.99962 
## At iteration 26 value of x is: 26.99975 
## At iteration 27 value of x is: 26.99983 
## Algorithm converged
## [1] 26.99983

Contoh 2

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

### Contoh_2
ftn2 <- function(x,yij,i,j){
  x <- matrix(c(12,yij,18,22,23,24),ncol=3,byrow=TRUE)
  mu <- mean(x)
  alfai <- mean(x[i,])- mu
  betaj <- mean(x[,j])- mu
  yij <- mu + alfai + betaj
  return(yij)
}

### Cari y12, dengan nilai awal 16.5, i=2, j=3
emrancob(ftn2, x,16.5,1,2, tol = 1e-4, max.iter = 100)
## At iteration 1 value of x is: 16 
## At iteration 2 value of x is: 15.66667 
## At iteration 3 value of x is: 15.44444 
## At iteration 4 value of x is: 15.2963 
## At iteration 5 value of x is: 15.19753 
## At iteration 6 value of x is: 15.13169 
## At iteration 7 value of x is: 15.08779 
## At iteration 8 value of x is: 15.05853 
## At iteration 9 value of x is: 15.03902 
## At iteration 10 value of x is: 15.02601 
## At iteration 11 value of x is: 15.01734 
## At iteration 12 value of x is: 15.01156 
## At iteration 13 value of x is: 15.00771 
## At iteration 14 value of x is: 15.00514 
## At iteration 15 value of x is: 15.00343 
## At iteration 16 value of x is: 15.00228 
## At iteration 17 value of x is: 15.00152 
## At iteration 18 value of x is: 15.00101 
## At iteration 19 value of x is: 15.00068 
## At iteration 20 value of x is: 15.00045 
## At iteration 21 value of x is: 15.0003 
## At iteration 22 value of x is: 15.0002 
## At iteration 23 value of x is: 15.00013 
## Algorithm converged
## [1] 15.00013
### Pendugaan data tersembunyi (sebaran multinomial)

### Contoh_1
x3<- 18
x4<- 20
x5<- 34
x2d1<- 0
x2d2<- 0
theta0<- 2
err<- 10
iterasi<- 1
while(err>10^-4){
  theta1<- (x2d1+x5)/(x2d1+x3+x4+x5)
  x1d2<- 125*(0.5/(0.5+0.25*theta1))
  x2d2<- 125*((0.25*theta1)/(0.5+0.25*theta1))
  err<- abs(theta1-theta0)
  theta0<- theta1
  x2d1<-x2d2
  iterasi<- iterasi + 1
}

x1d2   # x1
## [1] 95.17232
x2d2   # x2
## [1] 29.82768
theta1
## [1] 0.6268142
iterasi
## [1] 7

Teladan 1

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

Resampling (Bootstrap dan Jackknife)(Praktikum Pertemuan Ke-13)

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.

Bootstrap

Bootstrap, diperkenalkan oleh Efron (1979), dapat melakukan pencarian informasi tentang parameter populasi berdasarkan hanya suatu data contoh dari populasi tersebut.Istilah ‘bootstrap’ dari “To pull oneself up by one’s bootstraps”.Bootstrap akan membentuk fungsi sebaran empirik sebagai gambaran fungsi sebaran sebenarnya.Tujuan dari bootstrap adalah mengumpulkan informasi secara cepat dan lebih murah karena tidak langsung dari populasi tetapi berdasarkan suatu data contoh saja yang dianggap populasi.

Bootstrap terutama digunakan untuk mempelajari suatu penduga parameter populasi, yang disebut statistik, berdasarkan data contoh.Bootstrap sering digunakan bila sebaran populasinya tidak diketahui dan hanya data contoh yang tersedia sebagai populasi semu (pseudo) dengan karakteristik yang serupa populasi sebenarnya.

Misalkan 𝜃duga adalah statistik contoh sebagai penduga parameter populasi yang diperoleh berdasarkan data contoh tersebut. Bila n besar (n ≥30), sebaran penarikan contohnya berbentuk simetris terhadap 𝜃; bila kasus n kecil, sebaran sulit diperoleh apalagi untuk statistik seperti median, korelasi, atau koefisien keragaman. Pendugaan suatu sebaran dengan bootstrap analog dengan pendugaan kepekatan. Bootstrap membangkitkan contoh-contoh acak dari suatu sebaran empirik. Suatu histogram dibentuk berdasarkan contoh-contoh tersebut untuk memperoleh suatu bentuk penduga fungsi kepekatan dan dipandang sebagai penduga kepekatan yang layak bagi sebaran empirik.

Data berukuran kecil dianggap sebagai populasi terhingga dan proses penarikan contoh dengan pengembalian (replacement) dilakukan secara berulang (resampling). Penarikan contoh dilakukan secara acak sebagaimana penarikan contoh acak dari populasi besar. Penduga parameter diperoleh dari setiap contoh acak sehingga pengulangan sebanyak B kali akan menghasilkan B penduga, yaitu 𝜃duga1, 𝜃duga2, … , 𝜃duga𝐵.Rata-rata dari B buah penduga, yaitu 𝜃dugabar.

Teladan 1

Menduga rata-rata, standard error, bias, dan selang kepercayaan bagi rata-rata

x <-c(8.26, 6.33, 10.4, 5.27, 5.35, 5.61, 6.12, 6.19, 5.2, 7.01, 8.74, 7.78, 7.02, 6, 6.5, 5.8, 5.12, 7.41, 6.52, 6.21, 12.28, 5.6, 5.38, 6.6, 8.74)
x <- as.matrix(x)
x
##        [,1]
##  [1,]  8.26
##  [2,]  6.33
##  [3,] 10.40
##  [4,]  5.27
##  [5,]  5.35
##  [6,]  5.61
##  [7,]  6.12
##  [8,]  6.19
##  [9,]  5.20
## [10,]  7.01
## [11,]  8.74
## [12,]  7.78
## [13,]  7.02
## [14,]  6.00
## [15,]  6.50
## [16,]  5.80
## [17,]  5.12
## [18,]  7.41
## [19,]  6.52
## [20,]  6.21
## [21,] 12.28
## [22,]  5.60
## [23,]  5.38
## [24,]  6.60
## [25,]  8.74
mean(x)     # penduga rata-rata
## [1] 6.8576
b <- 5000
boot <- numeric(b)

n <- nrow(x)


for (i in 1:b) boot[i] <- mean(sample(x,n,replace=T)) 
mean(boot)
## [1] 6.852311
sqrt(var(boot)) #penduga salah baku bagi rata-rata
## [1] 0.3339427
bias<- mean(boot)-mean(x)   #penduga bias
bias
## [1] -0.00528936
hist(boot)

# selang kepercayaan bagi rata-rata
quantile(boot,0.025)
##    2.5% 
## 6.26558
quantile(boot,0.975)
##   97.5% 
## 7.57241

Teladan 2

Menduga rata-rata, standard error, dan selang kepercayaan bagi median

### Teladan: Penduga Median dan Salah Baku
x <-c(8.26, 6.33, 10.4, 5.27, 5.35, 5.61, 6.12, 6.19, 5.2, 7.01, 8.74, 7.78, 7.02, 6, 6.5, 5.8, 5.12, 7.41, 6.52, 6.21, 12.28, 5.6, 5.38, 6.6, 8.74)
x <- as.matrix(x)
median(x)       # penduga median
## [1] 6.33
n <- nrow(x)
b <- 5000
boot2 <-numeric(b)
for (i in 1:b) boot2[i] <- median(sample(x,n,replace=T)) 
mean(boot2)
## [1] 6.370448
sqrt(var(boot2)) #penduga salah baku bagi median
## [1] 0.2841701
hist(boot2)

# selang kepercayaan bagi median
quantile(boot2,0.025)
## 2.5% 
##  5.8
quantile(boot2,0.975)
## 97.5% 
##  7.02

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.

# 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
')

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, hitunglah galat baku (standard error) dari θduga, yang merupakan akar dari V(θduga), jika diketahui θduga=x_bar/u_bar!

Jawab

Cara 1 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(θduga) Ragam V(θduga) bisa didekati menggunakan ragam bootstrap V(θ^(B)).
# ragam
ragamTheta <- var(thetaBoost)
ragamTheta
## [1] 0.001208174
# galat baku
sqrt(ragamTheta)
## [1] 0.03475879

Cara 2 dengan package boot()

library(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

Jackknife

Pada awalnya metode jackknife atau leave-one-out bertujuan untuk menduga bias dari suatu penduga yang diperkenalkan oleh Maurice Quenouille pada tahun 1949 dan dikembangkan oleh John Tukey pada tahun 1957, yang dikenal dengan Quenouille-Tukey Jackknife.Metode jackknife serupa dengan metode bootstrap untuk salah baku. Metode ini seperti tipe validasi silang leave-one-out. Bila 𝒙=(𝑥1, 𝑥2, …, 𝑥𝑛) adalah contoh acak dan 𝒙((𝒊)) adalah subset dari 𝒙 tanpa pengamatan 𝑥𝑖, yaitu 𝒙((𝒊))=(𝑥1, …,𝑥((𝑖−1) ),𝑥((𝑖+1) ), …, 𝑥𝑛). Jika 𝜃duga=𝑓𝑛 (𝒙), maka definisikan bahwa 𝜃duga=𝑓(𝑛−1) ( 𝒙((𝒊) ) ), 𝑖=1, 2, …, 𝑛.

Teladan 1

x <-c(8.26, 6.33, 10.4, 5.27, 5.35, 5.61, 6.12, 6.19, 5.2, 7.01, 8.74, 7.78, 7.02, 6, 6.5, 5.8, 5.12, 7.41, 6.52, 6.21, 12.28, 5.6, 5.38, 6.6, 8.74)
x <- as.matrix(x)
n <- nrow(x)
theta.hat <- median(x)
print(theta.hat)
## [1] 6.33
# pendugaan median dengan jackknife (leave-one-out)
theta.jack <- numeric(n)
for (i in 1:n) theta.jack[i] <- median(x[-i])
medjack <- mean(theta.jack)
print(medjack)          # penduga median dengan Jackknife
## [1] 6.343
# penduga bias
bias <- (n-1) * (mean(theta.jack) - theta.hat)
print(bias)
## [1] 0.312

Teladan 2

x <-c(8.26, 6.33, 10.4, 5.27, 5.35, 5.61, 6.12, 6.19, 5.2, 7.01, 8.74, 7.78, 7.02, 6, 6.5, 5.8, 5.12, 7.41, 6.52, 6.21, 12.28, 5.6, 5.38, 6.6, 8.74)
x <- as.matrix(x)
n <- nrow(x)
theta.hat <- median(x)
print(theta.hat)
## [1] 6.33
# pendugaan median dengan jackknife (leave-one-out)
theta.jack <- numeric(n)
for (i in 1:n) theta.jack[i] <- median(x[-i])
medjack <- mean(theta.jack)
print(medjack)          # penduga median dengan Jackknife
## [1] 6.343
# penduga salah baku 
se <- sqrt((n-1)*mean(((theta.jack)-mean(theta.jack))^2))
print(se)
## [1] 0.3482068

x <-c(8.26, 6.33, 10.4, 5.27, 5.35, 5.61, 6.12, 6.19, 5.2,       7.01, 8.74, 7.78, 7.02, 6, 6.5, 5.8, 5.12, 7.41, 6.52, 6.21, 12.28, 5.6, 5.38, 6.6, 8.74)
x <- as.matrix(x)
n <- length(x)
jack <- numeric(n-1) 
pseudo <- numeric(n)
for (i in 1:n)
  {for (j in 1:n) {if(j<i) jack[j]<-x[j] else if(j>i) jack[j-1]<- x[j]}
     pseudo[i]<-n*median(x)-(n-1)*median(jack)}

mean(pseudo)   #penduga rata2
## [1] 6.018
var(pseudo)    #penduga ragam
## [1] 3.0312
var(pseudo)/n    #ragam dari penduga rata2
## [1] 0.121248
# Penduga selang kepercayaan 95% bagi median #
mean(pseudo) + qt(0.975,n-1)*sqrt(var(pseudo)/n)
## [1] 6.736664
mean(pseudo) - qt(0.975,n-1)*sqrt(var(pseudo)/n)
## [1] 5.299336

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.

# 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
')

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 JACKNIFE, hitunglah galat baku (standard error) dari θduga, yang merupakan akar dari V(θduga), jika diketahui θduga=x_bar/u_bar!

Jawab

  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(θduga). Ragam V(θduga) bisa didekati menggunakan ragam jacknife V(θ^(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

Validasi Silang (Cross Validation-CV)

Validasi silang adalah metode partisi data yang dapat digunakan untuk mengetahui antara lain kestabilan penduga parameter, kesesuaian penduga model. Jackknife dapat dipandang sebagai kasus khusus dari validasi silang yang pada awalnya digunakan untuk pendugaan bias dan salah baku.

Ilustrasi 1

Pendugaan galat prediksi model dengan validasi silang

Andaikan ada empat model untuk memprediksi Y dari X. Linier : 𝑌=𝛽0+𝛽1 𝑋+𝜀 Kuadratik : 𝑌=𝛽0+𝛽1 𝑋+𝛽2 𝑋^2+𝜀 Eksponensial : log⁡(𝑌)=log⁡(𝛽_0)+𝛽_1 𝑋+𝜀 Log-Log : log⁡(𝑌)=𝛽_0+𝛽_1 log⁡(𝑋)+𝜀

## Data:
par(mfrow=c(2,2))
library(DAAG); attach(ironslag)
## Loading required package: lattice
## 
## Attaching package: 'lattice'
## The following object is masked from 'package:boot':
## 
##     melanoma
a <- seq(10, 40, .1) #sequence for plotting fits

# Model linier
L1 <- lm(magnetic ~ chemical)
plot(chemical, magnetic, main="Linear", pch=16)
yhat1 <- L1$coef[1] + L1$coef[2] * a
lines(a, yhat1, lwd=2)

# Model Kuadratik
L2 <- lm(magnetic ~ chemical + I(chemical^2))
plot(chemical, magnetic, main="Quadratic", pch=16)
yhat2 <- L2$coef[1] + L2$coef[2] * a + L2$coef[3] * a^2
lines(a, yhat2, lwd=2) 

# Model Exponensial
L3 <- lm(log(magnetic) ~ chemical)
plot(chemical, magnetic, main="Exponential", pch=16)
logyhat3 <- L3$coef[1] + L3$coef[2] * a
yhat3 <- exp(logyhat3)
lines(a, yhat3, lwd=2)

# Model LOG-LOG
L4 <- lm(log(magnetic) ~ log(chemical))
plot(log(chemical), log(magnetic), main="Log-Log", pch=16)
logyhat4 <- L4$coef[1] + L4$coef[2] * log(a)
lines(log(a), logyhat4, lwd=2)  

n <- length(magnetic) #in DAAG ironslag
e1 <- e2 <- e3 <- e4 <- numeric(n)
for (k in 1:n) {
 y <- magnetic[-k]
 x <- chemical[-k]
 J1 <- lm(y ~ x)    # model linier
 yhat1 <- J1$coef[1] + J1$coef[2] * chemical[k]
 e1[k] <- magnetic[k] - yhat1
 J2 <- lm(y ~ x + I(x^2))      # model kuadratik
 yhat2 <- J2$coef[1] + J2$coef[2] * chemical[k] + J2$coef[3] * chemical[k]^2
 e2[k] <- magnetic[k] - yhat2
 J3 <- lm(log(y) ~ x)     # model eksponensial
 logyhat3 <- J3$coef[1] + J3$coef[2] * chemical[k]
 yhat3 <- exp(logyhat3)
 e3[k] <- magnetic[k] - yhat3
 J4 <- lm(log(y) ~ log(x))     # model log-log
 logyhat4 <- J4$coef[1] + J4$coef[2] * log(chemical[k])
 yhat4 <- exp(logyhat4)
 e4[k] <- magnetic[k] - yhat4
}

c(mean(e1^2), mean(e2^2) , mean(e3^2), mean(e4^2))  # model kuadratik dengan galat prediksi paling kecil 
## [1] 19.55644 17.85248 18.44188 20.45424

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!

Jawab:

# 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)*akar(Σ(y^−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

Metode Monte Carlo (Praktikum Pertemuan Ke-14)

Mencakup sejumlah alat komputasi dalam statistika terapan, antara lain integrasi Monte Carlo. Mengacu pada metode penarikan kesimpulan (statisical inference) atau analisis numerik yang menggunakan simulasi. Ada ketidak pastian (uncertanty) pendugaan pada penarikan kesimpulan. Penarikan contoh secara berulang dari suatu sebaran peluang, seperti bootstrap parametrik, untuk mengetahui ketidak pastian. Penarikan contoh secara berulang dari data pengamatan, seperti bootstrap (nonparametrik). Dapat digunakan untuk pendugaan parameter, kuadrat tengah galat (MSE), peluang selang kepercaayaan dan salah jenis I.

Penduga bagi beda dua nilai tengah dan salah baku

m <- 1000
g <- numeric(m)
for (j in 1:m) {
      x <- rnorm(2)
      g[j] <- abs(x[1] - x[2])
}
est <- mean(g)

est
## [1] 1.165277

m <- 1000
g <- numeric(m)
for (i in 1:m) {
      x <- rnorm(2)
      g[i] <- abs(x[1] - x[2])
}
estse <- sqrt(sum((g - mean(g))^2)) / m

estse
## [1] 0.02594272

Penduga bagi Kuadrat Tengah Galat (MSE)

Teladan

# trimmed mean untuk nilai tengah (rata-rata)
n <- 20
m <- 1000
tmean <- numeric(m)   # trimmed mean
for (j in 1:m) {
      x <- sort(rnorm(n))   # sebaran normal
      tmean[j] <- sum(x[2:(n-1)]) / (n-2)
}
mse <- mean(tmean^2)
mse
## [1] 0.04781138
sqrt(sum((tmean - mean(tmean))^2)) / m  #se
## [1] 0.006905955
# trimmed mean untuk median
# (median is actually a trimmed mean)
n <- 20
m <- 1000
tmean <- numeric(m)   # trimmed mean
for (i in 1:m) {
      x <- sort(rnorm(n))
      tmean[i] <- median(x)    # median (median berada di tengah)
}
mse <- mean(tmean^2)
mse
## [1] 0.07614342
sqrt(sum((tmean - mean(tmean))^2)) / m  #se
## [1] 0.008726004

Penduga Bagi Tingkat Kepercayaan (Confidence Level)

# batas atas selang kepercayaan 95% bagi ragam 
# contoh acak n=20 dari sebaran N ~ (0,4)
n <- 20
alpha <- 0.05
x <- rnorm(n, mean=0, sd=2)
UCL <- (n-1) * var(x) / qchisq(alpha, df=n-1)  # upper confidence level

UCL
## [1] 10.70307

# batas atas selang kepercayaan 95% bagi ragam 
# contoh acak n=20 dari sebaran N ~ (0,4)
n <- 20
alpha <- .05
ucl<- numeric(10)
for (i in 1:10){x <- rnorm(n, mean=0, sd=2)
ucl[i]<-(n-1) * var(x) / qchisq(alpha, df=n-1)
}

ucl
##  [1] 10.217686  5.318907  5.391812  8.905902  5.570816  3.590928 10.480207
##  [8]  8.909878 10.096666  8.047340

# µ = 0, σ = 2, n = 20, m = 1000 ulangan, dan α = 0.05 
# Proporsi selang yang mencakup σ2 = 4 adalah penduga Monte Carlo
# bagi tingkat kepercayaan sebenarnya
# Versi 1
n <- 20
alpha <- .05
UCL <- replicate(1000, expr = {
             x <- rnorm(n, mean = 0, sd = 2)
             (n-1) * var(x) / qchisq(alpha, df = n-1)
             } )
#count the number of intervals that contain sigma^2=4
sum(UCL > 4)
## [1] 947
#or compute the mean to get the confidence level
mean(UCL > 4)
## [1] 0.947
# µ = 0, σ = 2, n = 20, m = 1000 ulangan, dan α = 0.05 
# Proporsi selang yang mencakup σ2 = 4 adalah penduga Monte Carlo
# bagi tingkat kepercayaan sebenarnya
# Versi 2
calcCI <- function(n, alpha) {
                    y <- rnorm(n, mean = 0, sd = 2)
                    return((n-1) * var(y) / qchisq(alpha, df = n-1))
                }
UCL <- replicate(1000, expr = calcCI(n = 20, alpha = .05))
#count the number of intervals that contain sigma^2=4
sum(UCL > 4)
## [1] 952
#or compute the mean to get the confidence level
mean(UCL > 4)
## [1] 0.952

Metode Monte Carlo untuk Uji Hipotesis

Andaikan kita akan melakukan uji hipotesis berikut: H0: θ = θ0 vs H1: θ = θ1. Dalam pengujian hipotesis ada dua jenis kesalahan, yaitu salah jenis I yang terjadi jika H0 ditolak padahal H0 benar, dan salah jenis II yang terjadi jika H0 tidak ditolak padahal H0 salah.

n <- 20     # banyaknya data 𝑥_1, …, 𝑥_20
alpha <- 0.05
mu0 <- 500  # H0: µ = 500 
sigma <- 100    # σ
m <- 10000  #number of replicates
p <- numeric(m) #storage for p-values
for (j in 1:m) {
       x <- rnorm(n, mu0, sigma)
       ttest <- t.test(x, alternative = "greater", mu = mu0)
       p[j] <- ttest$p.value
       }
p.hat <- mean(p < alpha)        # proporsi
se.hat <- sqrt(p.hat * (1 - p.hat) / m) # salah baku

print(c(p.hat, se.hat))
## [1] 0.046400000 0.002103498
#install.packages("BSDA")
library(BSDA)
## 
## Attaching package: 'BSDA'
## The following object is masked from 'package:datasets':
## 
##     Orange
n <- 20     # banyaknya data 𝑥_1, …, 𝑥_20
alpha <- 0.05
mu0 <- 500  # H0: µ = 500 
sigma <- 100    # σ
m <- 10000  #number of replicates
p <- numeric(m) #storage for p-values
for (j in 1:m) {
       x <- rnorm(n, mu0, sigma)
       ztest <- z.test(x, sigma.x=sigma, alternative = "greater", mu = mu0)   # paket BSDA
       p[j] <- ztest$p.value
       }
p.hat <- mean(p < alpha)        # proporsi
se.hat <- sqrt(p.hat * (1 - p.hat) / m) # salah baku

print(c(p.hat, se.hat))
## [1] 0.047600000 0.002129184

Metode Markov Chain Monte Carlo (MCMC)

Diperkenalkan oleh Metropolis dan Hastings untuk integrasi Monte Carlo. Integrasi untuk membangkitkan contoh-contoh (samples) dari fungsi kepekatan f(.).Pendekatan MCMC untuk penarikan contoh dari f(.) digunakan untuk mengkontruksi suatu Markov Chain dengan sebaran stasioner f(.), dan terus menerus untuk waktu yang lama sampai rantai konvergen (approximately) terhadap sebaran stasioner.Metode untuk mengkonstruksi rantai Markov antara lain Metropolis-Hastings dan Gibbs sampler.

#Sebaran Proposal Khi Kuadrat 

# Fungsi untuk evaluasi kepekatan Rayleigh [versi a]    
f <- function(x, sigma) {
          if (any(x < 0)) return (0)
          stopifnot(sigma > 0)
          return((x / sigma^2) * exp(-x^2 / (2*sigma^2)))  # sebaran target
}

# Pada simulasi ini suatu contoh dari sebaran Rayleigh dibangkitkan berdasarkan
# sebaran proposal  khi kuadrat; pada setiap transisi, titik 𝑌 dibangkitkan dari 𝜒^2 (𝑑𝑓=𝑋_(𝑖−1) )
xt <- x[i-1]
y <- rchisq(1, df = xt)


m <- 10000
sigma <- 4
x <- numeric(m)
x[1] <- rchisq(1, df=1)
u <- runif(m)
for (i in 2:m) {
      xt <- x[i-1]
      y <- rchisq(1, df = xt)
      num <- f(y, sigma) * dchisq(xt, df = y)   # pembilang pada r(Xt,Y)
      den <- f(xt, sigma) * dchisq(y, df = xt)  # penyebut pada r(Xt,Y)
      if (u[i] <= num/den) x[i] <- y  
      else x[i] <- xt
      }

index <- 1:m
y1 <- x[index]
plot(index, y1, type="l", main="", ylab="x")    # # plot sekuen Xt  

par(mfrow = c(1, 2))
y <- x[1:m]     # xt yang diterima
a <- ppoints(100)
QR <- sigma * sqrt(-2 * log(1 - a))     # kuantil sebaran Rayleigh
Q <- quantile(x, a)
qqplot(QR, Q, main="", xlab="Rayleigh Quantiles", ylab="Sample Quantiles")
hist(y, breaks="scott", main="", xlab="", freq=FALSE)
lines(QR, f(QR, 4))

par(mfrow = c(1, 1))


mean(x) # penduga nilai tengah (E[X] ) 
## [1] 4.963099
var(x)      # penduga ragam (Var) ̂[X]
## [1] 6.992452
sigma*sqrt(pi/2)        # E[X]=σ√(π/2)
## [1] 5.013257
sigma^2*((4-pi)/2)  # Var[X]=σ^2 (4-π)/2
## [1] 6.867259
#Sebaran Proposal Normal
m <- 50000
sigma <- 4
x <- numeric(m)
x[1] <- rnorm(1, 1, 1)  # sebaran normal dengan mu=1 dan ragam1=1
u <- runif(m)
for (i in 2:m) {
  xt <- x[i-1]
  y <- rnorm(1, xt, 1)
  num <- f(y, sigma) * dnorm(xt, y, 1)  # pembilang pada r(X_t,Y)
  den <- f(xt, sigma) * dnorm(y, xt, 1) # penyebut pada r(X_t,Y)
  if (u[i] <= num/den) {x[i] <- y}   
  else {x[i] <- xt}
}

index <- 1:m
y1 <- x[index]
plot(index, y1, type="l", main="", ylab="x")    # # plot sekuen Xt  

par(mfrow = c(1, 2))
y <- x[1:m]
a <- ppoints(100)
QR <- sigma * sqrt(-2 * log(1 - a))     # kuantil sebaran Rayleigh
Q <- quantile(x, a)
qqplot(QR, Q, main="", xlab="Rayleigh Quantiles", ylab="Sample Quantiles")
hist(y, breaks="scott", main="", xlab="", freq=FALSE)
lines(QR, f(QR, 4))

par(mfrow = c(1, 1))
#Sebaran Proposal Khi Kuadrat
# khi kuadrat
m <- 50000
x <- numeric(m)
sigma <- 4

target <- function(x, sigma) {
          if (any(x < 0)) return (0)
          stopifnot(sigma > 0)
          return((x / sigma^2) * exp(-x^2 / (2*sigma^2)))
}   

sta561MCMC <- function(m, sigma, startval, proposalsd) {
  x <- rep(0, m)
  x[1] <- startval
  for (i in 2:m) {
    currentx <- x[i - 1]
    proposedx <- rchisq(1, df = currentx)
    num <- target(proposedx,sigma)*dchisq(currentx, df = proposedx)
    den <-  target(currentx,sigma)* dchisq(proposedx, df = currentx)
    rasio <- num/den
    if (runif(1) < rasio) {
      x[i] <- proposedx
    } else {
      x[i] <- currentx
    }
  }
  return(x)
}

z <- sta561MCMC(m,sigma,1,1)
plot(z, type = "l")

par(mfrow = c(1, 2))
y <- z[1:m]
a <- ppoints(100)
QR <- sigma * sqrt(-2 * log(1 - a))     # kuantil sebaran Rayleigh
Q <- quantile(z, a)
qqplot(QR, Q, main="", xlab="Rayleigh Quantiles", ylab="Sample Quantiles")
hist(y, breaks="scott", main="", xlab="", freq=FALSE)
lines(QR, f(QR, 4))

par(mfrow = c(1, 1))

Latihan 1

library(ggplot2)
library(mvtnorm)
#install.packages("MBESS")
library(MBESS)

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!

Jawab:

Langkah 1 ada mendefinisikan parameter-parameter yang digunakan untuk simulasi

# mendefinisikan ukuran sampel dari 5 sampai 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 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

Jawab

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

Jawab

#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

TERIMA KASIH

Referensi

Dito, Gerry Alfa dan Raharjo, Mulianto. 2021. EM Algorithm. Retrieved From https://newlms.ipb.ac.id

Dito, Gerry Alfa dan Raharjo, Mulianto. 2021. Metode Monte Carlo. Retrieved From https://newlms.ipb.ac.id

Dito, Gerry Alfa dan Raharjo, Mulianto. 2021. Resampling. Retrieved From https://newlms.ipb.ac.id

Wigena, Aji Hamim. 2021. STA561 Pemrograman Statistika: Expectation-Maximization (EM). Retrieved from https://newlms.ipb.ac.id/

Wigena, Aji Hamim. 2021. STA561 Pemrograman Statistika: Komputasi untuk Regresi. Retrieved from https://newlms.ipb.ac.id/

Wigena, Aji Hamim. 2021. STA561 Pemrograman Statistika: Metode Monte Carlo. Retrieved from https://newlms.ipb.ac.id/

Wigena, Aji Hamim. 2021. STA561 Pemrograman Statistika: Resampling (Bootstrap dan Jacknife). Retrieved from https://newlms.ipb.ac.id/

Wikibooks. 4 November 2018. Data Mining Algorithms In R/Clustering/Expectation Maximization (EM). Retrieved from https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Clustering/Expectation_Maximization_(EM)


  1. Tugas Praktikum 5 STA561 Pemrograman Statistika, Reni Amelia, Mahasiswa Pascasarjana Statistika dan Sains Data, IPB University, ↩︎