Dosen Pembimbing : Prof. Dr. Suhartono, M.Kom

Lembaga : Universitas Islam Negeri Maulana Malik Ibrahim Malang

Jurusan : Teknik Informatika

Fakultas : Sains dan Teknologi

library(mosaic)
## Registered S3 method overwritten by 'mosaic':
##   method                           from   
##   fortify.SpatialPolygonsDataFrame ggplot2
## 
## The 'mosaic' package masks several functions from core packages in order to add 
## additional features.  The original behavior of these functions should not be affected by this.
## 
## Attaching package: 'mosaic'
## The following objects are masked from 'package:dplyr':
## 
##     count, do, tally
## The following object is masked from 'package:Matrix':
## 
##     mean
## The following object is masked from 'package:ggplot2':
## 
##     stat
## The following objects are masked from 'package:stats':
## 
##     binom.test, cor, cor.test, cov, fivenum, IQR, median, prop.test,
##     quantile, sd, t.test, var
## The following objects are masked from 'package:base':
## 
##     max, mean, min, prod, range, sample, sum
library(mosaicCalc)
## Loading required package: mosaicCore
## 
## Attaching package: 'mosaicCore'
## The following objects are masked from 'package:dplyr':
## 
##     count, tally
## Loading required package: Deriv
## Loading required package: Ryacas
## 
## Attaching package: 'Ryacas'
## The following objects are masked from 'package:Matrix':
## 
##     diag, diag<-
## The following object is masked from 'package:stats':
## 
##     integrate
## The following objects are masked from 'package:base':
## 
##     %*%, diag, diag<-, lower.tri, upper.tri
## 
## Attaching package: 'mosaicCalc'
## The following object is masked from 'package:stats':
## 
##     D

“Smoothers” dan “splines” adalah dua jenis fungsi tujuan umum yang dapat menangkap pola dalam data, tetapi tidak ada bentuk aljabar sederhana. Membuat fungsi seperti itu sangat mudah, selama Anda dapat membebaskan diri dari gagasan bahwa fungsi harus selalu memiliki rumus.

Smoother dan splines tidak ditentukan oleh bentuk dan parameter aljabar, tetapi oleh data dan algoritma. Sebagai ilustrasi, pertimbangkan beberapa data sederhana. Kumpulan data Loblollyberisi 84 pengukuran usia dan tinggi pinus loblolly.

gf_point(height ~ age, data=datasets::Loblolly)

Beberapa pinus berusia tiga tahun dengan tinggi yang sangat mirip diukur dan dilacak dari waktu ke waktu: usia lima tahun, usia sepuluh tahun, dan seterusnya. Pohon-pohon berbeda satu sama lain, tetapi semuanya sangat mirip dan menunjukkan pola sederhana: pertumbuhan linier pada awalnya yang tampaknya menurun seiring waktu.

Mungkin menarik untuk berspekulasi tentang fungsi aljabar macam apa yang diikuti oleh pertumbuhan pinus loblolly, tetapi fungsi semacam itu hanyalah sebuah model. Untuk banyak tujuan, mengukur bagaimana laju pertumbuhan berubah seiring bertambahnya usia pohon, yang dibutuhkan hanyalah fungsi mulus yang terlihat seperti data. Mari kita pertimbangkan dua:

  1. Sebuah “spline kubik”, yang mengikuti kelompok titik data dan kurva dengan mulus dan anggun.
f1 <- spliner(height ~ age, data = datasets::Loblolly)
## Warning in regularize.values(x, y, ties, missing(ties)): collapsing to unique
## 'x' values
  1. Sebuah “interpolant linier”, yang menghubungkan kelompok titik data dengan garis lurus.
f2 <- connector(height ~ age, data = datasets::Loblolly)
## Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
## collapsing to unique 'x' values

Definisi fungsi-fungsi ini mungkin tampak aneh pada awalnya — mereka sepenuhnya ditentukan oleh data: tidak ada parameter! Meskipun demikian, mereka adalah fungsi asli dan dapat bekerja dengan seperti fungsi lainnya. Misalnya, Anda dapat memasukkan input dan mendapatkan output:

f1(age = 8)
## [1] 20.68193
f2(age = 8)
## [1] 20.54729

Anda dapat membuat grafiknya:

gf_point(height ~ age, data = datasets::Loblolly) %>%
  slice_plot(f1(age) ~ age) %>%
  slice_plot(f2(age) ~ age, color="red", ) 

Anda bahkan dapat “menyelesaikan” mereka, misalnya menemukan usia di mana ketinggian akan menjadi 35 kaki:

findZeros(f1(age) - 35 ~ age, xlim=range(0,30))
##       age
## 1 12.6905
findZeros(f2(age) - 35 ~ age, xlim=range(0,30))
##    age
## 1 12.9

Dalam semua hal, ini adalah fungsi yang sangat biasa. Semua hal kecuali satu: tidak ada formula sederhana untuk mereka. Anda akan melihat ini jika Anda pernah mencoba melihat definisi fungsi dalam bahasa komputer:

f2
## function (age) 
## {
##     x <- get(fnames[2])
##     if (connect) 
##         SF(x)
##     else SF(x, deriv = deriv)
## }
## <environment: 0x00000248943fb9a0>
Cherry <- datasets::trees
gf_point(Volume ~ Girth, data = Cherry)

Cukup mudah untuk membuat spline atau konektor linier:

g1 = spliner(Volume ~ Girth, data = Cherry)
## Warning in regularize.values(x, y, ties, missing(ties)): collapsing to unique
## 'x' values
g2 = connector(Volume ~ Girth, data = Cherry)
## Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
## collapsing to unique 'x' values
slice_plot(g1(x) ~ x, domain(x = 8:18)) %>%
  slice_plot(g2(x) ~ x, color ="red") %>%
  gf_point(Volume ~ Girth, data = Cherry) %>%
  gf_labs(x = "Girth (inches)")

Kedua fungsi sama-sama mengikuti data … tapi agak terlalu setia! Masing-masing fungsi bersikeras melewati setiap titik data. Gerakan naik turun adalah fungsi yang sulit dipercaya. Untuk situasi seperti itu, di mana Anda memiliki alasan untuk percaya bahwa fungsi mulus lebih tepat daripada fungsi dengan banyak pasang surut, jenis fungsi yang berbeda sesuai: lebih halus.

g3 <- smoother(Volume ~ Girth, data = Cherry, span=1.5)
gf_point(Volume~Girth, data=Cherry) %>%
  slice_plot(g3(Girth) ~ Girth) %>%
  gf_labs(x = "Girth (inches)")

Smoother diberi nama yang baik: mereka membangun fungsi smooth yang mendekati data. Anda memiliki kendali atas seberapa mulus fungsi tersebut