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

Bab 6 Menyesuaikan fungsi ke data 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.

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 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)

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

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)

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:

carPrice1 <- fitModel(
  Price ~ A + B * Age + C * Mileage, data = Hondas
)
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)
contour_plot(
  carPrice2(Age=age, Mileage=miles) ~ age + miles,
  domain(age = range(0, 8), miles = range(0, 60000)))

6.0.1 Latihan 6.0.1.1 Latihan 1 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)))

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.

Pertimbangkan model sebagai fungsi dari mil dan usia. catatan10harga

logPrice2 <- fitModel(
  logPrice ~ A + B * Age + C * Mileage + D * Age * Mileage,
  data = Hondas %>% mutate(logPrice = log10(Price)))

Sesuaikan model dan lihat kontur harga kayu gelondongan. Apa yang dikatakan bentuk kontur kepada Anda tentang apakah data memberikan bukti interaksi dalam harga log?

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 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)

6.1 Kurva dan model linier 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(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)")

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
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")

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

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

Koefisien memberi tahu kita bahwa model kuadrat yang paling pas dari ccfversus tempadalah:

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

a.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

1.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

1.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? a.Sekitar 1 ccf. b.Sekitar 4 ccf. c.Sekitar 8 ccf. d.Sekitar 1 derajat F. e.Sekitar 4 derajat F. f.Sekitar 8 derajat F. JAWABAN: Keluaran model dalam satuan ccf. ## R Markdown

slice_plot(ccfQuad(temp) - ccfCubic(temp) ~ temp, 
           domain(temp = range(20, 60)))

6.1.1.2 Latihan 2: Regresi Berganda

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

1.Gunakan data ini agar sesuai dengan model penghematan bahan bakar berikut (variabel mpg): Berapa nilai model untuk input 2000 pound? {14.9,19.4,21.1,25.0, 28.8 ,33.9,35.2}

project(mpg ~ pounds + 1, data = Cars)
##  (Intercept)       pounds 
## 43.188646127 -0.007200773
project(mpg ~ pounds + horsepower  + 1, data = Cars)
##  (Intercept)       pounds   horsepower 
## 46.932738241 -0.002902265 -0.144930546
mod_fun <- makeFun(46.933 - 0.00290*lbs - 0.1449*hp ~ lbs + hp)
mod_fun(lbs = 2000, hp = 50)
## [1] 33.888

6.1.1.3 Latihan 3: Intersep 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. Contohnya termasuk di dan di . 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:

Families <- read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
gf_point(TwoVehicles ~ Income, data = Families)

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

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:

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

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

sum(Results$resids^2)
## [1] 40.32358

6.5 Mengoptimalkan tebakan Untuk melihat semuanya pada saat yang sama, mari kita gambarkan jumlah residu kuadrat sebagai fungsi dari .

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)))

6.5.1 Latihan Untuk mengaturnya agar berfungsi pada data ini, berikan perintah berikut, yang bisa Anda potong dan tempel dari sini:

library(mosaicCalc)
Families = read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
Families <- Families %>%
  mutate(tens = Income / 10000)

6.5.1.1 Latihan 1 Stan Wagon terhadap suhu secangkir air panas pendingin. Waktu diukur dalam detik, yang sangat tidak nyaman untuk penggeser, jadi terjemahkan ke menit. Kemudian temukan nilai terbaik dari dalam model eksponensial. k

water = read.csv("http://www.mosaic-web.org/go/datasets/stan-data.csv")
water$minutes = water$time/60

6.5.1.2 Latihan 2 Kumpulan “hawaii.csv”data berisi catatan tingkat pasang surut air laut di Hawaii selama beberapa hari. Variabelnya timedalam jam, yang sangat masuk akal, tetapi Anda akan mengubah skalanya menjadi “seperempat hari” sehingga penggeser akan memberikan hasil yang lebih baik.

Hawaii = read.csv("http://www.mosaic-web.org/go/datasets/hawaii.csv")
Hawaii$quarterdays = Hawaii$time/6

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.