Menyesuaikan fungsi ke data
Seringkali, Anda memiliki ide tentang bentuk fungsi untuk sebuah model dan Anda perlu memilih parameter yang akan membuat fungsi model cocok untuk observasi. Proses pemilihan parameter untuk mencocokkan pengamatan disebut model fitting .
Sebagai ilustrasi, data dalam file “utilities.csv” mencatat suhu rata-rata setiap bulan (dalam derajat F) serta penggunaan gas alam bulanan (dalam kaki kubik, ccf). Ada, seperti yang Anda duga, hubungan yang kuat antara keduanya.
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
Utils <- read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
gf_point(ccf ~ temp, data = Utils) %>%
gf_labs(y = "Natural gas usage (ccf/month)",
x = "Average outdoor temperature (F)")
Banyak jenis fungsi yang berbeda dapat digunakan untuk mewakili data
ini. Salah satu yang paling sederhana dan paling umum digunakan dalam
pemodelan adalah fungsi garis lurus f ( x ) = SEBUAH x + B . Dalam
fungsi f ( x ) , variabel x singkatan dari input, sedangkan A dan B
adalah parameter. Penting untuk diingat apa nama input dan output saat
menyesuaikan model dengan data – Anda perlu mengatur agar namanya cocok
dengan data yang sesuai.
Dengan data utilitas, masukannya adalah suhu, suhu. Keluaran yang akan dimodelkan adalah ccf. Untuk menyesuaikan fungsi model dengan data, tuliskan rumus dengan nama input, parameter, dan output yang sesuai di tempat yang tepat:
f <- fitModel(ccf ~ A * temp + B, data = Utils)
f
## function (temp, ..., transformation = function (x)
## x)
## return(transformation(predict(model, newdata = data.frame(temp = temp),
## ...)))
## <environment: 0x000001882ebb99c0>
## attr(,"coefficients")
## A B
## -3.464251 253.098208
## attr(,"class")
## [1] "nlsfunction" "function"
Keluaran dari fitModel()adalah fungsi dengan bentuk matematika yang sama seperti yang Anda tentukan di argumen pertama (di sini, ccf ~ A * temp + B) dengan nilai numerik spesifik yang diberikan ke parameter untuk membuat fungsi paling cocok dengan data. Bagaimana cara fitModel()mengetahui besaran mana dalam bentuk matematika yang merupakan variabel dan mana yang merupakan parameter? Apa pun yang terkandung dalam data yang digunakan untuk pemasangan adalah variabel (di sini temp); hal-hal lain (di sini, Adan B) adalah parameter.
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(f(temp) ~ temp)
Anda dapat menambahkan fungsi lain ke dalam campuran dengan mudah.
Misalnya, Anda mungkin berpikir itu sqrt(temp)berhasil di sana.
Cobalah!
f2 <- fitModel(
ccf ~ A * temp + B + C *sqrt(temp),
data = Utils)
gf_point(
ccf ~ temp, data = Utils) %>%
slice_plot(f2(temp) ~ temp)
Hondas <- read.csv("http://www.mosaic-web.org/go/datasets/used-hondas.csv")
head(Hondas)
## Price Year Mileage Location Color Age
## 1 20746 2006 18394 St.Paul Grey 1
## 2 19787 2007 8 St.Paul Black 0
## 3 17987 2005 39998 St.Paul Grey 2
## 4 17588 2004 35882 St.Paul Black 3
## 5 16987 2004 25306 St.Paul Grey 3
## 6 16987 2005 33399 St.Paul Black 2
carPrice1 <- fitModel(
Price ~ A + B * Age + C * Mileage, data = Hondas
)
Anda dapat memplot fungsi yang sesuai:
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age=2:8, miles=range(0, 60000)))
carPrice2 <- fitModel(
Price ~ A + B * Age + C * Mileage + D * Age * Mileage,
data = Hondas)
Sekali lagi, setelah fungsi dipasang ke data, Anda dapat memplotnya dengan cara biasa:
contour_plot(
carPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
Bentuk konturnya sedikit berbeda dengan di carPrice1(); mereka sedikit
menonjol ke atas. menafsirkan kontur seperti itu membutuhkan sedikit
latihan. Lihatlah wilayah kecil di salah satu kontur. Kemiringan kontur
memberi tahu Anda trade-offantara jarak tempuh dan usia. Untuk
melihatnya, lihat kontur $17.000 yang melewati usia = 6 tahun dan jarak
tempuh = 10.000 mil. Sekarang lihat kontur $ 17.000 dengan jarak tempuh
nol. Dalam bergerak sepanjang kontur, harga tetap konstan. (Begitulah
kontur didefinisikan: titik di mana harganya sama, dalam hal ini
$17.000.) Menurunkan jarak tempuh sejauh 10.000 mil diseimbangkan dengan
menambah usia kurang dari satu tahun. (Kontur $17.000 memiliki titik nol
jarak tempuh dan 6,8 tahun.) Cara lain untuk mengatakan ini adalah bahwa
efek peningkatan usia 0,8 tahun sama dengan penurunan jarak tempuh
10.000 mil .
Sekarang lihat kontur $17.000 yang sama pada usia nol (yaitu, di ujung kiri grafik). Penurunan jarak tempuh sebesar 10.000 peningkatansesuai dengan usia 1,6 tahun. Dengan kata lain, menurut model, untuk mobil yang lebih baru kepentingan relatif antara jarak tempuh vs. usia lebih rendah daripada mobil yang lebih tua. Untuk mobil berusia nol, 10.000 mil bernilai 1,6 tahun, tetapi untuk mobil berusia enam tahun, 10.000 mil hanya bernilai 0,8 tahun.
Interaksi yang ditambahkan inilah priceFun2()yang menghasilkan pengaruh yang berbeda terhadap harga jarak tempuh untuk mobil yang berbeda umur.
Operator fitModel()membuatnya sangat mudah untuk menemukan parameter dalam model apa pun yang membuat model mendekati data paling dekat. Pekerjaan dalam pemodelan adalah memilih bentuk model yang tepat (Istilah interaksi atau tidak? Apakah akan memasukkan variabel baru atau tidak?) dan menginterpretasikan hasilnya. Di bagian selanjutnya, kita akan melihat beberapa pilihan berbeda dalam bentuk model (linier vs. nonlinier) dan beberapa logika matematis di balik pemasangan.
6.0.1 Latihan Teks bagian ini menjelaskan model carPrice1()dengan Umur dan Jarak Tempuh sebagai jumlah masukan dan harga (dalam USD) sebagai keluaran. Klaim dibuat bahwa harga dapat dilihat sebagai fungsi dari Agedan Mileage. Mari kita buat grafik itu lagi.
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
Apa yang dikatakan kontur vertikal tentang harga sebagai fungsi dari
Agedan Mileage?
Harga sangat tergantung pada kedua variabel. Harga tergantung Agetapi tidak Mileage. Harga tergantung Mileagetapi tidak Age. Harga tidak banyak bergantung pada salah satu variabel. JAWABAN: Setiap kontur sesuai dengan harga yang berbeda. Saat Anda melacak secara horizontal dengan Age, Anda berpindah dari satu kontur ke kontur lainnya. Namun saat Anda melacak secara vertikal dengan Mileage, Anda tidak melewati kontur. Artinya harga tidak bergantung pada Mileage, karena perubahan Mileagetidak menyebabkan perubahan harga. Tapi harga tidak berubah dengan Age.
Grafik fungsi yang sama yang ditampilkan di badan teks memiliki kontur yang miring ke bawah dari kiri ke kanan. Apa yang dikatakan tentang harga sebagai fungsi dari Agedan Mileage?
Harga sangat tergantung pada kedua variabel. Harga tergantung Agetapi tidak Mileage. Harga tergantung Mileagetapi tidak Age. Harga tidak banyak bergantung pada salah satu variabel. JAWABAN: Saat Anda menjiplak secara horizontal, dengan Age, Anda berpindah dari kontur ke kontur: harga berubah. Jadi harga tergantung Age. Hal yang sama berlaku ketika Anda menjiplak secara vertikal, dengan Mileage. Jadi harga juga tergantung Mileage.
Fungsi yang sama digambarkan baik di badan teks maupun di latihan ini. Tapi grafiknya sangat berbeda! Jelaskan mengapa ada perbedaan dan sebutkan grafik mana yang benar. JAWABAN: Perhatikan tanda centang pada sumbu. Dalam grafik di badan teks, Ageberjalan dari dua hingga delapan tahun. Namun dalam grafik latihan, Agehanya berjalan dari nol hingga satu tahun. Demikian pula, grafik di badan teks Mileageberjalan dari 0 hingga 60.000 mil, tetapi dalam grafik latihan, Mileageberjalan dari 0 hingga 1.
Kedua grafik menunjukkan fungsi yang sama, jadi keduanya “benar”. Tapi grafik latihan itu menyesatkan secara visual. Tidak mengherankan jika harga tidak banyak berubah dari 0 mil menjadi 1 mil, tetapi harganya (agak) berubah dari 0 tahun menjadi 1 tahun.
Moral di sini: Perhatikan baik-baik sumbu dan rentang yang ditampilkannya. Saat Anda menggambar grafik, pastikan Anda mengatur rentang ke sesuatu yang relevan dengan masalah yang dihadapi.
6.0.1.2 Latihan 2 Ekonom biasanya berpikir tentang harga dalam logaritma mereka. Keuntungan dari melakukan ini adalah bahwa tidak masalah dalam mata uang apa harganya; kenaikan 1 harga log adalah proporsi yang sama terlepas dari harga atau mata uangnya.
logPrice2 <- fitModel(
logPrice ~ A + B * Age + C * Mileage + D * Age * Mileage,
data = Hondas %>% mutate(logPrice = log10(Price)))
Model ini didefinisikan untuk memasukkan interaksi antara usia dan jarak tempuh. Tentu saja, mungkin saja parameternya Dmendekati nol. Itu berarti bahwa data tidak memberikan bukti interaksi apa pun.
Sesuaikan model dan lihat kontur harga kayu gelondongan. Apa yang dikatakan bentuk kontur kepada Anda tentang apakah data memberikan bukti interaksi dalam harga log?
MENJAWAB:
contour_plot(
logPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
6.0.1.3 Latihan 3: Tetap dekat dengan data Menyesuaikan fungsi dengan
data bukanlah keajaiban. Sejauh data membatasi bentuk model yang masuk
akal, model tersebut akan cocok dengan data. Tetapi untuk input yang
tidak ada datanya (misalnya mobil berusia 0 tahun dengan jarak tempuh
60.000 mil), sebuah model dapat melakukan hal-hal gila. Ini terutama
terjadi jika modelnya rumit, katakanlah termasuk kekuatan variabel,
seperti yang satu ini:
carPrice3 <- fitModel(
Price ~ A + B * Age + C * Mileage + D * Age * Mileage +
E * Age^2 + F * Mileage^2 + G * Age^2 * Mileage +
H * Age * Mileage^2,
data = Hondas)
gf_point(Mileage ~ Age, data = Hondas, fill = NA) %>%
contour_plot(
carPrice3(Age=Age, Mileage=Mileage) ~ Age + Mileage)
Untuk mobil di bawah 3 tahun atau lebih tua dengan jarak tempuh sangat
tinggi atau sangat rendah, konturnya melakukan beberapa hal gila! Akal
sehat mengatakan bahwa jarak tempuh yang lebih tinggi atau usia yang
lebih besar menghasilkan harga yang lebih tinggi. Dalam hal kontur, akal
sehat diterjemahkan menjadi kontur yang memiliki kemiringan negatif.
Tetapi kemiringan kontur ini seringkali positif.
Ini membantu untuk mempertimbangkan apakah ada wilayah di mana hanya ada sedikit data. Sebagai aturan, model rumit seperti carPrice3()tidak dapat diandalkan untuk input di mana ada sedikit atau tidak ada data.
Fokus hanya pada wilayah plot di mana terdapat banyak data. Apakah kontur memiliki bentuk yang diharapkan oleh akal sehat?
JAWABAN: Di mana ada banyak data, bentuk lokal kontur memang miring ke bawah dari kiri ke kanan, seperti yang diantisipasi oleh akal sehat.
6.1 Kurva dan model linier Sepintas, istilah “linier” dan “kurva” mungkin tampak kontradiktif. Garis lurus, kurva tidak.
Kata linier dalam “model linier” mengacu pada “kombinasi linier”, bukan “garis lurus”. Seperti yang akan Anda lihat, Anda dapat membuat kurva rumit dengan mengambil kombinasi fungsi linier, dan menggunakan operasi proyeksi aljabar linier untuk mencocokkan kurva ini sedekat mungkin dengan data. Proses pencocokan itu disebut “pas”.
Sebagai ilustrasi, data dalam file “utilities.csv”merekam suhu rata-rata setiap bulan (dalam derajat F) serta penggunaan gas alam bulanan (dalam kaki kubik, ccf). Ada, seperti yang Anda duga, hubungan yang kuat antara keduanya.
Utilities = read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
gf_point(ccf ~ temp, data = Utilities)
Banyak jenis fungsi yang berbeda dapat digunakan untuk mewakili data
ini. Salah satu yang paling sederhana dan paling umum digunakan dalam
pemodelan adalah fungsi garis lurus. Dalam hal aljabar linier, ini
adalah kombinasi linier dari fungsi f 1 ( T ) = 1 dan f 2 ( T ) = T .
Secara konvensional, tentu saja, fungsi garis lurus ditulis f ( T ) = b
+ m T . (Mungkin Anda lebih suka menulisnya seperti ini: f ( x ) = m x +
b . Hal yang sama.) Notasi konvensional ini hanyalah penamaan skalar
sebagai m dan b yang akan berpartisipasi dalam kombinasi linier. Untuk
menemukan skalar numerik yang paling cocok dengan data — untuk
“menyesuaikan fungsi” dengan data — dapat dilakukan dengan operator
aljabar linier project( ).
project(ccf ~ temp + 1, data = Utilities)
## (Intercept) temp
## 253.098208 -3.464251
Operator project( )memberikan nilai skalar. Fungsi pemasangan terbaik itu sendiri dibangun dengan menggunakan nilai skalar ini untuk menggabungkan fungsi yang terlibat.
model_fun = makeFun( 253.098 - 3.464*temp ~ temp)
gf_point(ccf ~ temp, data=Utils) %>%
slice_plot(model_fun(temp) ~ temp)
project(ccf ~ temp + sqrt(temp) + 1, data = Utils)
## (Intercept) temp sqrt(temp)
## 447.029273 1.377666 -63.208025
mod2 <- makeFun(447.03 + 1.378*temp - 63.21*sqrt(temp) ~ temp)
gf_point(ccf ~ temp, data=Utils) %>% # the data
slice_plot(mod2(temp) ~ temp) %>%
gf_labs(x = "Temperature (F)",
y = "Natural gas used (ccf)")
Setelah Anda menyelesaikan proyeksi dan menemukan koefisien, Anda dapat
membuat fungsi matematika yang sesuai dengan menggunakan koefisien dalam
ekspresi matematika untuk membuat fungsi. Seperti semua fungsi, nama
yang Anda gunakan untuk argumen adalah masalah pilihan pribadi, meskipun
masuk akal untuk menggunakan nama yang mengingatkan Anda tentang apa
yang diwakili oleh fungsi tersebut.
Pilihan vektor apa yang akan digunakan dalam proyeksi ada di tangan Anda: bagian dari seni pemodel.
Sepanjang ilmu alam dan sosial, teknik yang sangat penting dan banyak digunakan adalah menggunakan banyak variabel dalam sebuah proyeksi. Sebagai ilustrasi, lihat data “used-hondas.csv”harga mobil Honda bekas.
Hondas = read.csv("http://www.mosaic-web.org/go/datasets/used-hondas.csv")
head(Hondas)
## Price Year Mileage Location Color Age
## 1 20746 2006 18394 St.Paul Grey 1
## 2 19787 2007 8 St.Paul Black 0
## 3 17987 2005 39998 St.Paul Grey 2
## 4 17588 2004 35882 St.Paul Black 3
## 5 16987 2004 25306 St.Paul Grey 3
## 6 16987 2005 33399 St.Paul Black 2
Seperti yang Anda lihat, kumpulan data menyertakan variabel Price, Age, dan Mileage. Tampaknya masuk akal untuk berpikir bahwa harga akan bergantung pada jarak tempuh dan usia mobil. Inilah model yang sangat sederhana yang menggunakan kedua variabel:
project(Price ~ Age + Mileage + 1, data = Hondas)
## (Intercept) Age Mileage
## 2.133049e+04 -5.382931e+02 -7.668922e-02
Anda dapat memplotnya sebagai fungsi matematika:
car_price <- makeFun(21330-5.383e2*age-7.669e-2*miles ~ age & miles)
contour_plot(car_price(age, miles) ~ age + miles,
domain(age=range(2, 8), miles=range(0, 60000))) %>%
gf_labs(title = "Miles per gallon")
Model yang agak lebih canggih mungkin menyertakan apa yang disebut
“interaksi” antara usia dan jarak tempuh, menyadari bahwa pengaruh usia
mungkin berbeda tergantung pada jarak tempuh
project(Price ~ Age + Mileage + Age*Mileage + 1, data = Hondas)
## (Intercept) Age Mileage Age:Mileage
## 2.213744e+04 -7.494928e+02 -9.413962e-02 3.450033e-03
car_price2 <- makeFun(22137 - 7.495e2*age - 9.414e-2*miles +
3.450e-3*age*miles ~ age & miles)
contour_plot(
car_price2(Age, Mileage) ~ Age + Mileage,
domain(Age = range(0, 10), Mileage = range(0, 100000))) %>%
gf_labs(title = "Price of car (USD)")
6.1.1 Latihan 6.1.1.1 Latihan 1: Pemasangan Polinomial Sebagian besar
mahasiswa mengambil kursus aljabar yang mencakup banyak tentang
polinomial, dan polinomial sangat sering digunakan dalam pemodelan.
(Mungkin, mereka digunakan lebih sering daripada yang seharusnya. Dan
guru aljabar mungkin kecewa mendengar bahwa model polinomial yang paling
penting adalah model orde rendah, misalnya, f ( x , y ) = sebuah + b x +
c y + d x y daripada menjadi kubik atau kuartik, dll.) Menyesuaikan
polinomial dengan data adalah masalah aljabar linier: menyusun vektor
yang sesuai untuk mewakili berbagai kekuatan. Misalnya, inilah cara
menyesuaikan model kuadrat dengan variabel ccfversus tempdalam
“utilities.csv”file data:
Utilities = read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
project(ccf ~ 1 + temp + I(temp^2), data = Utilities)
## (Intercept) temp I(temp^2)
## 317.58743630 -6.85301947 0.03609138
ccfQuad <- makeFun(317.587 - 6.853*T + 0.0361*T^2 ~ T)
gf_point(ccf ~ temp, data = Utilities) %>%
slice_plot(ccfQuad(temp) ~ temp)
ccfQuad(T=72)
## [1] 11.3134
Sesuaikan polinomial orde-3 versus dengan data utilitas. Berapa nilai model ini untuk suhu 32 derajat? {87.103.128, 142 .143.168.184} MENJAWAB:
project(ccf ~ 1 + temp + I(temp^2) + I(temp^3), data = Utils)
## (Intercept) temp I(temp^2) I(temp^3)
## 2.550709e+02 -1.427408e+00 -9.643482e-02 9.609511e-04
ccfCubic <-
makeFun(2.551e2 - 1.427*T -
9.643e-2*T^2 + 9.6095e-4*T^3 ~ T)
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(ccfCubic(temp) ~ temp)
ccfCubic(32)
## [1] 142.1801
Sesuaikan polinomial urutan ke-4 ccfversus tempdengan data utilitas. Berapa nilai model ini untuk suhu 32 derajat? {87.103.128.140, 143 .168.184} MENJAWAB:
project(ccf ~ 1 + temp + I(temp^2) + I(temp^3) + I(temp^4),
data = Utils)
## (Intercept) temp I(temp^2) I(temp^3) I(temp^4)
## 1.757579e+02 8.225746e+00 -4.815403e-01 7.102673e-03 -3.384490e-05
ccfQuad <- makeFun(1.7576e2 + 8.225*T -4.815e-1*T^2 +
7.103e-3*T^3 - 3.384e-5*T^4 ~ T)
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(ccfQuad(temp) ~ temp) %>%
gf_labs(y = "Natural gas use (ccf)", x = "Temperature (F)")
ccfQuad(32)
## [1] 143.1713
Buat plot perbedaan antara model orde ke-3 dan ke-4 pada rentang suhu dari 20 hingga 60 derajat. Apa perbedaan terbesar (dalam nilai absolut) antara keluaran kedua model?
Sekitar 1 ccf. Sekitar 4 ccf. Sekitar 8 ccf. Sekitar 1 derajat F. Sekitar 4 derajat F. Sekitar 8 derajat F. JAWABAN: Keluaran model dalam satuan ccf.
slice_plot(ccfQuad(temp) - ccfCubic(temp) ~ temp,
domain(temp = range(20, 60)))
6.1.1.2 Latihan 2: Regresi Berganda Pada tahun 1980, majalah Consumer
Reports mempelajari mobil model 1978-79 untuk mengeksplorasi bagaimana
berbagai faktor mempengaruhi penghematan bahan bakar. Pengukuran
tersebut mencakup efisiensi bahan bakar dalam mil per galon, bobot
trotoar dalam pound, tenaga mesin dalam tenaga kuda, dan jumlah
silinder. Variabel ini disertakan dalam file “cardata.csv”.
Cars = read.csv("http://www.mosaic-web.org/go/datasets/cardata.csv")
head(Cars)
## mpg pounds horsepower cylinders tons constant
## 1 16.9 3967.60 155 8 2.0 1
## 2 15.5 3689.14 142 8 1.8 1
## 3 19.2 3280.55 125 8 1.6 1
## 4 18.5 3585.40 150 8 1.8 1
## 5 30.0 1961.05 68 4 1.0 1
## 6 27.5 2329.60 95 4 1.2 1
Gunakan data ini agar sesuai dengan model penghematan bahan bakar berikut (variabel mpg): = x 0 + x 1 .
Berapa nilai model untuk input 2000 pound? {14.9,19.4,21.1,25.0, 28.8 ,33.9,35.2} MENJAWAB:
project(mpg ~ pounds + 1, data = Cars)
## (Intercept) pounds
## 43.188646127 -0.007200773
43.1886 - 0.00720*2000
## [1] 28.7886
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 termasuk k di f ( t ) = SEBUAH exp ( k t ) + C dan P di SEBUAH dosa ( 2 π P t ) + C . 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
Families <- read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
gf_point(TwoVehicles ~ Income, data = Families)
6.5 Mengoptimalkan tebakan
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)))