6.3 Fungsi dengan parameter nonlinier
Teknik aljabar linier dapat digunakan untuk mencari kombinasi linier terbaik dari suatu himpunan fungsi. Namun, seringkali, ada parameter dalam fungsi yang muncul secara nonlinier. Contohnya k pada f(t)=Aexp(kt)+C dan P di Asin(2πPt)+C Menemukan parameter nonlinier ini tidak dapat dilakukan secara langsung menggunakan aljabar linier, meskipun metode aljabar linier memang membantu menyederhanakan situasi.
6.4 Fungsi eksponensial Sebagai ilustrasi, pertimbangkan “Income-Housing.csv”data yang menunjukkan hubungan eksponensial antara fraksi keluarga dengan dua mobil dan pendapatan:
library(mosaicCalc)
## Loading required package: 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
## Loading required package: mosaicCore
##
## Attaching package: 'mosaicCore'
## The following objects are masked from 'package:dplyr':
##
## count, tally
##
## Attaching package: 'mosaicCalc'
## The following object is masked from 'package:stats':
##
## D
Families <- read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
gf_point(TwoVehicles ~ Income, data = Families)
ola data menunjukkan “pembusukan” eksponensial terhadap hampir 100%
keluarga yang memiliki dua kendaraan. Bentuk matematis dari fungsi
eksponensial ini adalah Aexp(kY)+C. A dan C adalah parameter linier yang
tidak diketahui. k adalah parameter nonlinear yang tidak diketahui – ini
akan menjadi negatif untuk peluruhan eksponensial. Aljabar linier
memungkinkan kita menemukan parameter linier terbaik A dan C untuk
mencocokkan data. Tapi bagaimana menemukan k ? Misalkan Anda menebak k .
Tebakan tidak harus benar-benar acak; Anda dapat melihat dari datanya
sendiri bahwa “waktu paruh” adalah sekitar $25.000. Parameter k adalah
sesuai dengan paruh, itu ln(0.5)/half-life,jadi inilah tebakan yang
bagus untuk k adalah ln(0.5)/25000
kguess <- log(0.5) / 25000
kguess
## [1] -2.772589e-05
library(mosaic)
project( TwoVehicles ~ 1 + exp(Income*kguess), data = Families)
## (Intercept) exp(Income * kguess)
## 110.4263 -101.5666
Pastikan bahwa Anda benar-benar memahami arti dari pernyataan di atas. Itu TIDAK berarti itu TwoVehiclesjumlahnya 1+exp−Income×kguess. Sebaliknya, itu berarti Anda sedang mencari kombinasi linier dari kedua fungsi tersebut 1 dan exp−Income×kguess yang cocok TwoVehiclessedekat mungkin. Nilai yang dikembalikan oleh memberi tahu Anda akan seperti apa kombinasi ini: berapa banyak 1 dan berapa banyak exp−Income×kguess untuk menambahkan bersama-sama untuk mendekati TwoVehicles.
library(mosaicCalc)
f <- makeFun( 110.43 - 101.57*exp(Income * k) ~ Income, k = kguess)
gf_point(TwoVehicles ~ Income, data = Families) %>%
slice_plot(f(Income) ~ Income)
Grafik berjalan sangat dekat dengan titik data. Tapi Anda juga bisa
melihat nilai numerik dari fungsi untuk setiap pendapatan:
f(Income = 10000)
## [1] 33.45433
f(Income = 50000)
## [1] 85.0375
Sangat informatif untuk melihat nilai fungsi untuk Incomelevel tertentu dalam data yang digunakan untuk pemasangan, yaitu data frame Families:
Results <- Families %>%
dplyr::select(Income, TwoVehicles) %>%
mutate(model_val = f(Income = Income),
resids = TwoVehicles - model_val)
Results
## Income TwoVehicles model_val resids
## 1 3914 17.3 19.30528 -2.0052822
## 2 10817 34.3 35.17839 -0.8783904
## 3 21097 56.4 53.84097 2.5590313
## 4 34548 75.3 71.45680 3.8432013
## 5 51941 86.6 86.36790 0.2320981
## 6 72079 92.9 96.66273 -3.7627306
Sangat informatif untuk melihat nilai fungsi untuk Incomelevel tertentu dalam data yang digunakan untuk pemasangan, yaitu data frame Families:
sum(Results$resids^2)
## [1] 40.32358
Panjang persegi vektor ini residsmerupakan cara penting untuk mengukur seberapa cocok model dengan data.
6.5 Optimizing the guesses
jumlah residu kuadrat adalah fungsi dari k. Nilai di atas hanya untuk tebakan khusus kita $k = $ kguess. Daripada hanya menggunakan satu tebakan untuk k.Untuk melihat semuanya pada saat yang sama, mari kita gambarkan jumlah residu kuadrat sebagai fungsi dari k.
sum_square_resids <- Vectorize(function(k) {
sum((Families$TwoVehicles - f(Income=Families$Income, k)) ^ 2)
})
slice_plot(
sum_square_resids(k) ~ k,
domain(k = range(log(0.5)/40000,log(0.5)/20000)))
Ini adalah perintah komputer yang agak rumit, tetapi grafiknya langsung.
Anda dapat melihat bahwa nilai “terbaik” dari k , yaitu nilai dari k
yang membuat jumlah residu kuadrat sekecil mungkin, sudah dekat
k=−2.8×10−5 - tidak terlalu jauh dari tebakan awal, seperti yang
terjadi. (Itu karena waktu paruh sangat mudah diperkirakan.)