= cbind(c(1,2,3))
X X
[,1]
[1,] 1
[2,] 2
[3,] 3
Notlar Wooldridge Cilt 2 - Bölüm 13’den alınmıştır (Fonksiyon Dışında)
Geçen hafta dersimizde kendimiz için bir regresyon fonksiyonu yazacağımızdan bahsetmiştik. Bu fonksiyonu yazmak için regresyon katsayılarını oluşturacağımız formülü tekrar hatırlamamız gerekli.
Geçen sene yapılan derslerinizden,
\[ \beta_1 = \frac{\sum (x- \bar{x}) \cdot (y- \bar{y})}{\sum(x- \bar{x})^2} \]
olduğunu biliyoruz. Aslında bulmamız gereken, pay için
\[ \sum (x- \bar{x}) \cdot (y- \bar{y}) = \sum x \cdot y - \sum x \cdot \bar{y} - \sum \bar{x} \cdot y + \sum \bar{x} \cdot \bar{y} \]
\[ = \sum x \cdot y - \bar{y} \cdot \sum x - \bar{x} \cdot \sum y + N \cdot \bar{x} \cdot \bar{y} \]
Ayrıca ortalamanın, gözlem sayısıyla çarpımının toplamın kendisini verdiğini bildiğimizden
\[ \bar{y} \cdot \sum x = \bar{x} \cdot \sum y = N \cdot \bar{x} \cdot \bar{y} \]
olduğunu çıkarabiliriz.
\[ \sum x \cdot y - \bar{y} \cdot \sum x - \bar{x} \cdot \sum y + N \cdot \bar{x} \cdot \bar{y} = \sum x \cdot y - N \cdot \bar{x} \cdot \bar{y} \]
olur. Eğer çoklu regresyon için bir fonksiyon yazacaksam, her gözlemi birbiriyle çarpıp toplayabileceğim kısa bir formül geliştirmem gerek. Hatırlayacağınız üzere matrisler bize bu konuda yardımcı olabilir.
Varsayılım ki elimizde 3’er gözlemli iki değişken var.
= cbind(c(1,2,3))
X X
[,1]
[1,] 1
[2,] 2
[3,] 3
= cbind(c(4,5,6))
Y Y
[,1]
[1,] 4
[2,] 5
[3,] 6
\(\sum X \cdot Y = 4 + 10 + 18 = 32\) olacaktır.
Bu sonucu matrislerler ile almanın kolay yolu \(X^T \cdot Y\) bulmak olacaktır.
t(X) %*% Y
[,1]
[1,] 32
Bu sayıyı \(X^2\)’lerin toplamına bölmek istersem, solve fonksiyonunu kullanarak \((X^T \cdot X)^{-1} \cdot X^T \cdot Y\) olarak yazabilirim.
solve(t(X) %*% X)%*%t(X) %*% Y
[,1]
[1,] 2.285714
Bu yazdığımız son fonksiyon aslında regreyon katsayıları için formülümüzdür.
\((X^T \cdot X)^{-1} \cdot X^T \cdot Y\)
İstediğiniz bir isim verebilirsiniz. Girdilerimiz X ve Y olacaktır. X çoklu regresyon yaplırken matris olarak sunulmalıdır.
<- function(X, Y)
Dogrusal_reg solve(t(X) %*% X)%*%t(X) %*% Y
Şimdi fonksiyonumuz hazır. İlk denememizi oluşturduğumuz X ve Y serileri için kullanalım.
Dogrusal_reg(X=X, Y=Y)
[,1]
[1,] 2.285714
Fonksiyon çalışıyor.
Bu fonksiyonu birde herhangi bir veri seti üzerinden deneyelim. Geçen hafta yapmış olduğumuz, bwght verisetini kullanarak cigs ve faminc kullanarak regresyon sonuçlarını tekrarlayalım.
library(wooldridge)
data("bwght")
Fonksiyonumuzu kullanmak için, X verisetimizi oluşturmamız gerek, çünkü X bizim için sadece iki değişkenden oluşuyor. Ama adına X demek zorunda değilsiniz, Xler ismini verebiliriz.
= cbind(bwght$cigs, bwght$faminc)
Xler head(Xler)
[,1] [,2]
[1,] 0 13.5
[2,] 0 7.5
[3,] 0 0.5
[4,] 0 15.5
[5,] 0 27.5
[6,] 0 7.5
Ama X veri seti sadece X değişkenlerinden oluşmaz. Kesen diye adlandırdığımız bir katsayımız daha var. Yani iki değil, üç katsayı bulacağız bu yüzden Xler veri setimize birlerden oluşan bir sütun daha eklememiz gerek.
= cbind(bwght$cigs, bwght$faminc, c(rep(1, nrow(bwght))))
Xler head(Xler)
[,1] [,2] [,3]
[1,] 0 13.5 1
[2,] 0 7.5 1
[3,] 0 0.5 1
[4,] 0 15.5 1
[5,] 0 27.5 1
[6,] 0 7.5 1
Şimdi Xler matrisimiz tamamlandı.
Y matrisini de oluşturalım.
= cbind(bwght$bwght)
Y head(Y)
[,1]
[1,] 109
[2,] 133
[3,] 129
[4,] 126
[5,] 134
[6,] 118
Artık yeni fonksiyonumuzu kullanabiliriz.
Dogrusal_reg(X=Xler, Y=Y)
[,1]
[1,] -0.46340754
[2,] 0.09276474
[3,] 116.97413048
Karşılaştırabileceğimiz gibi sonuçlar aynı.
lm(bwght$bwght ~ bwght$cigs + bwght$faminc)
Call:
lm(formula = bwght$bwght ~ bwght$cigs + bwght$faminc)
Coefficients:
(Intercept) bwght$cigs bwght$faminc
116.97413 -0.46341 0.09276
Ama lm fonksiyonunun özetini (summary) çıkarınca, katsayılarımızın anlamlılık düzeylerinide gözlemleyebiliyorduk.
summary(lm(bwght$bwght ~ bwght$cigs + bwght$faminc))
Call:
lm(formula = bwght$bwght ~ bwght$cigs + bwght$faminc)
Residuals:
Min 1Q Median 3Q Max
-96.061 -11.543 0.638 13.126 150.083
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 116.97413 1.04898 111.512 < 2e-16 ***
bwght$cigs -0.46341 0.09158 -5.060 4.75e-07 ***
bwght$faminc 0.09276 0.02919 3.178 0.00151 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 20.06 on 1385 degrees of freedom
Multiple R-squared: 0.0298, Adjusted R-squared: 0.0284
F-statistic: 21.27 on 2 and 1385 DF, p-value: 7.942e-10
Fonksiyonumuz bu konuda yetersiz. Fonskiyonu istediğiniz kadar geliştirebilirsiniz.
İstersek standart hatalar için yeni bir fonksiyon oluşturabiliriz. Regresyonun standart hatalar formülünü hatırlayın.
<- function(X, Y)
Dogrusal_reg_se sqrt(as.numeric(var(Y - X%*%solve(t(X) %*% X)%*%t(X) %*% Y))*solve(t(X) %*% X))
Dogrusal_reg_se(X=Xler, Y=Y)
Warning in sqrt(as.numeric(var(Y - X %*% solve(t(X) %*% X) %*% t(X) %*% : NaNs
produced
[,1] [,2] [,3]
[1,] 0.09151077 0.02149117 NaN
[2,] 0.02149117 0.02916682 NaN
[3,] NaN NaN 1.048228
Bu formül bize varyans kovaryans matrisi dediğimiz bir matris verdi. Aslında standart hatalar için bu matrisin diyagonal elemetlerini almam yeterli. Eğer ikisini birden göstereceğim yeni bir fonksiyon yazarsam daha pratik bir fonksiyon elde edebilirim. Hatta varyansı bulmak için var komutunu bile kullanmak zorunda değiliz. Onun içinde ayrı bir fonksiyon oluşturmak yerine, varyansı bulabileceğimiz fonsksiyonu, kendi fonksiyonumuz içine yazabiliriz.
<- function(X, Y) {
dr <- solve(t(X) %*% X)%*%t(X) %*% Y
A <- diag(sqrt(as.numeric(t(Y-as.numeric(t(Y)%*%rep(1, nrow(Y))/nrow(Y)))%*%(Y-as.numeric(t(Y)%*%rep(1, nrow(Y))/nrow(Y)))/(nrow(Y)-1))*solve(t(X) %*% X)))
B <- list(t(A), B)
result names(result) <- c("katsayılar", "Standart Hatalar")
suppressMessages(return(result))
}
Yeni fonksiyonumuzu test edelim.
dr(X=Xler, Y=Y)
Warning in sqrt(as.numeric(t(Y - as.numeric(t(Y) %*% rep(1, nrow(Y))/nrow(Y)))
%*% : NaNs produced
$katsayılar
[,1] [,2] [,3]
[1,] -0.4634075 0.09276474 116.9741
$`Standart Hatalar`
[1] 0.09290577 0.02961144 1.06420678
Artık standart hatalarını da gözlemleyebileceğim bir regresyon fonksiyonum var.
Fonksiyona t ve pr değerlerini ekleyelim.
<- function(X, Y) {
dr <- solve(t(X) %*% X)%*%t(X) %*% Y
A <- diag(sqrt(as.numeric(t(Y-as.numeric(t(Y)%*%rep(1, nrow(Y))/nrow(Y)))%*%(Y-as.numeric(t(Y)%*%rep(1, nrow(Y))/nrow(Y)))/(nrow(Y)-1))*solve(t(X) %*% X)))
B <- t(A)/B
C <- 1-pt(abs(C), nrow(X) - ncol(X) - 1)
D <- list(t(A), B, C, D)
result names(result) <- c("katsayılar", "Standart Hatalar", "t değerleri", "pr (-t < & > t)")
suppressMessages(return(result))
}
dr(X=Xler, Y=Y)
Warning in sqrt(as.numeric(t(Y - as.numeric(t(Y) %*% rep(1, nrow(Y))/nrow(Y)))
%*% : NaNs produced
$katsayılar
[,1] [,2] [,3]
[1,] -0.4634075 0.09276474 116.9741
$`Standart Hatalar`
[1] 0.09290577 0.02961144 1.06420678
$`t değerleri`
[,1] [,2] [,3]
[1,] -4.987931 3.132733 109.9167
$`pr (-t < & > t)`
[,1] [,2] [,3]
[1,] 3.437984e-07 0.000884092 0
Sander (1992) tarafından kullanılana benzeyen fertil1
veri seti, Milli Düşünce Araştırma Merkezi’nin Genel Sosyal Araştırması’nın 1972’den 1984’e kadar çift sayılı yıllardından oluşmuştur.
Wooldridge, bu verileri, bir kadının doğurduğu toplam çocuk sayısını (kids) açıklamak için kullanıyor.
Soru: Gözlemlenebilen faktörleri kontrol ettikten sonra zaman içinde doğurganlık nasıl değişmiştir?
Kontrol altında tutulan değişkenler: eğitim görülen yıl sayısı, yaş, ırk, 16 yaşında ülkenin hangi bölgesinde yaşadığı ve 16 yaşındaki yaşam çevresidir.
Her zaman yaptığımız gibi önce veri setini indirelim, daha sonra veriyi tablo halinde gösterelim
library(wooldridge) # data komutuyla fertil1 verisetini indirmek içim
library(rmarkdown) # page_table komutuyla veri setini rmarkdown üzerinde gösterebilmek için
data("fertil1")
paged_table(fertil1)
kids
değişkeninin ortalama olarak nasıl değiştiğini gösterebiliriz. (Bunu merak ettiğiniz diğer değişkenler için de yapın.)require(dplyr)
Loading required package: dplyr
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
%>%
fertil1 group_by(year) %>%
summarise("ortalama çocuk sayısı (kids)" = mean(kids))
# A tibble: 7 × 2
year `ortalama çocuk sayısı (kids)`
<int> <dbl>
1 72 3.03
2 74 3.21
3 76 2.80
4 78 2.80
5 80 2.82
6 82 2.40
7 84 2.24
Ortalama çocuk sayısı beklediğimiz gibi düşüyor gibi görünüyor.
Bir sonraki aşamaya geçmeden önce yazdığımız kodları analamaya çalışalım.
require
komutu, library komutu yerine kullanacağınız bir komuttur. Eğer kullandığınız paketi, daha önce yükleyip yüklemediğinizi hatırlamıyorsanız, require
parentez içine yazılan paketi eğer yüklenmemişse önce yükler daha sonra library
yapar.
dplyr paketi, verilerimizi düzenlemek ve temizlemek için sıklıkla kullanacağımız paketlerden biridir. %>%
operatörü sayesinde sırasıyla işlem yapabiliriz.
%>%
kullanarak cümle yazar gibi komut yazabilirsiniz. Yukarda bulunan chunk’da da görebileceğiniz gibi önce fertil1 veri setini yazdık, %>%
yazdıktan sonra bu veri setini senelere (year) göre gruplandırdık. Bunun için group_by
komutunu kullandık.
üçüncü satırda senelere göre gruplandırdığımız fertil1 veri setinde kids
değişkeninin ortalamasını aldıkç Bunu yapmak için mean
komutunu kullandık.
Sonuçlarımızı göstermek için, summarise
komutunu kullandık ve ortalamalara ne isim vermek istiyorsak tırnak içinde onu yazdık. (“ortalama çocuk sayısı (kids)”)
Biraz pratik yaptıktan sonra, bu ortalamaları çıkarmak sizin içinde basit hale gelecek.
diyelim ki bütün değişkenlerin yıllara göre ortalamasını görmek istiyorsunuz. across(everything()
bu işlemi sizin için kolaylıkla yapacaktır.
require(dplyr)
%>%
fertil1 group_by(year) %>%
summarise(across(everything(), mean))
# A tibble: 7 × 27
year educ meduc feduc age kids black east northcen west farm
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 72 12.2 8.33 8.90 44.9 3.03 0.0833 0.333 0.231 0.128 0.173
2 74 12.3 8.94 9.29 44.1 3.21 0.0578 0.237 0.353 0.110 0.208
3 76 12.2 8.25 8.99 43.5 2.80 0.0461 0.263 0.316 0.0855 0.237
4 78 12.6 9.07 9.80 43.4 2.80 0.0490 0.273 0.329 0.105 0.203
5 80 12.9 9.40 9.95 43.7 2.82 0.0704 0.141 0.394 0.155 0.218
6 82 13.2 9.56 10.2 43.2 2.40 0.199 0.231 0.290 0.0806 0.167
7 84 13.3 10.2 10.7 41.8 2.24 0.0678 0.260 0.333 0.102 0.192
# … with 16 more variables: othrural <dbl>, town <dbl>, smcity <dbl>,
# y74 <dbl>, y76 <dbl>, y78 <dbl>, y80 <dbl>, y82 <dbl>, y84 <dbl>,
# agesq <dbl>, y74educ <dbl>, y76educ <dbl>, y78educ <dbl>, y80educ <dbl>,
# y82educ <dbl>, y84educ <dbl>
sd
komutunu kullanabilirsiniz. Not: console’a help("summarise")
yazarsanız, başka neleri bulabileceğiniz hakkında bilgi sahibi olabilirsiniz. R-studio’yu kullandıkça deneyimiziniz artacaktır.require(dplyr)
%>%
fertil1 group_by(year) %>%
summarise("ortalama çocuk sayısı (kids)" = mean(kids), "stadandart sapma çocuk sayısı (kids)" = sd(kids) )
# A tibble: 7 × 3
year `ortalama çocuk sayısı (kids)` `stadandart sapma çocuk sayısı (kids)`
<int> <dbl> <dbl>
1 72 3.03 1.83
2 74 3.21 1.50
3 76 2.80 1.66
4 78 2.80 1.58
5 80 2.82 1.58
6 82 2.40 1.70
7 84 2.24 1.51
Biz Örnek 13.1’e geri dönelim. Kadın doğurganlığının belirleyicileri ile ilgili regresyonu yapalım.
Panel verilerle ilgili başka bir paket kullanarak regresyon analizini gerçekleştireceğiz. Ama bu ilk bir kaç örnek için bildiğimiz lm
fonksiyonunu kullanacağız.
summary(lm(kids ~ educ + age + I(age^2) + black + east + northcen + west + farm + othrural + town + smcity + y74 + y76 + y78 + y80 + y82 + y84, data = fertil1))
Call:
lm(formula = kids ~ educ + age + I(age^2) + black + east + northcen +
west + farm + othrural + town + smcity + y74 + y76 + y78 +
y80 + y82 + y84, data = fertil1)
Residuals:
Min 1Q Median 3Q Max
-3.9878 -1.0086 -0.0767 0.9331 4.6548
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -7.742457 3.051767 -2.537 0.011315 *
educ -0.128427 0.018349 -6.999 4.44e-12 ***
age 0.532135 0.138386 3.845 0.000127 ***
I(age^2) -0.005804 0.001564 -3.710 0.000217 ***
black 1.075658 0.173536 6.198 8.02e-10 ***
east 0.217324 0.132788 1.637 0.101992
northcen 0.363114 0.120897 3.004 0.002729 **
west 0.197603 0.166913 1.184 0.236719
farm -0.052557 0.147190 -0.357 0.721105
othrural -0.162854 0.175442 -0.928 0.353481
town 0.084353 0.124531 0.677 0.498314
smcity 0.211879 0.160296 1.322 0.186507
y74 0.268183 0.172716 1.553 0.120771
y76 -0.097379 0.179046 -0.544 0.586633
y78 -0.068666 0.181684 -0.378 0.705544
y80 -0.071305 0.182771 -0.390 0.696511
y82 -0.522484 0.172436 -3.030 0.002502 **
y84 -0.545166 0.174516 -3.124 0.001831 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.555 on 1111 degrees of freedom
Multiple R-squared: 0.1295, Adjusted R-squared: 0.1162
F-statistic: 9.723 on 17 and 1111 DF, p-value: < 2.2e-16
\[ log(wage) = \beta_0 + \delta_0 y85 + \beta_1 educ + \delta_1 y85 \cdot educ + \beta_2 exper + \beta_3 exper^2 + \beta_4 union + \beta_5 female + \delta_2 y85 \cdot female + u \]
Birçok değişkenin açıklamasını nasıl bulacağınızı artık biliyor olmalısınız. console’a yazacağınız help()
fonksiyonu sayesinde veri setinin açıklamalarına uşaşabiliyorsunuz.
union, kişi bir sendikaya üyeyse bir diğer durumlarda sıfıra eşit olan bir kukla değişkendir.
y85, gözlem 1985 yılına aitse bire, 1978’e aitse sıfıra eşit olan bir kukla değişkendir.
Veriye göz atalım, cps78_85 verisetini kullanıyoruz.
data("cps78_85")
paged_table(cps78_85)
dplyr
paketinin komutlarını kullanarak bulabilirim. Paketi bir kere library() yaptığım için tekrar yapmama gerek yok.%>%
cps78_85 group_by(year) %>%
summarise(n = n())
# A tibble: 2 × 2
year n
<int> <int>
1 78 550
2 85 534
78 yılı için 550 kişi, 85 yılı için 534 kişilik farklı grup vardır.
Yazdığımız modelin sonuçlarına bakalım.
summary(lm(lwage ~ y85*(educ + female) + exper + I(exper^2) + union, data = cps78_85))
Call:
lm(formula = lwage ~ y85 * (educ + female) + exper + I(exper^2) +
union, data = cps78_85)
Residuals:
Min 1Q Median 3Q Max
-2.56098 -0.25828 0.00864 0.26571 2.11669
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.589e-01 9.345e-02 4.911 1.05e-06 ***
y85 1.178e-01 1.238e-01 0.952 0.3415
educ 7.472e-02 6.676e-03 11.192 < 2e-16 ***
female -3.167e-01 3.662e-02 -8.648 < 2e-16 ***
exper 2.958e-02 3.567e-03 8.293 3.27e-16 ***
I(exper^2) -3.994e-04 7.754e-05 -5.151 3.08e-07 ***
union 2.021e-01 3.029e-02 6.672 4.03e-11 ***
y85:educ 1.846e-02 9.354e-03 1.974 0.0487 *
y85:female 8.505e-02 5.131e-02 1.658 0.0977 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.4127 on 1075 degrees of freedom
Multiple R-squared: 0.4262, Adjusted R-squared: 0.4219
F-statistic: 99.8 on 8 and 1075 DF, p-value: < 2.2e-16
\[ log(wage) = 0.459 + 0.118 y85 + 0.0747 educ + 0.0185 y85 \cdot educ + 0.0296 exper - 0.0004 exper^2 + 0.202 union - 0.317 female + 0.085 y85 \cdot female + u \]
Regresyon sonuçlarını yorumlayalım.
1978 için kesim parametresi \(\beta_0\)’dır. (0.459)
1985 için kesim parametresi \(\beta_0 + \delta_0\)’dır. (0.459 + 0.118 = 0.577) olur.
1978 için eğitimin getirisi \(\beta_1\)’dir. (0.0747)
1985 için eğitimin getirisi \(\beta_1 + \delta_1\)’dir. (0.0747 + 0.0185 = 0.0932)
Burada \(\delta_1 = 0.0185\) yedi yıllık dönemde ekstra bir yıllık eğitimin getirisinin nasıl değiştiğini ölçmektedir.
1978 yılında kadınlar ve erkekler arasındaki maaş farkı \(\beta_5\)’dir. (-0.317)
1978 yılında kadınlar ve erkekler arasındaki maaş farkı \(\beta_5 + \delta_2\)’dir. (-0.317 + 0.085 = -0.232)
Cinsiyet farkına yedi yıllık dönemde bir iyileşme olup olmadığı hipotezini (H0: \(\delta_2 = 0\)) test edebiliriz. Örneğimizde bu katsayı için t değeri 1.658’dir ve anlamlı değildir. H0 hipotezini reddedemeyiz. Bu katsayı bizim için 0’dan farksızdır, dolayısıyla 7 yıl içinde kadın maaşlarında bir gelişme olmamıştır.
Modelde deneyim (exper) ve sendika (union) 85 yılıyla çarpılmamış. Bu iki zaman döneminde de bu değişkenlerin maaşlar üzerindeki etkisinin farksız olduğunun varsayılması sonucunda yapılmıştır.
Sayfa 448’de nominal ücretlerin, reel ücretlere çevrilmesinin neden bu çalışma için gerekli olmadığı anlatılmıştır. Lütfen bu sayfayı okuyun ve anlamaya çalışın. Bu durumun bilgisayar alıştırmalarında sorulduğu söylenmiş. Gerekirse bilgisayar alıştırması B13.2 de bu durumu doğrulayın.
Bu katsayıların nasıl yorumlanacağından daha önce bahsetmiştik. Örneğin, 1978 yılında eğitimin getirisi yaklaşık %7.5 olduğu tahmin edilmiştir. 1985 yılında eğitimin getirisi yaklaşık 1.85 yüzdelik puan artarak %9.35’e çıkmıştır. Bu katsayı t istatistiğine (1.97) göre %5 seviyesinde istatistiksel olarak anlamlıdır.
1978’de, diğer herşey sabitken bir kadın, bir erkekten yaklaşık %31.7 daha az kazanmıştır. 1985’te ücretlerdeki fark yaklaşık 8.5 yüzdelik puan azalmıştır.
Havuzlanmış yatay kesitler politika etkisini değerlendirmek için kullanılabilir.
Olaydan önce olan ve olaydan sonra veriler toplanarak etki anlaşılmaya çalışılır.
Kiel ve McClain (1995), yeni bir çöp yakma fırınının North Andover, Massachusetts’teki ev fiyatları üzerindeki etkisini araştırmış.
North Andover’de bir fırın yapılacağı dedikodusu 1978’de başlamış.
İnşaat 1981’de başlamış.
Fırının inşaat başladıktan kısa bir süre sonra çalışmaya başlayacağı beklenilsede, fırın 1985’de kullanılmaya başlanmış.
Örnek 1978’de satılan evlerin fiyatları ve 1981’de satılan evler için başka bir örnek kullanıyor.
Hipotez, fırının yakınındaki evlerin fiyatlarının daha uzaktaki evlerin fiyatlarına göre düşeceğidir.
Yakınlık, uzaklık tanımı olarak fırının etrafındaki üç millik alan fırına yakın olarak tanımlanmış. (Her evin fırına gerçek uzaklığı da kullanılabilir.)
Her ev fiyatı reel değerler üzerinden ölçülmektedir. Boston ev fiyatları endeksi kullanılarak, 1978 doları cinsinden ölçülmüştür.
rprice gerçek (reel) fiyatlarla ev fiyatını ifade etmektedir.
İlk olarak sadece 1981 verilerini kullanarak aşağıdaki model tahmin edilmiş.
\[ rprice = \gamma_0 + \gamma_1 nearinc \]
-nearinc, ev fırına yakınsa bir, uzaksa sıfır değeri alan kukla değişkendir.
data("kielmc")
paged_table(kielmc)
1981 yılı için basit regresyonu gösterin, modeli model_81 olarak adlandırın.
Önce veri setini 1981 yılı için filtreleyelim ve yeni verisetine kielmc81 diyelim.
<- kielmc %>% filter(year==1981) kielmc81
<- lm(kielmc81$rprice ~ kielmc81$nearinc)
model_81 summary(model_81)
Call:
lm(formula = kielmc81$rprice ~ kielmc81$nearinc)
Residuals:
Min 1Q Median 3Q Max
-60678 -19832 -2997 21139 136754
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 101308 3093 32.754 < 2e-16 ***
kielmc81$nearinc -30688 5828 -5.266 5.14e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 31240 on 140 degrees of freedom
Multiple R-squared: 0.1653, Adjusted R-squared: 0.1594
F-statistic: 27.73 on 1 and 140 DF, p-value: 5.139e-07
\[ \hat{rprice} = 101,308 - 30,688 nearinc \]
kesim parametresi 101,308 fırından uzak evlerin ortalama fiyatı, nearinc katsayısı ise fırına yakın evlerin bu ortalama fiyattan ne kadar az olduğudur.
Aynı regresyonu 1978 için yapmak istersek, sadece 1978 değerlerinin olduğu yeni bir veri seti yaratabiliriz.
<- kielmc %>% filter(year==1978) kielmc78
<- lm(kielmc78$rprice ~ kielmc78$nearinc)
model_78 summary(model_78)
Call:
lm(formula = kielmc78$rprice ~ kielmc78$nearinc)
Residuals:
Min 1Q Median 3Q Max
-56517 -16605 -3193 8683 236307
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 82517 2654 31.094 < 2e-16 ***
kielmc78$nearinc -18824 4745 -3.968 0.000105 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 29430 on 177 degrees of freedom
Multiple R-squared: 0.08167, Adjusted R-squared: 0.07648
F-statistic: 15.74 on 1 and 177 DF, p-value: 0.0001054
\[ \hat{rprice} = 82,517 - 18,824 nearinc \]
Burdan fırının zaten ev fiyatları düşük olan bir bölgeye yapıldığı anlaşılabilir.
Yeni fırının ev fiyatlarını azaltıp azaltmadığını, iki regresyonun \(\gamma_1\) katsayıları arasındaki farkı alarak anlabiliriz.
Bu bize yeni bir katsayı verir. Kitabınızdaki gibi bu yeni katsayıya \(\hat{\delta_1}\) diyelim.
\[ \hat{\delta_1} = \gamma_1^{1981} - \gamma_1^{1978} \]
\[ \hat{\delta_1} = 30,688 - (-18,824) = -11,863 \]
olur.
\(\hat{\delta_1}\), farkların farklarının tahmincisi olarak bilinir. (difference in differences - DD)
Çünkü \(\hat{\delta_1}\) formülü şu şekilde de yazılabilir.
\[ \hat{\delta_1} = (\bar{rprice}_{nr}^{1981} - \bar{rprice}_{fr}^{1981}) - (\bar{rprice}_{nr}^{1978} - \bar{rprice}_{fr}^{1978}) \]
nr, fırına yakın; fr, fırına uzak anlamındadır. Biliyoruz ki \(\gamma_1\) zaten bu ikisi arasındaki farkı veriyordu.
Ancak iki farklı regreyon yapmanın kötü yanı, \(\hat{\delta_1}\)’in sıfırdan farklı olduğunu test etmek için bir t istatistiğimizin olmamasıdır.
Bu iki regresyonu tek bir regresyon üzerinden yapmak daha anlamlı olacaktır.
<- lm(kielmc$rprice ~ kielmc$nearinc*kielmc$y81)
model_78_81 summary(model_78_81)
Call:
lm(formula = kielmc$rprice ~ kielmc$nearinc * kielmc$y81)
Residuals:
Min 1Q Median 3Q Max
-60678 -17693 -3031 12483 236307
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 82517 2727 30.260 < 2e-16 ***
kielmc$nearinc -18824 4875 -3.861 0.000137 ***
kielmc$y81 18790 4050 4.640 5.12e-06 ***
kielmc$nearinc:kielmc$y81 -11864 7457 -1.591 0.112595
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 30240 on 317 degrees of freedom
Multiple R-squared: 0.1739, Adjusted R-squared: 0.1661
F-statistic: 22.25 on 3 and 317 DF, p-value: 4.224e-13
\[ rprice = \beta_0 + \delta_0 y81 + \beta_1 nearinc + \delta_1 y81 \cdot nearinc \]
Yani yaptığımız regresyon bize direk \(\delta_1\) sonucunu vermektedir.
Bu üç modeli bir tabloda bir arada gösterelim. Farklı regresyon tablolarını birarada göstermek için stargazer
paketini kullanıyorduk.
library(stargazer)
Please cite as:
Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
stargazer(list(model_78,model_81,model_78_81), type = "text")
===========================================================================================
Dependent variable:
-----------------------------------------------------------------------
rprice rprice rprice
(1) (2) (3)
-------------------------------------------------------------------------------------------
nearinc -18,824.370***
(4,744.594)
nearinc -30,688.270***
(5,827.709)
nearinc -18,824.370***
(4,875.322)
y81 18,790.290***
(4,050.065)
y81 -11,863.900
(7,456.646)
Constant 82,517.230*** 101,307.500*** 82,517.230***
(2,653.790) (3,093.027) (2,726.910)
-------------------------------------------------------------------------------------------
Observations 179 142 321
R2 0.082 0.165 0.174
Adjusted R2 0.076 0.159 0.166
Residual Std. Error 29,431.960 (df = 177) 31,238.040 (df = 140) 30,242.900 (df = 317)
F Statistic 15.741*** (df = 1; 177) 27.730*** (df = 1; 140) 22.251*** (df = 3; 317)
===========================================================================================
Note: *p<0.1; **p<0.05; ***p<0.01
Tablo 13.2 son regresyon modelimize ek olarak iki regresyon sonucu daha göstermektedir.
Bu iki farklı regresyon modelinin neden gösterildiği sayfa 452’de anlatılmıştır. Neden tablo 13.2 oluşturulmuş okuyun lütfen.
Bu tablonun birinci sütünunu model_78_81’de zaten kaydettik.
İkinci sütun için, evlerin yaşını (age) kontrol altında tutuyoruz.
Üçüncü sütun için, kontrol değişkenlerine eyaletler arası kara yoluna uzaklık (intst), feet olarak arsa alanı (land), feet olarak ev alanı (area), oda sayısı (rooms) ve banyo sayısı (baths) de ekleniyor.
İkinci sütün regresyonu
<- lm(rprice ~ nearinc*y81 + age + I(age^2), data = kielmc )
model_78_81_sutun_2 summary(model_78_81_sutun_2)
Call:
lm(formula = rprice ~ nearinc * y81 + age + I(age^2), data = kielmc)
Residuals:
Min 1Q Median 3Q Max
-79349 -14431 -1711 10069 201486
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.912e+04 2.406e+03 37.039 < 2e-16 ***
nearinc 9.398e+03 4.812e+03 1.953 0.051713 .
y81 2.132e+04 3.444e+03 6.191 1.86e-09 ***
age -1.494e+03 1.319e+02 -11.333 < 2e-16 ***
I(age^2) 8.691e+00 8.481e-01 10.248 < 2e-16 ***
nearinc:y81 -2.192e+04 6.360e+03 -3.447 0.000644 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 25540 on 315 degrees of freedom
Multiple R-squared: 0.4144, Adjusted R-squared: 0.4052
F-statistic: 44.59 on 5 and 315 DF, p-value: < 2.2e-16
<- lm(rprice ~ nearinc*y81 + age + I(age^2) + intst + land + area + rooms + baths, data = kielmc )
model_78_81_sutun_3 summary(model_78_81_sutun_3)
Call:
lm(formula = rprice ~ nearinc * y81 + age + I(age^2) + intst +
land + area + rooms + baths, data = kielmc)
Residuals:
Min 1Q Median 3Q Max
-76721 -8885 -252 8433 136649
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.381e+04 1.117e+04 1.237 0.21720
nearinc 3.780e+03 4.453e+03 0.849 0.39661
y81 1.393e+04 2.799e+03 4.977 1.07e-06 ***
age -7.395e+02 1.311e+02 -5.639 3.85e-08 ***
I(age^2) 3.453e+00 8.128e-01 4.248 2.86e-05 ***
intst -5.386e-01 1.963e-01 -2.743 0.00643 **
land 1.414e-01 3.108e-02 4.551 7.69e-06 ***
area 1.809e+01 2.306e+00 7.843 7.16e-14 ***
rooms 3.304e+03 1.661e+03 1.989 0.04758 *
baths 6.977e+03 2.581e+03 2.703 0.00725 **
nearinc:y81 -1.418e+04 4.987e+03 -2.843 0.00477 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 19620 on 310 degrees of freedom
Multiple R-squared: 0.66, Adjusted R-squared: 0.6491
F-statistic: 60.19 on 10 and 310 DF, p-value: < 2.2e-16
stargazer(list(model_78_81, model_78_81_sutun_2, model_78_81_sutun_3), type = "text")
============================================================================================
Dependent variable:
------------------------------------------------------------------------
rprice rprice
(1) (2) (3)
--------------------------------------------------------------------------------------------
nearinc -18,824.370***
(4,875.322)
y81 18,790.290***
(4,050.065)
y81 -11,863.900
(7,456.646)
nearinc 9,397.936* 3,780.337
(4,812.222) (4,453.415)
y81 21,321.040*** 13,928.480***
(3,443.631) (2,798.747)
age -1,494.424*** -739.451***
(131.860) (131.127)
I(age2) 8.691*** 3.453***
(0.848) (0.813)
intst -0.539***
(0.196)
land 0.141***
(0.031)
area 18.086***
(2.306)
rooms 3,304.227**
(1,661.248)
baths 6,977.317***
(2,581.321)
nearinc:y81 -21,920.270*** -14,177.930***
(6,359.745) (4,987.267)
Constant 82,517.230*** 89,116.540*** 13,807.670
(2,726.910) (2,406.051) (11,166.590)
--------------------------------------------------------------------------------------------
Observations 321 321 321
R2 0.174 0.414 0.660
Adjusted R2 0.166 0.405 0.649
Residual Std. Error 30,242.900 (df = 317) 25,543.290 (df = 315) 19,619.020 (df = 310)
F Statistic 22.251*** (df = 3; 317) 44.591*** (df = 5; 315) 60.189*** (df = 10; 310)
============================================================================================
Note: *p<0.1; **p<0.05; ***p<0.01
Kitabınız yöntemi tanıtmak amacıyla fiyatlar üzerinde log kullanmadı. Ama log kullanmak çok daha mantıklıdır.
Modeli değiştirmek daha doğru olacaktır.
\[ log(price) = \beta_0 + \delta_0 y81 + \beta_1 nearinc + \delta_1 y81 \cdot nearinc + u \]
\[ \hat{log(price)} = 11.29 + 0.457 y81 - 0.340 nearinc - 0.063 y81 \cdot nearinc \]
Bu sonuç evlerin değerinin yüzde 6.3’ünü kaybettikleri anlamına gelir.
log için tablo 13.2’yi oluşturalım.
<- lm(log(rprice) ~ nearinc*y81, data = kielmc )
logmodel_78_81_sutun_1 summary(logmodel_78_81_sutun_1)
Call:
lm(formula = log(rprice) ~ nearinc * y81, data = kielmc)
Residuals:
Min 1Q Median 3Q Max
-1.11957 -0.20328 0.02226 0.18909 1.66604
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 11.28542 0.03051 369.839 < 2e-16 ***
nearinc -0.33992 0.05456 -6.231 1.48e-09 ***
y81 0.19309 0.04532 4.261 2.69e-05 ***
nearinc:y81 -0.06265 0.08344 -0.751 0.453
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.3384 on 317 degrees of freedom
Multiple R-squared: 0.246, Adjusted R-squared: 0.2388
F-statistic: 34.47 on 3 and 317 DF, p-value: < 2.2e-16
<- lm(log(rprice) ~ nearinc*y81 + age + I(age^2), data = kielmc )
logmodel_78_81_sutun_2 summary(logmodel_78_81_sutun_2)
Call:
lm(formula = log(rprice) ~ nearinc * y81 + age + I(age^2), data = kielmc)
Residuals:
Min 1Q Median 3Q Max
-1.1692 -0.1601 -0.0008 0.1421 1.2336
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.137e+01 2.580e-02 440.693 < 2e-16 ***
nearinc 7.110e-03 5.161e-02 0.138 0.89051
y81 2.198e-01 3.693e-02 5.952 7.06e-09 ***
age -1.809e-02 1.414e-03 -12.793 < 2e-16 ***
I(age^2) 1.014e-04 9.095e-06 11.145 < 2e-16 ***
nearinc:y81 -1.850e-01 6.820e-02 -2.712 0.00706 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2739 on 315 degrees of freedom
Multiple R-squared: 0.5091, Adjusted R-squared: 0.5013
F-statistic: 65.34 on 5 and 315 DF, p-value: < 2.2e-16
-log model sütun 3
<- lm(log(rprice) ~ nearinc*y81 + age + I(age^2) + log(intst) + log(land) + log(area) + rooms + baths, data = kielmc )
logmodel_78_81_sutun_3 summary(logmodel_78_81_sutun_3)
Call:
lm(formula = log(rprice) ~ nearinc * y81 + age + I(age^2) + log(intst) +
log(land) + log(area) + rooms + baths, data = kielmc)
Residuals:
Min 1Q Median 3Q Max
-1.18440 -0.09946 0.01478 0.10984 0.74873
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.652e+00 4.159e-01 18.399 < 2e-16 ***
nearinc 3.224e-02 4.749e-02 0.679 0.497713
y81 1.621e-01 2.850e-02 5.687 2.99e-08 ***
age -8.359e-03 1.411e-03 -5.924 8.37e-09 ***
I(age^2) 3.763e-05 8.668e-06 4.342 1.92e-05 ***
log(intst) -6.144e-02 3.151e-02 -1.950 0.052081 .
log(land) 9.984e-02 2.449e-02 4.077 5.81e-05 ***
log(area) 3.508e-01 5.149e-02 6.813 4.98e-11 ***
rooms 4.733e-02 1.733e-02 2.732 0.006662 **
baths 9.428e-02 2.773e-02 3.400 0.000761 ***
nearinc:y81 -1.315e-01 5.197e-02 -2.531 0.011884 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2038 on 310 degrees of freedom
Multiple R-squared: 0.7326, Adjusted R-squared: 0.7239
F-statistic: 84.91 on 10 and 310 DF, p-value: < 2.2e-16
stargazer(list(logmodel_78_81_sutun_1, logmodel_78_81_sutun_2, logmodel_78_81_sutun_3), type = "text")
============================================================================================
Dependent variable:
------------------------------------------------------------------------
log(rprice)
(1) (2) (3)
--------------------------------------------------------------------------------------------
nearinc -0.340*** 0.007 0.032
(0.055) (0.052) (0.047)
y81 0.193*** 0.220*** 0.162***
(0.045) (0.037) (0.028)
age -0.018*** -0.008***
(0.001) (0.001)
I(age2) 0.0001*** 0.00004***
(0.00001) (0.00001)
log(intst) -0.061*
(0.032)
log(land) 0.100***
(0.024)
log(area) 0.351***
(0.051)
rooms 0.047***
(0.017)
baths 0.094***
(0.028)
nearinc:y81 -0.063 -0.185*** -0.132**
(0.083) (0.068) (0.052)
Constant 11.285*** 11.371*** 7.652***
(0.031) (0.026) (0.416)
--------------------------------------------------------------------------------------------
Observations 321 321 321
R2 0.246 0.509 0.733
Adjusted R2 0.239 0.501 0.724
Residual Std. Error 0.338 (df = 317) 0.274 (df = 315) 0.204 (df = 310)
F Statistic 34.470*** (df = 3; 317) 65.341*** (df = 5; 315) 84.915*** (df = 10; 310)
============================================================================================
Note: *p<0.1; **p<0.05; ***p<0.01
Bu tablonun açıklamalarını daha önce yaptık. Kitabınızın 453. sayfasını tekrar okuyun.
Katsayıların açıklamaları için 454. sayfayı okuyun.
Bu tür regresyonların, kontrol ve tedavi gruplarını açıklamak için kullanılabileceğini hatırlayın.