Tugas Praktikum Ketigas STA561 Pemrograman Statistika

Klik disini untuk ke halaman rpubs.

Fungsi dan OOP (Praktikum Pertemuan Keenam)

Fungsi

R telah menyiapkan banyak fungsi yang dapat dimanfaatkan untuk komputasi dan grafik. Fungsi yang tidak ada dalam R karena berkembangnya statistika dapat diciptakan sendiri.

Membuat sekumpulan mekanisme dasar yang dijalankan secara simultan secara umum digunakan Syntax:

function( arglist ) { expr return(value) }

#Return value
angka_acak1=function(n,pw)
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
angka_acak1(10,2)
##  [1] 0.37910386 0.65399185 0.61955430 0.09504381 2.08552152 1.69692971
##  [7] 0.33464538 1.40952429 0.19876157 0.29361407
#Return value
angka_acak2=function(n,pw)
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(list(x=x,y=y,z=z))
}
angka_acak2(10,2)
## $x
##  [1] 0.06925621 0.21146990 0.79076226 0.75413825 0.30374451 0.71856188
##  [7] 0.39196244 0.37674184 0.18063171 0.75784270
## 
## $y
##  [1] 0.6834656 0.9850363 0.9601427 0.1307271 0.8079957 0.3476402 0.8804274
##  [8] 0.2528720 0.6430956 0.6706402
## 
## $z
##  [1] 0.5665901 1.4316270 3.0656682 0.7829868 1.2359662 1.1367868 1.6189758
##  [8] 0.3964136 0.6785267 2.0405635
#Return value
angka_acak3=function(n=10,pw=2)
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
angka_acak3()
##  [1] 0.9528312 1.3862525 0.8747391 1.2777245 2.0903869 0.6351781 0.5438862
##  [8] 0.5139846 0.9744523 0.2760594
#Return value
angka_acak4=function()
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
n <- 5; pw <- 3
angka_acak4()
## [1] 0.67211248 1.04457223 1.76399170 0.03836678 1.33339392

Latihan 1

Buatlah fungsi untuk mencari median dari suatu vektor!

#mencari median
med <- function(vect) {
n <- length(vect)
vects <- sort(vect)
if(n%%2 == 1) {m <- vects[(n+1)/2]}
else {m <- (vects[n/2]+vects[(n/2)+1])/2}
return(m)
}
x1 <- c(1,5,3,7,3,4,2,7)
med(x1)
## [1] 3.5

Latihan 2

Buatlah fungsi untuk mencari modus dari suatu vektor!

#Mencari modus
modus <- function(vect)
{ v <- unique(vect)
f <- NULL
for(i in v)
{ byk <- sum(vect==i)
f <- c(f,byk)
}
fmax <- max(f)
vf <- cbind(v,f)
mode <- vf[f==fmax,]
return(mode)
}
modus(x1)
##      v f
## [1,] 3 2
## [2,] 7 2

Latihan 3

Buatlah fungsi untuk menduga parameter pada regresi berganda!

#Membuat penduga parameter regresi berganda
p.est<-function(A){
if(!is.matrix(A))
stop("input must be on matrix")
x1<-A[,-1]
y <-A[,1]
one<-rep(1,nrow(A))
x <-cbind(one,x1)
colnames(x)<-paste("x",1:ncol(x),sep="")
b.est<-as.vector(solve(t(x) %*% x) %*% (t(x) %*% y))
names(b.est)<-paste("b",0:(length(b.est)-1),sep="")
fitted.value<-as.vector(x%*%b.est)
error<-as.vector(y-fitted.value)
names(fitted.value)<-names(error)<-1:nrow(A)
list(beta.est=b.est,fit.val=fitted.value,error=error)
}
Pendapatan<-c(3.5,3.2,3.0,2.9,4.0,2.5,2.3)
Biaya.Iklan<-c(3.1,3.4,3.0,3.2,3.9,2.8,2.2)
Jumlah.Warung<-c(30,25,20,30,40,25,30)
X<-cbind(Pendapatan,Biaya.Iklan,Jumlah.Warung)
p.est(X)
## $beta.est
##          b0          b1          b2 
## -0.21381852  0.89843390  0.01745279 
## 
## $fit.val
##        1        2        3        4        5        6        7 
## 3.094910 3.277176 2.830539 3.184754 3.988185 2.738116 2.286320 
## 
## $error
##           1           2           3           4           5           6 
##  0.40508982 -0.07717642  0.16946108 -0.28475357  0.01181483 -0.23811608 
##           7 
##  0.01368033
model<-lm(Pendapatan~Biaya.Iklan+Jumlah.Warung)
model$coefficients
##   (Intercept)   Biaya.Iklan Jumlah.Warung 
##   -0.21381852    0.89843390    0.01745279
model$fitted.values
##        1        2        3        4        5        6        7 
## 3.094910 3.277176 2.830539 3.184754 3.988185 2.738116 2.286320
model$residuals
##           1           2           3           4           5           6 
##  0.40508982 -0.07717642  0.16946108 -0.28475357  0.01181483 -0.23811608 
##           7 
##  0.01368033

Latihan 4

  • Buat fungsi bernama three.M yang digunakan untuk menghitung mean, median, dan modus dari suatu vektor modus (tanpa menggunakan fungsi mean, quantile, ataupun fungsi “instan” lain yang sudah tersedia sebelumnya di R)!

  • Hitung mean, median, modus dari X dibawah ini dengan menggunakan fungsi three.M tersebut!

set.seed(123) X <- rbinom(100,10,0.5)

#Three.M
three.M <- function(vect) {
n <- length(vect) # banyak data 

# menghitung rataan 
jumlah <- sum(vect)
rataan <- jumlah/n

# menhitung median
vects <- sort(vect) # urutkan
if(n%%2 == 1) {m <- vects[(n+1)/2]}
else {m <- (vects[n/2]+vects[(n/2)+1])/2} 

# menghitung modus
v <- unique(vect)
f <- NULL
for(i in v)
{ byk <- sum(vect==i)
f <- c(f,byk)
}
fmax <- max(f)
vf <- cbind(v,f)
mode <- vf[f==fmax,]

# output
my_list <- list("mean" = rataan, "median" = m, "modus" = mode)
return(my_list)
}

# hitung mean median modus distribusi binomial
set.seed(123)
x1 <- rbinom(100,10,0.5)
three.M(x1)
## $mean
## [1] 4.99
## 
## $median
## [1] 5
## 
## $modus
##      v  f
## [1,] 6 24
## [2,] 5 24

Object Oriented Programming (OOP)

Object Oriented Programming:

  • A class defines the behavior of objects by describing their attributes and their relationship to other classes.

  • A method is functions that behave differently depending on the class of their input.

  • Classes are usually organized in a hierarchy: if a method does not exist for a child, then the parent’s method is used instead; the child inherits behavior from the parent.

  • Pengembangan awal objek di R menggunakan Class System S3 yang tidak terlalu ketat.

  • Pendefinisian yang ketat secara formal, R menggunakan Class System S4

Misal:

Objeknya: mobil

kelasnya: kendaraan roda empat.

Metodenya: bisa rem, mengisi bensin, mengatur kecepatan.

Attribut: bahan bakar apa, dimensi kendaraan, komponen apa saja yang ada.

Konsep OOP dalam R:

• Encapsulation

• Inheritance

numeric(), matrix(), list()

• Polymorphism

plot.acf(…), plot.ecdf(…), plot.data.frame(…), plot.lm(…)

Object-S3

A1 <- c(1:10)
class(A1)
## [1] "integer"
A2 <- matrix(A1,2,5)
class(A2)
## [1] "matrix" "array"
A3 <- 1:12
A4 <- letters[1:12]
B1 <- data.frame(A3,A4)
class(B1)
## [1] "data.frame"
B1$A4
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
A5 <- 10+A3+rnorm(12)
B2 <- lm(A5~A3) #membuat model linear
class(B2)
## [1] "lm"
methods(class=class(B2))
##  [1] add1           alias          anova          case.names     coerce        
##  [6] confint        cooks.distance deviance       dfbeta         dfbetas       
## [11] drop1          dummy.coef     effects        extractAIC     family        
## [16] formula        hatvalues      influence      initialize     kappa         
## [21] labels         logLik         model.frame    model.matrix   nobs          
## [26] plot           predict        print          proj           qr            
## [31] residuals      rstandard      rstudent       show           simulate      
## [36] slotsFromS3    summary        variable.names vcov          
## see '?methods' for accessing help and source code
summary(B2)
## 
## Call:
## lm(formula = A5 ~ A3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.70634 -0.37935 -0.03672  0.38335  1.32502 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 10.39462    0.51345   20.25 1.91e-09 ***
## A3           0.96614    0.06976   13.85 7.51e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8343 on 10 degrees of freedom
## Multiple R-squared:  0.9504, Adjusted R-squared:  0.9455 
## F-statistic: 191.8 on 1 and 10 DF,  p-value: 7.514e-08
names(B2)
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
B2$coefficients
## (Intercept)          A3 
##  10.3946172   0.9661381

Mengubah menjadi Class:

class(obj) <- “class.name”

Mobil1 <- list(Nama="Toyota", Panjang=3.5,
Lebar=2, Kecepatan=180)
class(Mobil1)
## [1] "list"
class(Mobil1) <- "mobil"
class(Mobil1) <- "mobil"
Mobil2 <- list(Nama="Suzuki", Panjang=1,
Lebar=1.8, Kecepatan=150)
class(Mobil2) <- "mobil"
class(Mobil2)
## [1] "mobil"

Mengubah menjadi Class (Menggunakan Fungsi Konstruktor):

  • Lebih direkomendasikan menggunakan fungsi konstruktor

  • Fungsi konstruktor menambahkan screening sebelum menambahkan class

#contoh input data yang sesuai kriteria
Mobil <- function(Nama,Panjang,Lebar,Kecepatan){
if(Panjang<2 || Lebar<1.5 || Kecepatan<80)
stop("atribut tidak sesuai")
Mobil <- list(Nama=Nama, Panjang=Panjang,
Lebar=Lebar, Kecepatan=Kecepatan)
class(Mobil) <- "mobil"
Mobil
}
Mobil3 <- Mobil("Daihatsu", 2.1, 1.9, 120)
Mobil3
## $Nama
## [1] "Daihatsu"
## 
## $Panjang
## [1] 2.1
## 
## $Lebar
## [1] 1.9
## 
## $Kecepatan
## [1] 120
## 
## attr(,"class")
## [1] "mobil"
#contoh input data yang tidak sesuai kriteria
#Mobil <- function(Nama,Panjang,Lebar,Kecepatan){
#if(Panjang<2 || Lebar<1.5 || Kecepatan<80)
#stop("atribut tidak sesuai")
#Mobil <- list(Nama=Nama, Panjang=Panjang,
#Lebar=Lebar, Kecepatan=Kecepatan)
#class(Mobil) <- "mobil"
#Mobil
#}
#Mobil4 <- Mobil("Proton", 2, 1.8, 70)
#Mobil4

Fungsi Aksesor

  • Cara langsung (tidak direkomendasikan):

    Mobil2$Nama

    Mobil3$Panjang

Mobil2$Nama
## [1] "Suzuki"
Mobil3$Panjang
## [1] 2.1
  • Dengan fungsi aksesor: nama <- function(objek) objek$Nama

    kecepatan <- function(objek) objek$Kecepatan

    nama(Mobil1)

    kecepatan(Mobil3)

nama <- function(objek) objek$Nama
kecepatan <- function(objek) objek$Kecepatan
nama(Mobil1)
## [1] "Toyota"
kecepatan(Mobil3)
## [1] 120

Fungsi Generik Print Method

function(…){…}

print.mobil <- function(objek) {
print(cat("Nama : ", nama(objek), "\n",
"Kecepatan : ", kecepatan(objek),
sep="")
)
}

Mobil1
## Nama : Toyota
## Kecepatan : 180NULL

Menciptakan Fungsi Generik

Method hanya dapat didefinisikan untuk fungsi yang generik. Membuat nama method baru dengan menciptakan fungsi generik

fungsibaru <- function (objek) UseMethod("fungsibaru")

Object-S4

• Mengatasi masalah dalam sistem objek S3 dengan sistem objek lebih formal

• Mendefinisikan class baru :

setClass(“class.name”, representation(x=“type”), prototype(x=“…”))

• Mendefinisikan objek baru dari kelas tertentu :

new(class.name,…)

#Membuat Object S4
setClass("car",
representation(Nama="character",
Panjang="numeric",
Lebar="numeric",
Kecepatan="numeric"))
Car1 <- new("car", Nama="Toyota",
Panjang=3.5, Lebar=2,
Kecepatan=180)
Car1
## An object of class "car"
## Slot "Nama":
## [1] "Toyota"
## 
## Slot "Panjang":
## [1] 3.5
## 
## Slot "Lebar":
## [1] 2
## 
## Slot "Kecepatan":
## [1] 180
#Membuat Object S4 Menggunakan Fungsi Konstruktor
 Car <- function(Nama,Panjang,Lebar,Kecepatan){
if(Panjang<2 || Lebar<1.5 || Kecepatan<80)
stop("atribut tidak sesuai")
new("car", Nama=Nama, Panjang=Panjang,
Lebar=Lebar, Kecepatan=Kecepatan)
}
Car2 <- Car("Suzuki", 2.4, 1.8, 150)
class(Car2)
## [1] "car"
## attr(,"package")
## [1] ".GlobalEnv"
class(Mobil1)
## [1] "mobil"
Car2
## An object of class "car"
## Slot "Nama":
## [1] "Suzuki"
## 
## Slot "Panjang":
## [1] 2.4
## 
## Slot "Lebar":
## [1] 1.8
## 
## Slot "Kecepatan":
## [1] 150

Akses terhadap Slot

# Akses terhadap slot dengan Cara langsung
Car1@Nama
## [1] "Toyota"
Car2@Kecepatan
## [1] 150
  • Dengan fungsi aksesor:
# Akses terhadap slot dengan fungsi aksesor 
nama1 <- function(objek) objek@Nama
kecepatan1 <- function(objek) objek@Kecepatan
nama1(Car1)
## [1] "Toyota"
kecepatan1(Car2)
## [1] 150

Class Method

setMethod(“method”,“class.name”, function(…){…})

# Class Method
setMethod(show, "car", function(object) {
print(cat("Nama : ", nama1(object), "\n",
"Kecepatan : ", kecepatan1(object),
sep="")
)}
)
Car2
## Nama : Suzuki
## Kecepatan : 150NULL

Menciptakan Fungsi Generik S4:

setGeneric(“fungsibaru”, function(objek) standardGeneric(“fungsibaru”))

setGeneric("fungsibaru",
function(objek)
standardGeneric("fungsibaru"))
## [1] "fungsibaru"

Optimasi (Praktikum Pertemuan Ketujuh)

#Operasi yang kurang tepat bilangan riil dalam basis 2
(.3 - .1)== .2
## [1] FALSE
.2 - (.3 - .1) #jika pangkat dari sudah mencapai -6 maka data sudah dianggap 0 
## [1] 2.775558e-17
#Mengatasi Eror basis 2
isTRUE (all.equal(.2 , .3 - .1) )
## [1] TRUE
#Mengatasi Eror basis 2
all.equal(.2 , .3) # not a logical value
## [1] "Mean relative difference: 0.5"
#Mengatasi Eror basis 2
isTRUE (all.equal(.2 , .3) ) # always a logical value
## [1] FALSE

Diferensial

#Diferensial
xfs<-expression(exp(x ^2) )
D( xfs ,"x")
## exp(x^2) * (2 * x)
xturunan<-deriv(~x ^2 ,"x")
x<-2
eval( xturunan )
## [1] 4
## attr(,"gradient")
##      x
## [1,] 4

Integral

#Integral
fs<-function(x) x ^2
integrate (fs ,0 ,1)
## 0.3333333 with absolute error < 3.7e-15

Latihan 1

#Latihan 1
#Integral
#install.packages('Ryacas')
library(Ryacas)
## 
## Attaching package: 'Ryacas'
## The following object is masked from 'package:stats':
## 
##     integrate
## The following objects are masked from 'package:base':
## 
##     %*%, diag, diag<-, lower.tri, upper.tri
yac_str("Integrate(x) x^2 + 4*x")
## [1] "x^3/3+2*x^2"
f1 <-function(x) x^2 + 4*x
integrate(f1,lower = -10,upper = 10)
## 666.6667 with absolute error < 7.6e-12

Latihan 2

#Latihan 2
#Integral
yac_str("Integrate(t) t^4 * Exp(-t)")
## [1] "4*(3*((-2)*(t+1)*Exp(-t)-t^2*Exp(-t))-t^3*Exp(-t))-t^4*Exp(-t)"
f2 <-function(t) t^(4) * exp(-t)
integrate(f2,lower = 0,upper = Inf)
## 24 with absolute error < 2.2e-05
gamma(5)
## [1] 24

Newton Raphson

#Newton Raphson

newtonr<-function(fx , x0 =1) {
fx1 <- deriv(fx ,"x") # turunan pertama
fx2 <- deriv(D(fx ,"x") ,"x") # turunan kedua

e <- 1000

while(e >1e-6) {
x <- x0
f1 <- attr(eval( fx1 ) ,"gradient") [1]
f2 <- attr(eval( fx2 ) ,"gradient") [1]
e <- abs( f1 ) # bisa juga e <- abs (x - x0 )
x <- x0 - f1/f2
x0 <- x
}
return( x )
}

fx<-expression(4*x ^2 - 3*x - 7)
newtonr (fx ,3)
## [1] 0.375
fx<-expression(exp(-x) + x^4)
newtonr ( fx )
## [1] 0.5282519
fx<-expression(x^2 - x)
newtonr ( fx )
## [1] 0.5

Optimasi Satu Dimensi (Optimize)

Digunakan untuk mendapatkan nilai minimum dari suatu fungsi dengan satu peubah.

Misal akan dicari nilai minimum dari fungsi: f(x) = (x - 1/3)^2

#Optimize/Optimise
f<-function(x , a) (x - a)^2
xmin<- optimize(f ,c(0 , 1) ,
 tol = 0.0001 , a = 1/3)
xmin
## $minimum
## [1] 0.3333333
## 
## $objective
## [1] 0
fx <- function(x)(x-(1/3))^2
curve(fx,from=-1.5, to=2)  

Latihan 3

#Latihan 3
#Optimasi Satu Dimensi
f3 <-function(x) sin(x) + sin(2*x) + cos(3*x)
curve(f3, from = 0, to = 2*pi)

optimize(f3, interval = c(0, 2*pi)) #minimum lokal
## $minimum
## [1] 3.033129
## 
## $objective
## [1] -1.054505
optimize(f3, interval = c(4, 2*pi)) #minimum global
## $minimum
## [1] 5.273383
## 
## $objective
## [1] -2.741405
optimize(f3, interval = c(0, 2*pi), maximum = T) #maksimum lokal 
## $maximum
## [1] 4.0598
## 
## $objective
## [1] 1.096473
#default maximum = F untuk mencari titik minimum

optimize(f3, interval = c(0, 1.5), maximum = T) #maksimum global
## $maximum
## [1] 0.3323289
## 
## $objective
## [1] 1.485871

Optimasi Fungsi Polinomial (Optim)

Untuk mencari nilai minimum dari fungsi lebih dari satu peubah.

Misal mencari nilai x1 dan x2 yang membuat f(x1,x2) = 100(x2- x1^2 ) ^2 + (1-x1) ^2 minimum.

#Optim 
fr <- function(x) {
x1 <- x[1]
x2 <- x[2]
+ 100*(x2 - x1^2)^2
+ (1 - x1)^2
}

optim(c( -1.2 ,1) , fr )
## $par
## [1]  1.0002837 -0.1642825
## 
## $value
## [1] 8.050091e-08
## 
## $counts
## function gradient 
##       47       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL

Latihan 4

#Latihan 4
#Optimasi Fungsi Polinomial
f4 <-function(x) 4*x^4-2*x^3-3*x
curve(f4, from = -1, to = 1.5)

optim(par = c(-0.5), fn= f4)
## Warning in optim(par = c(-0.5), fn = f4): one-dimensional optimization by Nelder-Mead is unreliable:
## use "Brent" or optimize() directly
## $par
## [1] 0.728418
## 
## $value
## [1] -1.832126
## 
## $counts
## function gradient 
##       36       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
#Metode Kuadrat Terkecil dengan Optim 

f<-function( para , y , x){
X<- cbind(1 , x)
yhat<- X %*%as.matrix( para )
sisa2<- sum((y - yhat ) ^2)
return( sisa2 )
}

x1<-runif(10 ,1 ,10)
x2<-runif(10 ,1 ,10)
galat<-rnorm(10 ,0 ,0.5)
y<-1 + 2*x1 + 3*x2 + galat

hasil <- optim(c(1 ,1 ,1) ,f ,y=y ,x=cbind(x1,x2))
hasil$par
## [1] 1.881706 1.914983 2.927032
lm(y~x1 + x2 )
## 
## Call:
## lm(formula = y ~ x1 + x2)
## 
## Coefficients:
## (Intercept)           x1           x2  
##       1.875        1.915        2.928

Regresi Linier

Latihan 5

#Latihan 5
#Regresi Linier
data5=data.frame(x=c(1,2,3,4,5,6),
y=c(1,3,5,6,8,12))
JKG <-function(data, b) {
with(data, sum((b[1]+b[2]*x-y)^2))
}
hasil1 <-optim(par = c(1,1), fn = JKG, data = data5)
hasil2 <-lm(y~x, data = data5)
plot(data5)
abline(hasil1$par,col=4)

hasil1$par
## [1] -1.266302  2.028449
hasil2$coefficients
## (Intercept)           x 
##   -1.266667    2.028571
hasil1$value
## [1] 2.819048
sum(hasil2$residuals^2)
## [1] 2.819048
(.3 - .1)
## [1] 0.2

MLE: Maximum Likelihood Estimator

Metode ini merupakan metode yang paling sering digunakan untuk menduga parameter sebaran

Teladan: Jika x1,x2,… xn berasal dari peubah acak X~N (miyu,sigma), tentukan penduga bagi miyu dan sigma menggunakan MLE.

#MLE 

negloglik<-function( para , xd ){
nilai<--1*sum(dnorm(xd ,mean= para [1] ,sd= para [2] ,log=
TRUE ))
+ return( nilai )
}

x<-rnorm(10 ,2 ,5)
hasil<-optim(c(1 ,1) , negloglik , xd =x)
hasil$par
## [1] 4.141031 2.730255
c(mean(x) ,sd(x)) # pembanding
## [1] 4.140905 2.879107

Tugas

Tentukan pendugaan parameter dalam regresi linier dengan menggunakan kemungkinan maksimum (MLE)!

#Regresi Linier dengan MLE 

regloglik<-function( para, y , x ){
nilai<--1*sum(dnorm(y ,mean= para [1] + x*para [2] ,sd= para [3] ,log=
TRUE ))
return( nilai )
}

x<-c(2,6,3,8,13)
y<-c(8,17,15,11,19)

hasil<-optim(c(1 ,1,1) , regloglik , y=y, x=x)
hasil$par
## [1] 9.8544869 0.6476157 3.0848436
lm(y~x) # pembanding
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##      9.8549       0.6477

Diperoleh nilai penduga B0 dan B1 yang sama antara metode langsung menggunakan lm() dan metode MLE.

Eksplorasi Mandiri (Pendugaan Regresi Linier dengan Menggunakan MLE)

Menentukan pendugaan regresi linier dengan menggunakan kemungkinan maksimum (MLE).

Model Regresi Linier Sederhana: Yi = B0 + B1Xi + Ei ; i = 1,2,…,n

Membangkitkan Bilangan Acak

#Membangkitkan Bilangan Acak X dari distribusi normal
data.x <- rnorm(n = 100, mean = 10, sd = 2)
#Membangkitkan nilai Y dengan menentukan nilai B0 adalah 8 dan B1 adalah 3 
B0 <- 8
B1 <- 3

Y <- B0 + data.x*B1

#Lalu menentukan noise atau error dari data dengan sd = 1
noise.err.sd. <- 1
noise_error <- rnorm(100,0,1)
data.y <- Y + noise_error

plot(data.x, data.y)

Terlihat bahwa data X dan Y yang dibangkitkan memiliki hubungan linier.

Pendugaan Regresi Linier dengan MLE

Diasumsikan berdistribusi Normal (miyu = B0 + B1X1, sigma=standar deviasi). Akan dicari nilai penduga beta nol dan beta satu. Selain itu, akan dicari juga nilai standar deviasi.

#MLE

lm.loss <- function(par) {
  
  B0.par <- par[1]  # parameter B0 atau intercept
  B1.par <- par[2]  # parameter B1
  err.sigma <- par[3]  #standard deviasi


if(err.sigma < 0) {deviance <- 10000000}  
# prosedur optimalisasi: dibuat nilai toleransi jika standar deviasi tidak valid misal negatif, maka akan dikembalikan kepada deviance yang sangat tinggi.
  
if(err.sigma > 0) {
  
likelihoods <- dnorm(data.y, mean = B0.par + data.x *B1.par, sd = err.sigma) #Spesifikasi Model

log.likelihoods <- log(likelihoods) # Mengkalkulasi nilai likelihood untuk setiap data
 
deviance <- -2 * sum(log.likelihoods) # Menyusun deviance (-2*sum of log-likelihoods)
}

return(deviance)
}

parameter.fits <- optim(par = c(1, 1, 10),
      fn = lm.loss, hessian = T
      )

parameter.fits
## $par
## [1] 8.0168814 3.0034131 0.9391614
## 
## $value
## [1] 271.2381
## 
## $counts
## function gradient 
##      188       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
## 
## $hessian
##               [,1]         [,2]         [,3]
## [1,]  226.75114386 2.243185e+03  -0.01707136
## [2,] 2243.18529325 2.304490e+04   0.04962114
## [3,]   -0.01707136 4.962114e-02 453.53369504

Nilai $par pada output di atas secara berturut-turut menunjukkan nilai dari penduga B0, B1, dan standar deviasi.

Membandingkan dengan fungsi lm()

Membandingkan hasil optimasi MLE sebelumnya dengan fungsi regresi linier biasa dengan menggunakan lm()

built.in <- lm(data.y ~ data.x)
built.in
## 
## Call:
## lm(formula = data.y ~ data.x)
## 
## Coefficients:
## (Intercept)       data.x  
##       8.016        3.004

Diperoleh nilai penduga B0 dan B1 yang sama dengan metode optimasi MLE yang telah dilakukan sebelumnya.

TERIMA KASIH


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