Email : sherlytaurinsiri@gmail.com
Instagram : https://www.instagram.com/sherlytaurin
RPubs : https://rpubs.com/sherlytaurin/
Github : https://github.com/sherlytaurin/
Telegram : @Sherlytaurin
Department : Business Statistics
Address : ARA Center, Matana University Tower
Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
Seperti yang sudah disebutkan sebelumnya, Model Regresi digunakan untuk mendeskripsikan hubungan antar variabel dengan menyesuaikan garis ke data yang diobservasi. Model regresi linear menggunakan garis lurus, sedangkan model regresi logistic dan nonlinear megggunakan garis lengkung. Regresi membuat kita bisa untuk mengestimasi bagaimana perubahan yang terjadi pada variabel terikat bila variabel bebas berubah.
Di bagian ini, kita akan fokus di penggunaan Regresi Linear Sederhana untuk mengestimasi hubungan antara dua variabel kuantitatif. Kita juga bisa menggunakan Regresi linear sederhana untuk mengetahui:
Example:
Asumsikan anda adalah seorang social researcher yang ingin meneliti relasi antara pendapatan dan kebahagiaan. Anda melakukan survey dari 500 orang yang incomenya berkisar antara /$15k sampai /$75k dan meminta mereka untuk mengskalakan kebahagiaan mereka dari 1 sampai 10. Variabel bebas (Pendapatan) dan Variabel terikat (kebahagiaan) keduanya bersifat kuantitatif, sehingga anda bisa melakukan analisis regresi untuk melihat apakah ada hubungan linear antara kedua hal itu.
Regresi linear sederhana mengasumsikan bahwa hubungan linear antar 2 ekspektasi kondisi dari dua variabel kuantitatif:
dimana,
Data untuk contoh kali ini ada di package PoEdata di R. Pertama-tama, install package ‘PoEdata’, ketik script ini konsol RStudio:
install.packages("devtools") # lakukan ini jika belum terinstall
library(devtools) # menjalankan library untuk mengaktifkan package
install_git("https://github.com/ccolonescu/PoEdata") # install `PoEdata`Lalu, buat dataset dengan cara seperti ini:
library(PoEdata) # jalankan package PoEdata
library(DT) # aktifkan ini untuk menggunakan fungsi datatabel
data("food", package="PoEdata")
datatable(food)dataset diatas selalu merupakan ide yang baik untuk memeriksa data secara visual dalam scatterplot yang dapat dibuat menggunakan fungsi plot(). Gambar dibawah menunjukkan scatter plot pengeluaran makanan terhadap pendapatan yang menunjukkan bahwa terdapat hubungan positif antara pendapatan dan pengeluaran makanan.
plot(food$income, food$food_exp,
ylim=c(0, max(food$food_exp)),
xlim=c(0, max(food$income)),
xlab="weekly income in $100",
ylab="weekly food expenditure in $",
type = "p")Untuk data pengeluaran makanan, model regresinya akan seperti:
\[ \begin{align} \tag{1} Y&=\beta_1+\beta_2 *X+e \\ food_{exp}&=\beta_1+\beta_2*income+e \end{align} \]
Fungsi R yang digunakan untuk mengestimasi model regresi linear adalahlm(y~x, data) dimana jika menggunakan itu tidak akan mengeluarkan hasil apa-apa. Untuk menggunakannya lebih baik memberi model itu nama seperti misalnya mod1, jadi untuk meringkas dan lalu melihat hasilnya bisa langsung menggunakan summary(mod1).
mod1 <- lm(food_exp ~ income, data = food) # model linear
smod1<- summary(mod1) # meringkas model
smod1##
## Call:
## lm(formula = food_exp ~ income, data = food)
##
## Residuals:
## Min 1Q Median 3Q Max
## -223.025 -50.816 -6.324 67.879 212.044
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 83.416 43.410 1.922 0.0622 .
## income 10.210 2.093 4.877 1.95e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 89.52 on 38 degrees of freedom
## Multiple R-squared: 0.385, Adjusted R-squared: 0.3688
## F-statistic: 23.79 on 1 and 38 DF, p-value: 1.946e-05
Misalnya kita hanya ingin melihat beberapa hasil dari regresi misalnya hanya koefisien estimasi, kita bisa melakukannya dengan menggunakan fungsi spesifik misalnya fungsi coef()
## [1] 83.416
## [1] 10.20964
Dari hasil yang ada, kita bisa menuliskan estimasi regresi linearnya seperti:
\[ \begin{align} \tag{2} \hat{Y}&=b_1+b_2*X \\ \hat{food_{exp}}&=83.416+10.20964*income \end{align} \]
Parameter intersep \(\beta_1\) biasa tidak terlalu penting di model ekonometrik. Biasanya kita lebih menggunakan parameter kemiringan (slope) \(\beta_2\). Nilai estimasi \(\beta_2\) menunjukkan bahwa pengeluaran makanan setiap keluaganya rata-rata meningkat sebesar 10.209643 saat pendapatan keluarga meningkat sebesar 1 unit tau $100. Fungsi R abline() menambahkan garis regfression ke diagram yang sebelumnya dibentuk seperti dibawah:
plot(food$income, food$food_exp,
xlab="weekly income in $100",
ylab="weekly food expenditure in $",
type = "p")
abline(b1,b2)Bagaimanakah cara untuk mengambil satu dari berbagai hasil regresi? Untuk mengambil hasil tertentu, kita bisa mencarinya dengan nama objek, diikuti dengan tanda $ dan nama dari hasil yang ingin diambil. Misalnya kitaingin mengamvil vektor koefisien dari mod1, kita dapat mengambilnya dengan mengetikkan mod1\$coefficients dan smod1\$coefficients:
## (Intercept) income
## 83.41600 10.20964
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 83.41600 43.410163 1.921578 6.218242e-02
## income 10.20964 2.093264 4.877381 1.945862e-05
Seperti yang telah kita lihat sebelumnya, beberapa hasil ini dapat diambil menggunakan fungsi tertentu seperti coef(mod1), resid(mod1), fitted(mod1), dan vcov(mod1).
Parameter estimasi regresi, \(b_1\) dan \(b_2\) membuat kita dapat memprediksi ekspektasi pengeluaran makan di berbagai tingkat pendapatan. Yang perlu kita lakukan adalah memasukkan nilai parameter yang diestimasi dan pendapatan yang diberikan kedalam persamaan seperti Persamaan 2. Misalnya nilai yang diekspektasi dari food_exp untuk pendapatan $2000 dihitung dalam Persamaan 3. (Jangan lupa membagi pendapatan dengan 100, karena data untuk pendapatan variabel ditulis dalam ratusan dollar.)
\[ \begin{align} \tag{3} \hat{food_{exp}}&=83.416+10.20964*20\\ & = $ 287.608861 \end{align} \]
Dengan R, kita dapat melakukan perhitungan ini dengan fungsi predict(). Mari kita tambahkan seikit contoh ke lebih dari satu pendapatan yang kita prediksi pengeluaran makanannya. Katakanlah pendapatan = $2000, $2500, and $2700. Fungsi predict() di R mengharuskan nilai baru dari variabel bebas diatur dalam bentuk tertentu yang disebut kerangka data. Bahkan ketika kita hanya ingin memprediksi untuk satu pendapatan, kita butuh struktur kerangka data yang sama. di R, satu set angka disatukan menggunakan struktur c(). Urutan berikut menunjukkan contoh ini.
mod1 <- lm(food_exp~income, data=food)
newx <- data.frame(income = c(20, 25, 27))
yhat <- predict(mod1, newx)
yhat # melihat hasilnya## 1 2 3
## 287.6089 338.6571 359.0764
Koefisien regresi \(b_1\) dan \(b_2\) adalah variabel acak, karena bergantung pada sampel. Dalam kasus ini, kita mengulang sampel untuk menilai koefisien regresi. Mari kita buat sejumlah subsampel acak dari data makanan dan menghitung ulang \(b_1\) dan \(b_2\) . Sebuah subsampel acak dapat dibentuk menggunakan fungsi sample(), seperti contoh dibawah ini hanya menggambarkan untuk \(b_2\).
N <- nrow(food) # mengembalikan angka observasi di dataset
C <- 50 # menentukan jumlah subsampel
S <- 38 # menentukan ukuran sampel
sumb2 <- 0
for (i in 1:C){ # untuk i didalam 1 sampai C
set.seed(3*i) # seed yang berbeda untuk setiap subsample
subsample <- food[sample(1:N, size=S, replace=TRUE), ]
mod2 <- lm(food_exp~income, data=subsample)
#menjumlahkan b2 untuk semua subsampel:
sumb2 <- sumb2 + coef(mod2)[[2]]
}
print(sumb2/C, digits = 3)## [1] 9.89
Hasilnya adalah \(b_2=9.88\) yang merupakan rata rata dari 50 estimasi \(b_2\).
Banyak aplikasi yang memerlukan perkiraan variansi dan kovariansi dari koefisien regresi. R menyimpannya dalam matriks vcov():
## [1] 1884.442
Variansi dari b1 nilainya sangat besar. Itu berarti nilai nyata (Titik-titik) dari b1 menyimpang jauh dari rata-rata (ekspektasi) b1 dalam rentang 1884.442 dimana nilai rata-ratanya sebagai pusat rentang.
## [1] 4.381752
Variansi dari b2 nilainya kecil yang berarti nilai nyata (titik-titik) dari b2 hanya sedikit menyimpang dari nilai rata-rata (ekspektasi) b2 dalam rentang 4.381752 dimana nilai rata-ratanya sebagai pusat rentang
## [1] -85.90316
Kovariansi bernilai negatif berarti variabel b1 dan b2 memiliki hubungan yang berlawanan, dimana saat salah satu variabel meningkat, variabel lainnya akan menurun.
Dengan kata lain, apabila kovariansinya positif berarti hubungannya searah atau relasinya positif.
Terkadang diagram scatter plot atau beberapa pertimbangan teoritis menunjukkan hubungan non-linier. Hubungan non-linier yang paling populer melibatkan logaritma dari variabel terikat atau bebas dan fungsi polinomial. Model kuadrat membutuhkan kuadrat dari variabel bebas.
\[
\begin{align}
\tag{4}
Y=\beta_1+\beta_2*X^2+e\\
\end{align}
\] Di R, variabel bebas yang melibatkan operator matematika dapat dimasukkan ke dalam persamaan regresi dengan fungsi I(). Contoh berikut ini menggunakan kumpulan data br dari package PoEdata, yang mencakup harga jual dan atribut 1080 rumah di Baton Rouge, LA. price adalah harga jual dalam dollar, dan kaki persegi adalah luas permukaan dalam kaki persegi (sqft).
data(br)
mod2 <- lm(price~I(sqft^2), data=br)
b1 <- coef(mod2)[[1]]
b2 <- coef(mod2)[[2]]
sqftx=c(2000, 4000, 6000) # nilai untuk sqft
pricex=b1+b2*sqftx^2 # Harga yang sesuai dengan sqft yang diberikan
DpriceDsqft <- 2*b2*sqftx # efek marjinal sqft terhadap harga
elasticity=DpriceDsqft*sqftx/pricex
b1; b2; DpriceDsqft; elasticity # memprint hasil## [1] 55776.57
## [1] 0.0154213
## [1] 61.68521 123.37041 185.05562
## [1] 1.050303 1.631251 1.817408
Sekarang kita ingin menggambar scatter plot dan melihat bagaimana fungsi kuadrat cocok dengan data. Kode berikut ini memberikan dua alternatif untuk membuat grafik seperti itu. yang pertama hanya menggambar fungsi kuadrat pada diagram scatter menggunakan fungsi R curve(); yang kedua menggunakan garis fungsi, yang memerlukan pengurutan kumpulan data dalam peningkatan nilai sqft sebelum model regresi dievaluasi, sehingga nilai yang dihasilkan juga akan keluar dalam urutan yang sama.
plot(br$sqft, br$price, xlab="Total square feet",
ylab="Sale price, $", col="grey")
#menambah kurva kuadrat di scatter plot
curve(b1+b2*x^2, col="red", add=TRUE) Cara alternatif untuk menggambar kurva yang pas:
ordat <- br[order(br$sqft), ] #mengurutkan dataset pada`sqft`
mod2 <- lm(price~I(sqft^2), data=ordat)
plot(br$sqft, br$price,
main="Dataset ordered after 'sqft' ",
xlab="Total square feet",
ylab="Sale price, $", col="grey")
lines(fitted(mod1)~ordat$sqft, col="red")Model log-linear meregresi log dari variabel dependen pada ekpresi linier dari variabel bebas (kecuali ditentukan lain, notasi log adalah singkatan dari logaritma natural, mengikuti konvensi umum di bidang ekonomii):
\[ \begin{align} \tag{5} Log(Y)=\beta_1+\beta_2*X+e\\ \end{align} \]
Salah satu alasan untuk menggunakan log untuk variabel bebas adalah agar distribusinya mendekati distribusi normal. Mari kita menggambar histogram dan log(harga) untuk membandingkannya.
Seperti sebelumnya, kita tertarik pada estimasi koefisien dan interpretasinya, pada nilai harga yang sesuai, dan pada efek marginal dari peningkatan sqft pada harga.
## (Intercept) sqft
## 1.083860e+01 4.112689e-04
Koefisiennya adalah \(b_1= 10.84\) dan \(b_2= 0.00041\), menunjukkan bahwa peningkatan luas permukaan (square feet) sebuah apartemen sebesar satu unit (1 kaki persegi) meningkatkan harga apartemen sebesar 0.041 persen. Jadi, untuk harga rumah sebesar $100.000, kenaikan 100 kaki persegi akan menaikkan harga sekitar 100*0.041 persen, yang sama dengan $4112,7. Secara umum, efek marginal dari kenaikan \(X\) pada \(Y\) dalam Persamaan 5 adalah
\[ \begin{align} \tag{6} {dy\over dx}=\beta_2 * Y \end{align} \]
dan elastisitasnya adalah
\[ \begin{align} \tag{7} e= {dy\over dx} {X\over Y}=\beta_2 * X \end{align} \]
Kode berikutnya menunjukkan cara membuat kurva nilai yang dipasang dari model loglinear dan cara menghitung efek marginal dan elastisitas harga median dalam kumpulan data. Nilai yang sesuai di sini dihitung menggunakan rumus
\[ \begin{align} \tag{8} \hat{Y}= e^{b_1+b_2*X} \end{align} \]
ordat <- br[order(br$sqft), ] #meng-order dataset
mod4 <- lm(log(price)~sqft, data=ordat)
plot(br$sqft, br$price, col="grey")
lines(exp(fitted(mod4))~ordat$sqft,
col="blue", main="Log-linear Model")
abline(lm(ordat$price~ordat$sqft), col = "black" , lwd = 2)Penjelasan:
Dari grafik dapat dilihat perbandingannya bahwa grafik logaritma (garis biru) lebih sesuai dengan data-data yang ada dibandingkan grafik regresi sederhana (garis hitam) hanya pas dengan beberapa data. Begitu data menyebar lebih luas, outliernya semakin banyak di grafik regresi sederhana. Sedangkan pada grafik logaritma, outliernya akan lebih sedikit karena bentuknya lebih mengikuti penyebaran data.
Dengan kata lain, dengan transformasi menggunakan logaritma, data yang awalnya tidak berdistribusi normal menjadi mendekati distribusi normal. Jadi kita bisa meminimalkan pelanggaran asumsi normalitas dan asumsi klasik regresi.
pricex<- median(br$price)
sqftx <- (log(pricex)-coef(mod4)[[1]])/coef(mod4)[[2]]
(DyDx <- pricex*coef(mod4)[[2]])## [1] 53.46495
## [1] 0.9366934
R memungkinkan kita untuk mengkalkulasi dengan kuantitas yang sama untuk beberapa (sqft, price) pasang disaat yang sama, seperti yang ada dibawah ini
b1 <- coef(mod4)[[1]]
b2 <- coef(mod4)[[2]]
#mengambil beberapa nilai untuk sqft:
sqftx <- c(2000, 3000, 4000)
#mengestimasi harga untuk beberapa dan menambahkan 1 lagi
pricex <- c(100000, exp(b1+b2*sqftx))
#mengkalkulasi ulang sqft untuk semua harga:
sqftx <- (log(pricex)-b1)/b2
#mengkalkulasi dan memunculkan hasil elastisitas:
(elasticities <- b2*sqftx) ## [1] 0.6743291 0.8225377 1.2338066 1.6450754
sebuah indikator atau variabel biner menandai ada atau tidaknya beberapa atribut dari unit observasi, seperti jenis kelamin atau ras jika unit observasi adalah individu, atau lokasi jika unit observasi adalah sebuah rumah. Dalam dataset utown, variabel utown adalah 1 jika rumah dekat dengan universitas dan 0 jika sebaliknya. Berikut adalah model regresi linier sederhana yang melibatkan variabel utown :
\[ \begin{align} \tag{9} price_i= \beta_1+\beta_2*utwon_i \end{align} \]
Koefisien variabel semacam itu dalam regresi linear sederhana sama dengan selisih antara harga rata-rata kedua kategori; koefisien intercept model pada Persamaan 9 sama dengan harga rata-rata rumah yang tidak dekat dengan universitas. Mari kita hitung terlebih dahulu harga rata rata untuk setiap kategori yang dilambangkan dengan kode price0bar dan price1bar:
data(utown)
price0bar <- mean(utown$price[which(utown$utown==0)])
price1bar <- mean(utown$price[which(utown$utown==1)])Hasilnya adalah: \(\bar{price}=\) 277.2416012 dekat dengan universitas. dan \(\bar{price}=\) 215.7324948 untuk yang tidak dekat. Sekarang saya menunjukkan bahwa hasil yang sama menghasilkan koefisien model regresi dalam Persamaan 9:
## [1] 215.7325
## [1] 61.50911
Hasilnya adalah: \(\bar{price}=b_1=\) 215.7324948 untuk rumah yang non-university, dan \(\bar{price}=b_1+b_2=\) 277.2416012 untuk rumah university.
Simulasi Monte Carlo menghasilkan nilai acak untuk variabel terikat ketika koefisien regresi dan distribusi istilah acak diberikan. Contoh berikut ini mengupayakan untuk menentukan distribusi variabel bebas dalam model pengeluaran makanan pada Persamaan 2,
N <- 40
x1 <- 10
x2 <- 20
b1 <- 100
b2 <- 10
mu <- 0
sig2e <- 2500
sde <- sqrt(sig2e)
yhat1 <- b1+b2*x1
yhat2 <- b1+b2*x2
curve(dnorm(x, mean=yhat1, sd=sde), 0, 500, col="blue")
curve(dnorm(x, yhat2, sde), 0,500, add=TRUE, col="red")
abline(v=yhat1, col="blue", lty=2)
abline(v=yhat2, col="red", lty=2)
legend("topright", legend=c("f(y|x=10)",
"f(y|x=20)"), lty=1,
col=c("blue", "red"))Selanjutnya kita cari variansi dari \(b_2\) dan membuat plot fungsi kepadatan yang sesuai.
\[ \begin{align} \tag{10} var(b_2)={\sigma^2 \over \sum(x_i−\bar{x})} \end{align} \]
x <- c(rep(x1, N/2), rep(x2,N/2))
xbar <- mean(x)
sumx2 <- sum((x-xbar)^2)
varb2 <- sig2e/sumx2
sdb2 <- sqrt(varb2)
leftlim <- b2-3*sdb2
rightlim <- b2+3*sdb2
curve(dnorm(x, mean=b2, sd=sdb2), leftlim, rightlim)
abline(v=b2, lty=2)Lalu, dengan nilai yang sama dari \(b_1\) , \(b_2\) , dan standar error (error standard deviation), kita dapat menghasilkan satu set nilai untuk \(Y\), regresi \(Y\) pada \(X\), dan menghitung perkiraan nilai untuk koefisien \(b_2\) dan kesalahan standarnya.
set.seed(12345)
y <- b1+b2*x+rnorm(N, mean=0, sd=sde)
mod6 <- lm(y~x)
b1hat <- coef(mod6)[[1]]
b2hat <- coef(mod6)[[2]]
mod6summary <- summary(mod6) #ringkasan yang terdapat standar error
seb2hat <- coef(mod6summary)[2,2]Hasilnya adalah \(b_2=11.64\) dan \(s_e(b_2)=1.64\). Kekuatan dari simulasi Monte CCarlo adalah kemungkinan pengulangan estimasi parameter regresi untuk sejumlah besar sampel yang dibuat secara otomatis. Jadi, kita dapat memperoleh sejumlah besar nilai untuk parameter, misalnya \(b_2\), dan kemudian menentukan karakteristik pengambilan sampelnya. Misalnya, jika mean dari nilai-nilai ini mendekati nilai yang diasumsikan semula \(b_2=10\), kita dapat menyimpulkan bahwa estimator kita (metode estimasi parameter) tidak bias,
Disini kita akan menggunakan nilai \(X\) dalam dataset makanan, dan mendapatkan \(Y\) menggunakan model linier dengan \(b_1=100\) dan \(b_2=10\).
data("food")
N <- 40
sde <- 50
x <- food$income
nrsim <- 1000
b1 <- 100
b2 <- 10
vb2 <- numeric(nrsim) #menyimpan estimasi b2
for (i in 1:nrsim){
set.seed(12345+10*i)
y <- b1+b2*x+rnorm(N, mean=0, sd=sde)
mod7 <- lm(y~x)
vb2[i] <- coef(mod7)[[2]]
}
mb2 <- mean(vb2)
seb2 <- sd(vb2)rata-rata dan standar deviasi dari estimasi 40 nilai \(b_2\) masing-masing adalah 9.974985 dan 1.152632. Gambar yang dibawah ini menggambarkan distribusi simulasi dari \(b_2\) dan versi teoritisnya.
plot(density(vb2))
curve(dnorm(x, mb2, seb2), col="red", add=TRUE)
legend("topright", legend=c("true", "simulated"),
lty=1, col=c("red", "black"))