Menyesuaikan Fungsi ke data seringkali kitta memiliki gagasan mengenai bentuk dari sebuah model.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).
Utils <- read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
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
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)")
Untuk mewakili sebuah data dapat digunakan yang namanya fungsi. Fungsi
paling umum yang digunakan adalah fungsi garis luru f(x) = ax + b. Dalam
hal ini, x merupakan input, sedangkan A dan B adalah parameternya. Dari
data utilitas, salah satu masukkannya berupa suhu dan akan dikeluarkan
dalam bentuk ccf. Tuliskan rumus dengan nama input, parameter, dan
output untuk menyesuaikan fungsi model dengan data.
library(mosaic)
f <- fitModel(ccf ~ A * temp + B, data = Utils)
Keluaran dari fitmodel dapat berupa fungsi dengan bentuk matematika yang sama dengan yang ditentukan di argumen pertama dengan nilai numerik spesifik yang diberikan parameter untuk membuat fungsi yang cocok dengan data. Segala sesuatu yang terkandung dalam data yang digunakan sebagai pemasangan adalah variabel. Dan A serta B merupakan parameter.
Kita juga akan menampilkan eror yang ada dalam data dengan Utils\(eror <- (Utils\)ccf-Utils$fitmodel). Perlu diingat, nilai dari Utils diambil dari http://www.mosaic-web.org/go/datasets/utilities.csv. Untuk menampilkannya kita dapat memanggilnya dengan menuliskan nama variabelnya. Dan kita akan menampilkan bentuk grafiknya.
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
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(f(temp) ~ temp)
anda dapat menambahkan fungsi lain ke dalam campuran dengan mudah.
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(f(temp) ~ temp)
contoh ini hanya menggunakan satu variabel input. 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
carPrice1 <- fitModel(
Price ~ A + B * Age + C * Mileage, data = Hondas
)
anda dapat mengplot fungsi
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age=2:8, miles=range(0, 60000)))
Model yang agak lebih canggih mungkin mencakup apa yang disebut
interaksi antara usia dan jarak tempuh, dengan menyadari bahwa pengaruh
usia mungkin berbeda bergantung pada jarak tempuh.
carPrice2 <- fitModel(
Price ~ A + B * Age + C * Mileage + D * Age * Mileage,
data = Hondas)
setelah data biasa anda dapat mengplot fungsi sebgai berikut
contour_plot(
carPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
latihan 1
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
Pada grafik di atas, konturnya vertikal.
Apa yang dikatakan kontur vertikal tentang harga sebagai fungsi dari Agedan Mileage?
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.
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)))
contour_plot(
logPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
library(mosaic)
Latihan 3: Tetap dekat dengan data
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)
Kurva dan model linier Kata linier dalam “model linier” mengacu pada
“kombinasi linier”, bukan “garis lurus”. 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)
project(Price ~ Age + Mileage + 1, data = Hondas)
## (Intercept) Age Mileage
## 2.133049e+04 -5.382931e+02 -7.668922e-02
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")
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)")
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 latihan
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)
Untuk mencari nilai model ini pada temperatur tertentu, evaluasi saja
fungsinya. (Dan perhatikan bahwa ccfQuad( )didefinisikan dengan variabel
input T.)
ccfQuad(T=72)
## [1] 11.3134
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
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)")
latihan 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): menjawab
project(mpg ~ pounds + 1, data = Cars)
## (Intercept) pounds
## 43.188646127 -0.007200773
43.1886 - 0.00720*2000
## [1] 28.7886
mod_fun <- makeFun(46.933 - 0.00290*lbs - 0.1449*hp ~ lbs + hp)
mod_fun(lbs = 2000, hp = 50)
## [1] 33.888
latihan 3 : Intesep Plot polinomial yang Anda temukan pada rentang suhu dari -10 hingga 50 derajat, dan plot data mentah di atasnya. Ada sesuatu yang sangat aneh tentang model yang akan Anda dapatkan. Apa itu?
1.Komputer menolak untuk melaksanakan instruksi ini. 2.Semua model menunjukkan keluaran konstan sebesar ccf. 3.Semua model memiliki ccfnol ketika tempnol. 4.Semua modelnya persis sama!
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. 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:
Families <- read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
gf_point(TwoVehicles ~ Income, data = Families)
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, jadi inilah tebakan yang bagus untuk k adalah di(0,5)/25000, itu adalah
kguess <- log(0.5) / 25000
kguess
## [1] -2.772589e-05
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 − Penghasilan x tebak. Sebaliknya, itu berarti Anda sedang mencari kombinasi linier dari kedua fungsi tersebut 1 dan exp−Penghasilan × tebak yang cocok TwoVehiclessedekat mungkin. Nilai yang dikembalikan oleh memberi tahu Anda akan seperti apa kombinasi ini: berapa banyak 1 dan berapa banyak exp − Penghasilan × tebak untuk menambahkan bersama-sama untuk mendekati TwoVehicles. Anda dapat membuat fungsi yang merupakan kombinasi linier terbaik dengan menambahkan kedua fungsi secara eksplisit:
f <- makeFun( 110.43 - 101.57*exp(Income * k) ~ Income, k = kguess)
gf_point(TwoVehicles ~ Income, data = Families) %>%
slice_plot(f(Income) ~ Income)
jika ingin melihat nilai numerik dari fungsi untuk setiap
pendapatannya
f(Income = 10000)
## [1] 33.45433
f(Income = 50000)
## [1] 85.0375
Sangat informatif untuk melihat nilai fungsi untuk Incomelevel
tertentu dalam -
rt7890-+-*-43234567890-ang 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
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
sum(Results$resids^2)
## [1] 40.32358
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)))
Latihan 1
Families = read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
Families <- Families %>%
mutate(tens = Income / 10000)
library(mosaicCalc)
water = read.csv("http://www.mosaic-web.org/go/datasets/stan-data.csv")
water$minutes = water$time/60
Latihan 2
library(mosaicCalc)
Hawaii = read.csv("http://www.mosaic-web.org/go/datasets/hawaii.csv")
Hawaii$quarterdays = Hawaii$time/6