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.Myang 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.Mtersebut!
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$Kecepatannama(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