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