Laporan Praktikum 3
Pemrograman Fungsi dan OOP
Fungsi
Membuat sekumpulan mekanisme dasar yang dijalankan secara simultan
## function( arglist )
## { expr
## return(value)
## }
## [1] 1.1351564 1.5102992 0.2956951 0.7404378 1.2740963 2.0752971 0.7932976
## [8] 3.5720576 1.0875139 0.3023186
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.6119663 0.1829483 0.3221455 0.3271070 0.4243701 0.8579906 0.8342406
## [8] 0.8831730 0.6117671 0.9221341
##
## $y
## [1] 0.48123041 0.93282109 0.06047649 0.09373245 0.91987472 0.94067988
## [7] 0.78824529 0.25653554 0.38891745 0.28512661
##
## $z
## [1] 1.1950790 1.2449414 0.1463996 0.1771058 1.8069942 3.2352156 2.6324604
## [8] 1.2989357 1.0013696 1.4574785
## [1] 0.60490554 1.81662205 0.01818308 0.71585216 0.98846658 0.02579453
## [7] 1.55806573 0.90342162 0.44493924 1.06596594
## [1] 3.6432223 2.6675496 4.0233758 0.7980623 2.5821831
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
## (Intercept) Biaya.Iklan Jumlah.Warung
## -0.21381852 0.89843390 0.01745279
## 1 2 3 4 5 6 7
## 3.094910 3.277176 2.830539 3.184754 3.988185 2.738116 2.286320
## 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) {
n <- length(vect)
# menghitung rataan
jumlah <- sum(vect)
rataan <- jumlah/n
# menghitung 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)
datax <- rbinom(100,10,0.5)
three.M(datax)## $mean
## [1] 4.99
##
## $median
## [1] 5
##
## $modus
## v f
## [1,] 6 24
## [2,] 5 24
Konsep OOP dalam R
Object- S3
## [1] "integer"
## [1] "matrix" "array"
## [1] "data.frame"
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
## [1] "lm"
## [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
##
## 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
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "xlevels" "call" "terms" "model"
## (Intercept) A3
## 10.3946172 0.9661381
Mengubah menjadi class
## [1] "list"
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)
Mobil4<- Mobil("Proton", 2, 1.8, 90)Object -S4
Membuat Object S4
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"
## [1] "mobil"
Akses terhadap slot
## [1] "Toyota"
## [1] 150
#Dengan fungsi aksesor
nama1 <- function(objek) objek@Nama
kecepatan1 <- function(objek) objek@Kecepatan
nama1(Car1)## [1] "Toyota"
## [1] 150
Optimasi
Latihan 1
## Error in get(genname, envir = envir) : object 'testthat_print' not found
##
## 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
## [1] "x^3/3+2*x^2"
## 666.6667 with absolute error < 7.6e-12
Latihan 2
## [1] "4*(3*((-2)*(t+1)*Exp(-t)-t^2*Exp(-t))-t^3*Exp(-t))-t^4*Exp(-t)"
## 24 with absolute error < 2.2e-05
## [1] 24
Latihan 3 (Optimasi satu dimensi)
## $minimum
## [1] 3.033129
##
## $objective
## [1] -1.054505
## $minimum
## [1] 5.273383
##
## $objective
## [1] -2.741405
## $maximum
## [1] 4.0598
##
## $objective
## [1] 1.096473
## $maximum
## [1] 0.3323289
##
## $objective
## [1] 1.485871
Latihan 4 (Optimasi fungsi polinomial)
## 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 linier)
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)## [1] -1.266302 2.028449
## (Intercept) x
## -1.266667 2.028571
## [1] 2.819048
## [1] 2.819048