LAPORAN PRAKTIKUM 3

Andika Putri Ratnasari (G1501211018)

2021-10-27

Pemrograman Fungsi & OOP

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.4811689 0.1533448 1.4708193 0.3309536 1.5077825 0.2027109 1.0248481
##  [8] 0.3723692 0.1218648 1.0141723
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.802161776 0.282504897 0.923963299 0.365100871 0.524951121 0.340995118
##  [7] 0.204771722 0.003586155 0.751137258 0.504070954
## 
## $y
##  [1] 0.6067530 0.9074687 0.9871081 0.6374287 0.2983428 0.4678231 0.3915644
##  [8] 0.3306988 0.2187690 0.6408336
## 
## $z
##  [1] 1.9850407 1.4160372 3.6521939 1.0050656 0.6778129 0.6541869 0.3556167
##  [8] 0.1117465 0.9407182 1.3108065
angka_acak3=function(n=10,pw=2)
{x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
angka_acak3()
##  [1] 0.63828824 0.85689826 0.84188738 1.04408002 3.15285977 0.51394548
##  [7] 0.27539268 0.07686893 1.54547489 0.11030634
angka_acak4=function()
{x=runif(n)
y=runif(n)
z=(x+y)^pw
return(z)
}
n <-5; pw <-3
angka_acak4()
## [1] 2.67832609 1.72775666 0.77351857 0.06865277 1.26066512

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$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!

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

set.seed(123)
X<-rbinom(100,10,0.5)
three.M(X)
## $mean
## [1] 4.99
## 
## $median
## [1] 5
## 
## $modus
## vect
##  5  6 
## 24 24

Object Oriented Programming

  • A classdefines the behavior of objects by describing their attributes and their relationship to other classes
  • A methodisfunctions 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 inheritsbehavior from the parent.

OOP

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) #membuatmodel 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"

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 enambahkan 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)
Mobil4 <-Mobil("Proton", 2, 1.8, 70)
## Error in Mobil("Proton", 2, 1.8, 70): atribut tidak sesuai

Fungsi Aksesor

  • Cara langsung
`Mobil2$Nama`
`Mobil3$Panjang`
  • Dengan fungsi aksesor
nama <-function(objek) objek$Nama
    kecepatan <-function(objek) objek$Kecepatan
    nama(Mobil1)
## [1] "Toyota"
    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)

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"

Akses terhadap Slot

  • Cara Langsung (tidak direkomendasikan)

    Car1@Nama

`Car2@Kecepatan`
  • 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"

OPTIMASI

Latihan 1 (Integral)

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

\[ \begin{align*} \int x^2+4 \; dx\\ \end{align*} \]

Kemudian cari hasil integral tentu berikut menggunakan fungsi integrate:

\[ \begin{align*} \int_{-10}^{10} x^2+4 \; dx\\ \end{align*} \]

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 (Integral)

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

\[ \begin{align*} \int t^2 e^-t \; dt\\ \end{align*} \]

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

\[ \begin{align*} \int_{0}^{inf} t^2 e^-t \; dt\\ \end{align*} \]

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:

\[ \begin{align*} f(x)=sin(x)+sin(2x)+cos(3x)\\ \end{align*} \]

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 (Optimasi Fungsi Polinomial)

Carilah titik minimum dari fungsi:

\[ \begin{align*} f(x)=4x^4-2x^3-3x\\ \end{align*} \]

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

print.data.frame(data5)
##   x  y
## 1 1  1
## 2 2  3
## 3 3  5
## 4 4  6
## 5 5  8
## 6 6 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