Categories
R

R’da Temel Veri Analizi

R ve Analiz

Bu yazıyı yazmaktaki amacım R kullanarak bilimsel çalışma yapmak isteyen fakat bir sebepten başlayamayanlara aslında sürecin ne kadar kolay olduğunu göstermek. Metin içinde kullanılan bilgileri farklı kaynaklardan elde ettim:

  1. Paketlerin kullanımını, fonksiyonların içeriğini paketlerde yer alan vinyetlerden okuyarak öğrendim.
  2. Buradaki bilgilerin bazılarını Datacamp’de aldığım R kurslardan edindim. Bugüne kadar tamamladığım kursların (career track) isimlerini en sonda yazdım. Derslerin detaylarına bağlantılardan ulaşabilirsiniz.
  3. Burada bahsi geçen konuların şahsım adına çok zorlaştığı noktalarda Stack Exchange, Stack Overflow ve ücretsiz R sitelerinde yazılanları takip ederek sonuca ulaştım. Hangi sayfa benim için en kolay anlatımı yaptıysa (ben nasıl öğrendiysem), ona atıf yaptım. Kullandığım bütün kaynakları kodlardan önce paylaştım.

Önce hangi kodun ne işe yaradığını yorumlarla yanına yazdım, ancak kopyala-yapıştır ile konsola attığımda çok uğraştırdı. O yüzden daha anlaşılır olması amacıyla kodların altına ekledim.

Buradaki temel anlatımından elde edilecek faydayı büyütmek, farklı boyutlara getirmek tamamiyle sizin çabanızla ilgili. R kullanarak istatistiki analize giriş yapmak isteyenler için faydalı olması dileğiyle.

Haydi başlayalım!

Categories
R

R Öğrenmek İsteyenlere

R programlama dili okyanus gibidir, her programlama dili gibi. Amacınız o okyanusu yüzerek keşfetmek ise benim tavsiyem online dersler. Özellikle İngilizce’niz varsa uygun fiyatlara erişebileceğiniz birçok online eğitim mevcut. Türkçe kursların fiyatlarına göre oldukça uygun olduklarını söylemem lazım. Veri analizi gibi bir alanda uzmanlaşmak istiyorsanız öncelikli tavsiyem dili seçmeniz. Ben edx’in ücretsiz kursları ile R’a başladım ve nedense Phyton’u hiç denemedim.

Coursera, edx, Udemy gibi sitelerde birçok R eğitimi mevcut. Benim ilk aldığım eğitim edx’te Datacamp tarafından hazırlanmış temel seviyede bir eğitimdi. Daha sonrasında Stackexchange, bloglar ve paket dosyaları ile ihtiyacım olan kısımları çözebildim. Ancak sizin kariyer haliniz veri analizi konusunda uzmanlaşmak ise bundan fazlasına ihtiyacınız var. Bu noktada benim tavsiyem Datacamp olacak. Orta seviyede İngilizce ile dersleri anlamanız mümkün çünkü sunumları indirebileceğiniz gibi anlatımları altyazılı da dinleyebilirsiniz. Sadece R öğrenmek de zorunda değilseniz, daha popüler olan Phyton ile SQL, hesap tabloları yazılımlar da Datacamp eğitimlerine dahil. “Kariyer Kursları” ve “Yetenek Kursları” ile sertifikalı eğitimler alabilirsiniz.

Datacamp indirimlerini takip etmenizi öneririm çünkü tek ödemeyle birçok derse erişebildiğiniz gibi telefon uygulaması ile günlük olarak bilginizi test edebiliyorsunuz. Ben mevcut üyeliğim için $99 ödemiştim Siber Pazarteside. Mayıs 2020 kampanyasında yıllık fiyatı $149 olarak belirtmişler. Elbette bu fiyatı pahalı bulanlar olacaktır ancak temel R kursları ortalama bir kurum tarafından verildiğinde en düşük fiyat 2.000 ₺ oluyor. Tek ödemeyle alabileceğiniz derslerin sayısı ve kalitesi göz önüne alındığında Datacamp bence hepsinin önüne geçiyor.

Datacamp Mayıs ayı kampanyası

Categories
R

Regresyona ağırlık eklemek

Program fark etmeksizin regresyon komutu aynı varsayımla çalışır; bütün gözlemler eşit ağırlıktadır. Yani kümesel bir dağılım tamamiyle göz ardı edilir.

Peki bu kümelerin sonuçlara bir etkisini varsayıyorsak nasıl bir yol izleyebiliriz?

İlgili kümenin toplamdaki ağırlığını verisetini ekleriz bir de üstüne bunu regresyonda kullanırız.

Kümenin ağırlığını nasıl hesaplayacağız?

1/kümedeki gözlem sayısının kare kökü

Excel formulü?

=1/SQRT(kümedeki gözlem sayısı)

R’da ağırlıkların kullanımı?

lm(y~x1+x2,data=veriseti, weights = Ağırlık Kolonu Adı)

Categories
R

R'da Standart hataları şirket-yıl seviyesinde kümelemek

R/R-Studio’nun işletme sistemi fark etmeksizin kullanılabilmesi, paketlerle genişletilebilmesi ve tabii ki ücretsiz olması kullanımını cazip hale getiriyor. Ancak bu özellikler kullanımının çok kolay olduğu anlamına gelmiyor. Bazı programlarla sadece iki tıklamayla çözülebilecek bir model/test/analiz için kod(lar) yazmanız gerekebiliyor. Benzer bir durum Stata’yla karşılaştırdığınızda da geçerli. Doğrusal regresyonun sağlamlık testi için “robust” veya “vce” eklemeniz yeterliyken R/R-Studio bu işi paketlerle hallediyor.

Öncelikle kullancağımız verisetini tanımlayalım (plm paketi içerisindeki EmplUK)

install.packages(plm)

library(plm)

data(EmplUK)

Doğrusal regresyon modelimizi şirket ve yıl sabit olarak (kukla değişken kullanarak) çalıştıralım.

emplm<-lm(emp~wage+capital+output+factor(firm)+factor(year),data=EmplUK)

coeftest ve sandwich paketlerini kullanarak standart hataları firma-yıl olarak kümeleyeceğiz. Vektörün kayıt edilebilmesi için her iki paketin de library() fonksiyonu ile etkinleştirilmesi gerekiyor. İşlem verisetinin büyüklüğüne göre normalden uzun sürecektir.

emplm_SE<-coeftest(emplm,vcov=vcovHAC(emplm,type="HC0",cluster=c(EmplUK$firm,EmplUK$year)))

İşinize yaraması dileğiyle.

Categories
R

R'da regresyon modellerini Excel'e aktarmak

R kullanarak yaptığım ilk regresyon modelimin sonuçlarını çalışmama aktarırken write.csv’den tutun da write ile başlayan bütün dışa aktarımı fonksiyonlarını denedim. Hiçbiri kabul etmedi summary fonksiyonu ile çalışmayı. Biraz da el hızıma güvenip babadan kalma bir yöntemi kullanmaya başladım: kadar: kopyala + yapıştır. Söz konusu olan R’ın regresyon sonuç tabloları ise bu yöntem biraz uğraştırıyor açıkçası. Excel’e aktardığım tabloların biçimini satır satır düzeltmek gerekiyor aslında. Satırları sütunlara çevirmeden faydalanıp istediğim gibi biçimlendiriyordum tablolarım. R için düzenli ziyaret ettiğim Stack Exchange’de denk geldiğim cevaplar da çoğunlukla “stargazer” paketini tavsiye ediyordu.. Aklımın hep kenarında olup kurulu paketlerde aylardır bekleyen stargazer‘i denemeye kadar verdim bir gün. HTML biçiminde dosyaya aktardığım tabloları Excel’e aktarmak gerçekten çok basitleşti o andan itibaren. Kullanınca da fark ettim ki aslında benim teker teker yaptığım her adımı stargazer bitirilmiş halde önüme sürüyor. Eğer LaTeX diline hakimseniz tabloların sunumunu daha da geliştirmek elinizde. Paketin anlatımı kılavuza dayanarak yapılmıştır.

Önce paketi kuralım, sonra da çağıralım

>install.packages("startgazer")
>library(stargazer)

Sonuçlarını tablolara yansıtmak istediğimiz üç farklı model oluşturualım

>linear.1 <- lm(rating ~ complaints + privileges + learning + raises + critical, data=attitude)
>linear.2 <- lm(rating ~ complaints + privileges + learning, data=attitude)

>attitude$high.rating <- (attitude$rating > 70)
>probit.model <- glm(high.rating ~ learning + critical + advance, data=attitude, family = binomial(link = "probit"))

Pakete ait stargazer fonksiyonunu en temel haliyle kullanmak için aşağıdaki komutu çalıştırın

>stargazer(linear.1, linear.2, probit.model, title="Karşılaştırmalı Sonuçlar", digits=4, align=TRUE)

Yukarıdaki formül size sonuçları LaTeX formatında ve ondalık hanade 4 basamak ile verecek verecek. Bugüne kadar hiç LaTeX ile çalışmadıysanız (benim gibi), sonuçları HTML olarak elde etmeniz mümkün.

>stargazer(linear.1, linear.2, probit.model, title="Karşılaştırmalı Sonuçlar", align=TRUE,digits=4,type="html")

Peki sonuçları Excel’e aktarmak için ne yapmak gerekiyor?

>write.csv(stargazer(linear.1, linear.2, probit.model, title="Karşılaştırmalı Sonuçlar", align=TRUE,digits=4,type="html"),file="model.csv")

CSV dosyasını Excel veya Calc ile açın, ve B kolonunda <table> ile </table> arasındaki bütün kodları kopyalayıp Windows’un Not Defteri’ne (notepad.exe) yapıştırın. Dosyayı HTML uzantısı ile kaydedip tarayıcınız ile açın ve istediğiniz gibi düzenleyin.

Adım adım gittiğinizde emin olun ki R’dan Excel’e kopyalayıp yapıştırmaktan daha kolay olduğunu göreceksiniz. Kolay gelsin.

Categories
R

R'da "winsorize" yapmak

İlk soru: “winsorize” nedir?

Verisetindeki uç değerlerin atılması yerine verisetindeki en yakın değerleri koyarak ortalamaya yaklaştırılmasını sağlayan istatistiki düzeltme tekniği (Yılmaz ve Koğar, 2015). R’da verisetinizi nasıl winsorize edebilirsiniz?

Kullanabileceğiniz iki adet paket mevcut: robustHD ve statar.

robustHD’nin algoritması sebebiyle değişkenlerin merkeze yakınlaştırılmasında sonuçlarda sorun çıkabiliyor ayrıca boş (NA) olan değerler mevcut olduğunda hata veriyor. Bu yüzden Stata’dan esinlenilmiş “statar” paketini tavsiye ederim.

Öncelikle aşağıdaki komutla paketi kuracağız

>install.packages(“statar”)

Sonra da etkin hale getireceğiz.

>library(statar)

winsorize (veya winsorise) fonksiyonu ile de istediğimiz değişkenlerin içerisindeki uç değerleri merkeze yakınlaştıracağız. İdmanlarımızı da R’da hazır halde bulunan airquality veriseti üzerinden yapacağız. Veriseti üstünde bazı işlemler yapacağımız içinde yeni bir veriseti olarak kullanacağız.

>wintest<-airquality

Önce winsorize fonksiyonunu ekler olmadan çalıştıralım.

>winsorize(wintest$Wind)
0.00 % observations replaced at the bottom
0.00 % observations replaced at the top

Yani fonksiyon hiçbir değeri uç olarak görmediği için değiştirme gereği de duymadı.
Peki eklerle kullanırsak sonuç nasıl değişecek?

>winsorize(wintest$Wind, probs=c(0.01,0.99))
0.65 % observations replaced at the bottom
0.65 % observations replaced at the top

probs ekindeki 0.01 ve 0.99 en uçtaki %1 ve %99 değerlerin dışında kalanların merkezi yakınlaştırılmasını sağlıyor.
Fonksiyonda kullandığımız probs ekini değiştirelim.

>winsorize(wintest$Wind, probs=c(0.05,0.95))
3.92 % observations replaced at the bottom
4.58 % observations replaced at the top

Aynı değişkeni winsorize etmekle uğraşmak istemiyorsanız lm fonksiyonu içerisinde winsorize‘yi monte edebilirsiniz.

lm(Ozone~Solar.R+winsorize(wintest$Wind,probs=c(0.05,0.95))+Temp+Month+Day,data=wintest)

Bir diğer seçenek de sütunu tamamiyle winsorize edilmiş değiştirebilirsiniz.

wintest[,3]<-winsorize(wintest$Wind,probs =c(0.05,0.95))

Küçük bir test ile winsorize işleminin gerçekleşip gerçekleşmediğini görebiliriz

> wintest[,3]==airquality[,3]

Yukarıdaki komut R’a wintest ile airquality verisetlerinin 3.sütunlarının birbirlerine eşit olup olmadığını sorguluyor. “FALSE” ibaresini gördüğünüz her değer airquality verisetindeki değerin değiştirildiğini ifade ediyor.

Yılmaz, E., & Koğar, H. (2015). Uç Değerle Baş Etmede Kullanılan Farklı Tekniklerin Bazı İstatistiksel Analiz Sonuçları Üzerindeki Etkisi. BaşKent University Journal Of Education, 2(1), 61-67.

Categories
R

R'da panel veri analizi

R’da panel veri analizini Google’da aradığınızda çıkan Türkçe sonuçlar çoğunlukla panel veriyi anlatıyor. İngilizce kaynaklarda (kitap, dergi, forum, paketler) son derece fazla paylaşılan R’da panel veri analizi için bir de Türkçe kaynak gerektiği fikrinden yola çıkıp bu yazıyı hazırladım. Ekonometrik çalışmalarını R’da yapmak isteyenlere en ufak bir katkım olduysa ne mutlu bana.

İhtiyacımız olanlar:

  1. R (bizzat kendisi)
  2. RStudio (veri aktarımını kolaylaştırmak için)
  3. plm, lmtest ve sandwich paketleri

Devamı aşağıda

Yapılacaklar

R ve RStudio kurulumları bittikten sonra RStudio’da aşağıdaki komutları çalıştırın.

install.packages(“plm”)
install.packages(“sandwich”)
install.packages(“lmtest”)
library(plm)
library(sandwich)
library(lmtest)

Hangi paketi neden kuruyoruz?

Panel veri setinizi analiz etmek için “plm” kurmanız gerekli.

Ekonometrik testlerin sonuçlarına göre de tahmin vasıtası (estimator) çeşitlerini arttırmak için de “sandwich” paketine ihtiyacımız var.

Varyans oynaklığı testini kolaylaştırmak için de “lmtest” paketini kullanacağız.

Hangi veri üstünde analiz yapacağız?

Eğer elinizde panel olarak hazırlanmış bir veriseti varsa onun üstünde çalışabilirsiniz. Sadece idman yapmak için R’da mevcut bir seti üstünden de analizkeri yapabilirsiniz. Anlatımı kolaylaştırmak için ben plm ile gelen “Gasoline” verisini (4 değişken, 18 birim, 19 yıl, 342 gözlem) vektör içinde kullanacağım.

data(“Gasoline”)
dene<-plm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline)

En temel haliyle panel veri setinin analizidir yukarıdaki  “dene” vektörü ve çalıştırdığınızda tahmin çarpanlarını gösterir R. plm() aynen lm() fonksiyonu gibi çalışır yani siz bağımlı değişken (y) ile bağımsız değişkenleri (x) tanımlamanız (y~x1+x2+x3+…+xn) gereklidir. Eğer modele ilişkin test sonuçlarını görmek istiyorsanız vektörü summary() fonksiyonu ile çalıştırmanız gerekli.

summary(dene) 

Peki panel regresyonunuzu etkilerin (havuzlandırılmış, rassal veya sabit), etki türlerinin (zaman, birim, ikiyönlü, yerleşik), endekslerin ve gerekirse tahmin vasıtalarının tanımladığı şekilde genişletmek istersek vektörü aşağıdaki haliyle yazmak gerekir.

dene<-plm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline, index = c(“country”, “year”), model = “”, effect=””, random.method = “”)

model= kriteri pooling (klasik OLS), within (sabit), random (rassal), between, fd (ilk farklar), ht (Hausman-Taylor tahmin vasıtası) seçeneklerinden biriyle

  • pooling: havuzlandırılmış etkiler, klasik OLS
  • within: sabit etkiler
  • random: rassal etkiler
  • fd: ilk farklar
  • ht: Hausman-Taylor tahmin vasıtası
  • between: orta tahmincisi

effect= kriteri individual, time, twoways, nested seçeneklerinden biriyle

  • individual: birim etkisi
  • time: zaman etkisi
  • twoways: iki yönlü etki
  • nested: yerleşik etki

random.method= kriteri sadece model etkisi olarak “random” seçildiğinde kullanılabilir ve aşağıdaki tahmincilerinin seçilmesini sağlar.

  • swar (tahminci seçilmezse plm tarafından varsayılan olarak kullanılır)
  • amemiya
  • walhus
  • nerlove

Panel regresyonunuzdaki model etkileri için gerekli testleri yine plm paketinin altındaki komutlarla ölçebilirsiniz.

Panel veri testlerini nasıl yürüteceğiz?

Havuzlandırılmış ile Rassal etkiler arasında karar vermek için Lagrange Multiplier testini yapacağız.Rassal ile Sabit etkiler arasında karar verebilmek için de Hausman (1978) testi yapacağız. Bunun için modelinizi sırasıyla (pooled, random, within) ile kaydedin.

dene.pe<-plm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline, index = c(“country”, “year”), model = “pooling”)
dene.re<-plm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline, index = c(“country”, “year”), model = “random”)
dene.fe<-plm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline, index = c(“country”, “year”), model = “within”)

Sonrasında ise her bir modeli teker teker plmtest() fonksiyonu ile deneyin ve p-değerlerine göre kullanabileceğiniz etki türünü görmüş olacaksınız.

plmtest(dene.pe)
plmtest(dene.re)
plmtest(dene.fe)

Peki modelin içerisindeki birim, zaman veya iki yönlü etkileri nasıl ölçebiliriz? Onu da yine plmtest() fonksiyonu yardımıyla gerçekleştireceğiz. 

plmtest(dene, effect = “”, type=“”)

effect= kriteri individual, time, twoways, seçeneklerinden biriyle

  • individual: birim etkisi
  • time: zaman etkisi
  • twoways: iki yönlü etki

type= kriteri honda, bp, kw, ghm test seçeneklerinden biriyle 

  • honda: Honda (1985) (seçenek belirtilmezse varsayılan olarak kullanılır.)
  • bp: Breusch/Pagan (1980)
  • kw: King/Wu (1997)
  • ghm: Gourieroux/Holly/Monfort (1982);

Birkaç farklı fonksiyon ile de modelin içindeki sorunları test edeceğiz. Test sonuçlarının p-değerine göre de sorunların varlığına göre tahmin vasıtaları kullanacağız.

Breusch-Godfrey/Wooldridge seriler arası korelasyon testi ile başlayalım. (Breusch, 1978; Godfrey, 1978; Wooldridge, 2013)⁠ 

pbgtest(dene)

p-testi < 0.05 => Seriler arası korelasyon vardır.

p-testi > 0.05 => Seriler arası korelasyon yoktur.

Yatay kesit bağımlığı Pesaran (2004) ve Breusch-Pagan LM korelasyon testlerini uygulayacağız.

pcdtest(dene, test=”cd”)
pcdtest(dene, test=”lm”)

p-testi < 0.05 => Yatay kesit bağımlığı vardır.

p-testi > 0.05 =>Yatay kesit bağımlığı yoktur.

Varyans oynaklığı (Heteroskedasticity) sorununun varlığının test edilmesi için “lmtest” paketinden destek alacağız. Bunun için önce modeli lm() fonksiyonu ile vektör olarak kaydedeceğiz.

dene.lm<-lm(lgaspcar~lincomep+lrpmg+lcarpcap,data=Gasoline)

dene.lm vektörünü de lmtest paketinin içerisinde mevcut bulunan bptest() fonksiyonu ile test edeceğiz.

bptest(dene.lm, studentize = F)

p-testi < 0.05 => Varyans oynaklığı vardır.

p-testi > 0.05 =>Varyans oynaklığı yoktur.

Sıra geldi “sandwich”ten atıştırmaya

Yaptığınız testlerin çeşitliliğine göre kullanmanız gereken tahmin vasıtaları mevcut, plm paketinin de destek aldığı “sandwich” üzerinden çalışacağız.

Modelinizde çıkan sorunların çeşitliliğine göre varyans düzeltmeleri yapmanız gerekiyor. Bunun için de vcov ile başlayan fonksiyonlar üzerinden çalışacağız.

  • vcovSCC() Yatay kesit ve seriler arası korelasyon olduğu durumlarda Driscoll&Kraay tahmin vasıtası için
  • vcovHC(): Varyans oynaklığını çözmede White tahmin vasıtası için
  • vcovHAC(): Varyans oynaklığı ve otokorelasyon uyumlu (Heteroskedasticity and autocorrelation consistent [HAC]) tahmin vasıtası için 
  • vcovNW(): Seriler arası korelasyon sorununu çözmede Newey-West tahmin vasıtası kullanmak için 
  • vcovPL(): Newey-West ve Driscoll&Kraay tahmin vasıtalarını aynı anda kullanmak için 

vcov fonksiyonu ile varyans testi yapabileceğiniz gibi plm tarafından desteklenen fonksiyonları summary() içinde kullanarak modelin tahmin vasıtası ile sağlamlaştırılmış testlerini de yapabilirsiniz.

summary(dene.fe, vcov = vcovSCC)
summary(dene.re, vcov = vcovNW)
summary(dene.pe, vcov = vcovHC)

Ekonometri bilginizin derinliğine göre plm ve diğer paketleri daha detaylı kullanmanız hatta geliştirmeniz dahi mümkün. Derdini anlatacak kadar ekonometri bilen bendenize  de bir şeyler anlatırsanız mutlu olurum.

Kaynakça

Achim Zeileis, Torsten Hothorn (2002). Diagnostic Checking in Regression
Relationships. R News 2(3), 7-10. URL https://CRAN.R-project.org/doc/Rnews/

Achim Zeileis (2004). Econometric Computing with HC and HAC Covariance Matrix
Estimators. Journal of Statistical Software 11(10), 1-17. URL http://www.jstatsoft.org/v11/i10/.

Achim Zeileis (2006). Object-Oriented Computation of Sandwich Estimators. Journal of Statistical Software 16(9), 1-16. URL http://www.jstatsoft.org/v16/i09/.

Croissant Y and Millo G (2008). “Panel Data Econometrics in R: The plm Package.”
_Journal of Statistical Software_, *27*(2), pp. 1-43. doi: 10.18637/jss.v027.i02 (URL:
http://doi.org/10.18637/jss.v027.i02).

Millo G (2017). “Robust Standard Error Estimators for Panel Models: A Unifying
Approach.” _Journal of Statistical Software_, *82*(3), pp. 1-27. doi:
10.18637/jss.v082.i03 (URL: http://doi.org/10.18637/jss.v082.i03).

R Core Team. (2017). R: A language and environment for statistical computing. R
Foundation for Statistical Computing, Vienna, Austria. URL
https://www.R-project.org/.

RStudio Team. (2016). RStudio: Integrated Development for R. RStudio, Inc., Boston, MA
URL http://www.rstudio.com/.

Torres-Reyna, Oscar. (2010) https://www.princeton.edu/~otorres/Panel101R.pdf