6.2 fitModel() 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. Menemukan parameter nonlinier ini tidak dapat dilakukan secara langsung menggunakan aljabar linier, meskipun metode aljabar linier memang membantu menyederhanakan situasi.

Untungnya, gagasan bahwa jarak antar fungsi dapat diukur berfungsi dengan baik ketika ada parameter nonlinear yang terlibat. Jadi kita akan terus menggunakan “jumlah residu kuadrat” saat mengevaluasi seberapa dekat perkiraan fungsi dengan sekumpulan data.

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 SEBUAH exp(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 SEBUAH 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 di(0,5)/setengah hidup , jadiinilah tebakan yang bagus untuk k adalah di (0,5)/25000 , itu adalah

library(mosaicCalc)
kguess <- log(0.5) / 25000
kguess
## [1] -2.772589e-05

Dimulai dengan tebakan tersebut, Anda dapat menemukan nilai terbaik dari parameter linier SEBUAH dan C melalui teknik aljabar linier:

library(mosaicCalc)
project( TwoVehicles ~ 1 + exp(Income*kguess), data = Families)
##          (Intercept) exp(Income * kguess) 
##             110.4263            -101.5666

Anda dapat membuat fungsi yang merupakan kombinasi linier terbaik dengan menambahkan kedua fungsi secara eksplisit:

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:

library(mosaicCalc)
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:

library(mosaicCalc)
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

Residual adalah perbedaan antara nilai model ini dan nilai sebenarnya dari TwoVehicleskumpulan data.

Kolom residsmemberikan sisa untuk setiap baris. Tapi Anda juga bisa memikirkan residskolom sebagai vektor . Ingatlah bahwa panjang kuadrat vektor adalah jumlah residu kuadrat

6.5 Mengoptimalkan tebakan Perlu diingat bahwa jumlah residu kuadrat adalah fungsi dari k . Nilai di atas hanya untuk tebakan khusus kita $k = $ kguess. Daripada hanya menggunakan satu tebakan untuk k , Anda dapat melihat berbagai kemungkinan. Untuk melihat semuanya pada saat yang sama, mari kita gambarkan jumlah residu kuadrat sebagai fungsi dari k . Kita akan melakukan ini dengan membuat fungsi yang menghitung jumlah sisa kuadrat untuk nilai tertentu dari k .

library(mosaicCalc)
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.)