1. PEMROGRAMAN FUNGSI & OOP (MATERI 6)

FUNGSI

#Membuat sekumpulan mekanisme dasar yang dijalankan secara simultan
function(arglist){
  expr
  return(value)
}
## function(arglist){
##   expr
##   return(value)
## }
#Return value
angka_acak1=function(n,pw)
{x=runif(n)
 y=runif(n)
 z=(x+y)^pw
 return(z)
}
set.seed(99);angka_acak1(10,2)
##  [1] 1.2848885 0.3834500 0.7710617 2.6549864 1.4952244 2.5818218 1.0594851
##  [8] 0.1577382 0.2080764 0.1283080
angka_acak2=function(n,pw)
{x=runif(n)
 y=runif(n)
 z=(x+y)^pw
 return(list(x,y,z))
}
set.seed(99);angka_acak2(10,2)
## [[1]]
##  [1] 0.5847119 0.1137817 0.6842647 0.9925088 0.5349936 0.9666141 0.6714276
##  [8] 0.2945777 0.3583630 0.1753148
## 
## [[2]]
##  [1] 0.54881739 0.50545170 0.19383647 0.63690411 0.68780009 0.64019077
##  [7] 0.35788536 0.10258500 0.09779092 0.18288626
## 
## [[3]]
##  [1] 1.2848885 0.3834500 0.7710617 2.6549864 1.4952244 2.5818218 1.0594851
##  [8] 0.1577382 0.2080764 0.1283080
angka_acak3=function(n=10,pw=2)
{x=runif(n)
 y=runif(n)
 z=(x+y)^pw
 return(z)
}
set.seed(99);angka_acak3()
##  [1] 1.2848885 0.3834500 0.7710617 2.6549864 1.4952244 2.5818218 1.0594851
##  [8] 0.1577382 0.2080764 0.1283080
angka_acak4=function()
{x=runif(n)
 y=runif(n)
 z=(x+y)^pw
 return(z)
}
set.seed(99);
n<-5; pw<-3
angka_acak4()
## [1] 3.7334397 0.4841235 0.9378608 2.4651444 0.3583775
#menghitung median dengan fungsi instan di R
x1<-c(1,5,3,7,3,4,2,7)
x2<-c(4,3,5)
median(x1)
## [1] 3.5
median(x2)
## [1] 4
#menghitung mean dengan fungsi instan di R
mean(x1)
## [1] 4
mean(x2)
## [1] 4
#menghitung modus dengan fungsi instan di R
#Mode(x1)

Latihan 1

Buatlah suatu fungsi untuk mencari median dari suatu vektor

median<-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)
median(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!

#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)) #b.est(beta duga)=(XtX)*(XtY)
names(b.est)<-paste("b",0:(length(b.est)-1),sep="") #memberi nama b.est dengan b0, b1, b2
fitted.value<-as.vector(x%*%b.est) 
error<-as.vector(y-fitted.value) #nilai error nya
names(fitted.value)<-names(error)<-1:nrow(A)
list(beta.est=b.est,fit.val=fitted.value,error=error)
}
#data nya
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

  • Buatlah 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!
three.M <-function(vect){
   mean <-sum(vect)/length(vect)
   median <-(sort(vect)[floor((length(vect)+1)/2)]
             +sort(vect)[ceiling((length(vect)+1)/2)]) /2
   modus <- table(vect)[table(vect)==max(table(vect))]
   return(list(mean=mean,median=median,modus=modus))
}

#mean, median dan modus dari x1
x1<-c(1,5,3,7,3,4,2,7)
three.M(x1)
## $mean
## [1] 4
## 
## $median
## [1] 3.5
## 
## $modus
## vect
## 3 7 
## 2 2
#mean, median dan modus dari x
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
three.M(x)
## $mean
## [1] 4.99
## 
## $median
## [1] 5
## 
## $modus
## vect
##  5  6 
## 24 24

Object Oriented Programming (OOP)

  • Classes : “ideas” of objects
  • Methods : functions defined for specific classes

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
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)
B1
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
#membuat model linear
B2 <- lm(A5~A3) 
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)
Mobil1
## $Nama
## [1] "Toyota"
## 
## $Panjang
## [1] 3.5
## 
## $Lebar
## [1] 2
## 
## $Kecepatan
## [1] 180
class(Mobil1)
## [1] "list"
class(Mobil1) <- "mobil"
Mobil1
## $Nama
## [1] "Toyota"
## 
## $Panjang
## [1] 3.5
## 
## $Lebar
## [1] 2
## 
## $Kecepatan
## [1] 180
## 
## attr(,"class")
## [1] "mobil"
Mobil2 <- list(Nama="Suzuki", Panjang=1,Lebar=1.8, Kecepatan=150)
Mobil2
## $Nama
## [1] "Suzuki"
## 
## $Panjang
## [1] 1
## 
## $Lebar
## [1] 1.8
## 
## $Kecepatan
## [1] 150
class(Mobil2) <- "mobil"
Mobil2
## $Nama
## [1] "Suzuki"
## 
## $Panjang
## [1] 1
## 
## $Lebar
## [1] 1.8
## 
## $Kecepatan
## [1] 150
## 
## attr(,"class")
## [1] "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"
class(Mobil3)
## [1] "mobil"
#Mobil4 <- Mobil("Proton", 2, 1.8, 70)
#jika ini dijalankan hasilnya error : atribut tidak sesuai

Fungsi Aksesor

#Cara langsung (tidak direkomendasikan)
Mobil2$Nama
## [1] "Suzuki"
Mobil3$Panjang
## [1] 2.1
#Dengan fungsi aksesor
nama <- function(objek) objek$Nama
kecepatan <- function(objek) objek$Kecepatan
Panjang <- function(objek) objek$Panjang
nama(Mobil1)
## [1] "Toyota"
nama(Mobil2)
## [1] "Suzuki"
Panjang(Mobil3)
## [1] 2.1
kecepatan(Mobil3)
## [1] 120

Fungsi Generik

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=“…”))
  • Medefinisikan 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)
Car2
## An object of class "car"
## Slot "Nama":
## [1] "Suzuki"
## 
## Slot "Panjang":
## [1] 2.4
## 
## Slot "Lebar":
## [1] 1.8
## 
## Slot "Kecepatan":
## [1] 150
class(Car2)
## [1] "car"
## attr(,"package")
## [1] ".GlobalEnv"
class(Mobil1)
## [1] "mobil"

Akses terhadap Slot

  • Cara langsung (tidak direkomendasikan)
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(“method”,“class.name”, function(…){…})

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"

 

2. OPTIMASI (MATERI 7)

Latihan 1

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

yac_str("Integrate(t) (t^4)*exp^(-t)")
## [1] "(4*((3*(((-2)*((t*exp^(-t))/Ln(exp)+exp^(-t)/Ln(exp)^2))/Ln(exp)-(t^2*exp^(-t))/Ln(exp)))/Ln(exp)-(t^3*exp^(-t))/Ln(exp)))/Ln(exp)-(t^4*exp^(-t))/Ln(exp)"
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

Carilah titik minimum dari fungsi f(x) = 4x4-2x3-3x !

f3 <- function(x) 4*x^4-2*x^3-3*x
x3 <- seq(-1,1.5,by=0.1)
plot(x3,f3(x3),type="l")

optim(par=c(-0.5),fn=f3)
## Warning in optim(par = c(-0.5), fn = f3): 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

Eksplorasi

Carilah turunan pertama dan kedua dari f(x) = x^2+3x

fx <- expression(x^2+3*x)
D(fx,"x") #menggunakan D
## 2 * x + 3
D(D(fx,"x"),"x")
## [1] 2

Carilah diferensial dari f(x) = x^2 +1, untuk x=2

xturunan <- deriv(~x^2+1, "x") #menggunakan deriv, karena deriv dapat melakukan evaluasi
x<-2
eval(xturunan)
## [1] 5
## attr(,"gradient")
##      x
## [1,] 4

Carilah integral dari f(x)= x^3+5, dengan lower=0, upper=2

fs <-function(x) x^3
integrate(fs,0,2)
## 4 with absolute error < 4.4e-14

Carilah nilai minimum dari fungsi f(x)=(x-1/3)^2

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