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.
Xler = cbind(bwght$cigs, bwght$faminc)
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.
Xler = cbind(bwght$cigs, bwght$faminc, c(rep(1, nrow(bwght))))
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.
Y = cbind(bwght$bwght)
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)
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
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üü hatırlayın.
Dogrusal_reg_se <- function(X, Y)
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) %*% :
## Production de NaN
## [,1] [,2] [,3]
## [1,] 0.09151077 0.02149117 NaN
## [2,] 0.02149117 0.02916682 NaN
## [3,] NaN NaN 1.048228
Warning in sqrt(as.numeric(var(Y - X %% solve(t(X) %% X) %% t(X) %% : NaNs produced
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.
dr <- function(X, Y) {
A <- solve(t(X) %*% X)%*%t(X) %*% Y
B <- 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)))
result <- list(t(A), B)
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)))
## %*% : Production de NaN
## $katsayılar
## [,1] [,2] [,3]
## [1,] -0.4634075 0.09276474 116.9741
##
## $`Standart Hatalar`
## [1] 0.09290577 0.02961144 1.06420678
Warning in sqrt(as.numeric(t(Y - as.numeric(t(Y) %% rep(1, nrow(Y))/nrow(Y))) %% : NaNs produced
$katsayılar
Artık standart hatalarını da gözlemleyebileceğim bir regresyon fonksiyonum var.
Fonksiyona t ve pr değerlerini ekleyelim.
dr <- function(X, Y) {
A <- solve(t(X) %*% X)%*%t(X) %*% Y
B <- 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)))
C <- t(A)/B
D <- 1-pt(abs(C), nrow(X) - ncol(X) - 1)
result <- list(t(A), B, C, D)
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)))
## %*% : Production de NaN
## $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
Panel veri hem yatay kesit, hem de zaman serisi boyutlarına sahiptir. Örnek 13.1 Zaman İçinde Kadınların Doğurganlık oranları 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)
tabloda year değişkenini görüyoruz. Her yıl için 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)
## Le chargement a nécessité le package : dplyr
##
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
##
## filter, lag
## Les objets suivants sont masqués depuis 'package:base':
##
## intersect, setdiff, setequal, union