Laporan 3 - Pemrograman Statistika

Pemrograman Fungsi dan OOP

Pengertian Fungsi

Fungsi (function) dalam adalah kode-kode yang disusun untuk melakukan tugas tertentu, seperti perhitungan matematis, pembacaan data, analisis statistik, dan lainnya. Seperti halnya fungsi matematika yang kita kenal, f(x), yang akan memetakan nilai x1 ke f(x1) sesuai dengan aturan pemetaannya. Dalam fungsi R, fungsi membutuhkan (atau tidak membutuhkan) input (seperti x1), kemudian akan mengeluarkan output seperti halnya f(x1)

Membuat Fungsi

Fungsi 1

Membuat sekumpulan mekanisme dasar yang dijalankan secara simultan

function( arglist )
{ expr
return(value)
}
## function( arglist )
## { expr
## return(value)
## }

Fungsi 2

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.6384248 0.2314573 1.0744924 2.5278784 0.4282316 1.8435318 2.6886901
##  [8] 2.9974261 2.7596145 0.8294494
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.73158729 0.85929862 0.82559955 0.70875536 0.51219096 0.85521056
##  [7] 0.05758293 0.65390058 0.77944721 0.34245955
## 
## $y
##  [1] 0.68560801 0.58870678 0.47431032 0.91572898 0.72040548 0.61595603
##  [7] 0.52214321 0.03309944 0.99154261 0.86657697
## 
## $z
##  [1] 2.0084425 2.0967196 1.6897657 2.6389494 1.5192940 2.1643312 0.3360824
##  [8] 0.4719690 3.1364049 1.4617693
angka_acak3=function(n=10,pw=2)
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
angka_acak3()
##  [1] 0.18970587 2.25422777 1.00731146 2.62655446 0.08261135 0.41051610
##  [7] 0.63264827 1.97748328 0.44298608 0.77992245
angka_acak4=function()
{ x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
n <- 5; pw <- 3
angka_acak4()
## [1] 0.02836592 1.45832104 4.07626750 0.01541606 3.48410761

Latihan

Latihan 1

Buatlah fungsi untuk mencari median dari suatu vektor

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

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!

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
## 
## Call:
## lm(formula = Pendapatan ~ Biaya.Iklan + Jumlah.Warung)
## 
## Coefficients:
##   (Intercept)    Biaya.Iklan  Jumlah.Warung  
##      -0.21382        0.89843        0.01745
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)
X
##   [1] 4 6 5 7 7 2 5 7 5 5 8 5 6 5 3 7 4 2 4 8 7 6 6 9 6 6 5 5 4 3 8 7 6 6 2 5 6
##  [38] 4 4 4 3 5 5 4 3 3 4 5 4 7 2 5 6 3 5 4 3 6 7 4 6 3 5 4 6 5 6 6 6 5 6 6 6 0
##  [75] 5 4 5 5 4 3 4 6 5 6 3 5 8 7 7 4 3 6 4 6 4 4 6 3 5 5

Object Oriented Programming

Pemrograman berorientasi objek merupakan sebuah paradigma dalam pembuatan sebuah program. OOP menitikberatkan pada identifikasi objek-objek yang terlibat dalam sebuah program dan bagaimana objek-objek tersebut berinterakasi. Pada OOP, program yang dibangun akan dibagi-bagi menjadi objek-objek. OOP menyediakan class dan object sebagai alat dasar untuk meminimalisir dan mengatur kompleksitas dari program.

Sebagai contoh, kita dapat menganggap class seperti sebuah sketsa mobil yang memiliki semua detail mengenai nama_model, nomor_model, mesin, dll. Berdasarkan deskripsi tersebut maka kita akan memilih sebuah mobil. Mobil tersebut adalah sebuah object. Setiap objek mobil memiliki karakteristik dan fitur masing masing.

Class (Kelas)

Merupakan definisi statik (kerangka dasar) dari objek yang akan diciptakan.

Suatu class dibagi menjadi:

*Property, merupakan data atau state yang dimiliki oleh class. Contoh pada class Mobil, memiliki property: warna, Model, Produsen.

  • Method, merupakan behavior (perilaku) sebuah class. Bisa dikatakan sebagai aksi atau tindakan yang bisa dilakukan oleh suatu class. Contoh pada class Mobil, memiliki method: Start, Stop, Change Gear, Turn.

Object

Objek adalah komponen yang diciptakan dari class (instance of class). Satu class bisa menghasilkan banyak objek. Proses untuk membuat sebuah objek disebut instantiation. Setiap objek memiliki karakteristik dan fitur masing masing. Objek memiliki siklus creation, manipulation, dan destruction.

Object - Class System S3

A1 <- c(1:10)
class(A1)
## [1] "integer"
A2 <- matrix(A1,2,5)
class(A2)
## [1] "matrix" "array"
A3 <- 1:12
A3
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
A4 <- letters[1:12]
A4
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
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)
A5
##  [1] 11.25332 11.97145 12.95713 15.36860 14.77423 17.51647 15.45125 18.58461
##  [9] 19.12385 20.21594 21.37964 21.49768
B2 <- lm(A5~A3) #membuat model linear
B2
## 
## Call:
## lm(formula = A5 ~ A3)
## 
## Coefficients:
## (Intercept)           A3  
##     10.3946       0.9661
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

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

Mengubah Menjadi Class (Menggunakan Fungsi Konstruktor)

  • Lebih direkomendasikan menggunakan fungsi konstruktor

  • Fungsi konstruktor menambahkan screening sebelum menambahkan class

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"

Fungsi Aksesor

Cara langsung

Mobil2$Nama
## [1] "Suzuki"
Mobil3$Panjang
## [1] 2.1

Dengan Fungsi Aksesor

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

Fungsi Generik

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

Menciptakan fungsi Generik

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

Object - Class System S4

Class System S4 mengatasi masalah dalam Class System S3 dengan sistem objek lebih formal. Salah satu keuntungannya adalah sistem penurunan dari class/ objek. Dalam sistem objek formal, setiap objek didefinisikan secara formal dalam suatu class. Sebuah class terdiri dari slot dengan tipe atau class spesifik.

Membuat Objek S4

setClass("car",
representation(Nama="character",
Panjang="numeric",
Lebar="numeric",
Kecepatan="numeric"))
Car1 <- new("car", Nama="Toyota",
Panjang=3.5, Lebar=2,
Kecepatan=180)

Membuat Objek 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"

Akses Terhadap Slot

Cara Langsung

Car1@Nama
## [1] "Toyota"
Car2@Kecepatan
## [1] 150

Dengan Fungsi Aksesor

nama1 <- function(objek) objek@Nama
kecepatan1 <- function(objek) objek@Kecepatan
nama1(Car1)
## [1] "Toyota"
kecepatan1(Car2)
## [1] 150

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"))
## [1] "fungsibaru"

Optimasi

Pengertian Optimasi

Optimasi merupakan suatu proses untuk mecari kondisi yang optimum, dalam arti paling maksimal, atau paling minimal. Optimasi dapat dilakukan dengan meminimumkan atau memaksimumkan suatu fungsi. Banyak sekali pemrograman statistika yang menggunakan fungsi optimasi sebagai contoh dalam pendugaan paramater. Pendugaan parameter dengan cara meminimumkan contohnya adalah dalam regresi linier yang meminimumkan jumlah kuadrat sisaan. Pendugaan parameter dengan cara memaksimumkan contohnya adalah dengan metode Maximum Likelihood Estimator. Konsep materi yang ditekankan adalah konsep optimasi numerik meminimumkan/ memaksimumkan fungsi tujuan.

Integral

Fungsi integral yang dapat digunakan pada R adalah integrate(fungsi, lower, upper). Selain itu, terdapat fungsi yac_str pada package Ryacas untuk mencari integral tak tentu.

Berikut akan diberikan contoh penggunakan fungsi integrate pada beberapa kasus.

Latihan 1

Carilah hasil integral tak tentu berikut menggunakan fungsi yac_str dari package Ryacas

Kemudian cari hasil integral tentu berikut menggunakan fungsi integrate

library(Ryacas)
## Warning: package 'Ryacas' was built under R version 4.0.5
## 
## 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

Carilah hasil integral tak tentu berikut menggunakan fungsi yac_str dari package Ryacas

Kemudian cari hasil integral tentu berikut menggunakan fungsi integrate, bandingkan hasilnya dengan menghitung Γ(5) dengan menggunakan fungsi gamma

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

Latihan 3 (Optimasi Satu Dimensi)

Carilah titik maksimum dan minimum dari fungsi berikut 𝑓(𝑥) = sin 𝑥 + sin 2𝑥 + cos 3𝑥 !

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
optimize(f3, interval = c(0, 1.5), maximum = T) #maksimum global
## $maximum
## [1] 0.3323289
## 
## $objective
## [1] 1.485871

Latihan 4 (Fungsi Polinomial)

Carilah titik minimum dari fungsi 𝑓 𝑥 = 4𝑥^4 − 2𝑥^3 − 3𝑥!

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

Latihan 5 (Regresi Linear)

Lakukan pendugaan parameter regresi dengan meminimumkan jumlah kuadrat galat (residual sum of square) dari data berikut! Kemudian bandingkan hasilnya dengan output dari fungsi lm!

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

Reference

Raharjo, Mulianto. STA561 Pemrograman Statistika: Pemrograman Fungsi & OOP. Retrieved from https://newlms.ipb.ac.id/

Rahmi, Annisa. Optimasi. Retrieved from https://www.rpubs.com/annisarahmi/744557

Primandari, Arum H. (2018). Membuat Fungsi dalam R. Retrieved from https://rpubs.com/arumprimandari/368914