Not: Bu ders notları serisi Mostly Harmless Econometrics kitabının bölüm özetleri ve uygulamalarının yeniden oluşturulması üzerine odaklanacaktır.

Giriş

Yüksek lisans eğitimi alırken çalışmak istediğim ilk konu eğitimin gelire bir etkisi olup olmadığını incelemekti . Bu konuya ilgimin nedeni eğitime harcamış olduğum zamanın bana olumlu bir katkısı olup olmadığını düşünmemden ileri geliyordu. Üniversite bitiren birçok arkadaşım işsiz kalmıştı ve tecrübesiz olduklarından dolayı iş bulma ihtimalleri çok düşük görünüyordu. Birçoğu lise mezunlarının işlerini yapıyor ve üniversitede geçirdikleri dört sene içinde edinebilecekleri tecrübeden mahrum kalmış olarak dört sene önce iş hayatına başlamış olan birinden daha az kazanıyorlardı. Bu durum eğitim mi yoksa zaman mı daha kıymetli sorusunu sormama neden oluyordu. Ancak verileri gruplara ayırdığımızda, gözlemlediğimiz yüksek eğitim alan kişilerin daha yüksek gelir elde ettikleri oldu. Ancak bu ortalama değerler hala gerçek sorunun cevabını vermiyordu. Eğer üniversite mezunu arkadaşım üniversiteye gitmeseydi ve direk işe başlamış olsaydı, kazancı daha yüksek olur muydu? Bu soruyu kesin bir şekilde cevaplamanın yolunu bulmak çok zordu. Örneğin, Paralel evrenleri gözlemleyebildiğim bir teleskop olsaydı, ve arkadaşlarımın üniversite yerine işe başlamayı tercih ettiği ve diğer koşulların değişmediği bir evren gözlemleyebilseydim arkadaşlarımın iki dünya arasındaki gelir farklılıklarının ortalamalarını birbirinden çıkarıp gerçek sonuca ulaşabilirdim. Aynı işlemi diğer bütün insanlar için yapıp ortalamasını alırsam, bu basit sorum için gerçek fotoğrafı gösteren bir parametre elde edebilirdim. Genel ortalamalara bakmak doğru sonucu vermeyeceği gibi bizi yanlış da yönlendirebilirdi.

Sorumuzu tekrar soralım: Üniversite eğitimi gelirleri artırır mı? Gelir ve yaşam koşulları araştırması anket sonuçlarını incelediğimizde yükseköğretim alanların, almayanlara göre daha fazla kazandığı sonucuna ulaşabiliriz. Bu cevabın doğru olma ihtimali hiç de az değildir. Üniversite, hali hazırda sınavla girilen ve normal hayata göre daha çok yetenekli insan olması beklenen bir ortamdır. Bu yetenekli insanların üniversiteye gitseler de gitmeseler de daha çok gelir elde etmesi beklenebilir. Üniversite aynı zamanda gelecekte girilebilecek yüksek maaşlı işler için çevre oluşturulabilecek bir yer olarak da düşünülebilir. Sonuçta bir üniversite mezunu, yüksek gelirli bir iş için başka bir üniversite mezununu tercih edebilir.

Eğitim Durumuna Göre Yıllık Ortalama Esas İş Gelirleri (TL) 2018, 2019. TUİK
Eğitim Durumuna Göre Yıllık Ortalama Esas İş Gelirleri (TL) 2018, 2019. TUİK

Bu konuyu daha detaylı inceleybilmek için daha farklı bir yönteme ihtiyaç var. Elde edilen gelir miktarını Y ile gösterirsek. \(Y_0\), ülkedeki bireylerin yükseköğretim alıp almadığına bakmaksızın yükseköğretim eğitimi almamış olsalardı ne kadar gelir elde edebileceklerini göstersin, \(Y_1\) ise yükseköğretim almış olsalardı ne kadar gelir elde edileceklerini göstersin. Bu durumda \(Y_1 - Y_0\) bize ulaşmak istediğimiz sonucu verecektir. Bu sonuca ancak paralel evrenler arası gözlemler yapabileceğimiz bir teleskop bularak veya zamanda geri gidip eğitim almış bireye eğitim aldırmayıp, almamış olana da eğitim aldırıp, gerçekte elde ettiği geliri bildiğimizden dolayı ulaşabiliriz. Bu durumda bile, elde ettiğimiz verilerle ulaşabileceğimiz tek sonuç ortalama farklardır. Gözlemlediğimiz veriler eğitim almış kişilerin gelirlerinin ortalaması ve eğitim almamış kişilerin gelirlerinin ortalaması arasındaki farkı verebilir. Ortalamalar E operatörü ile gösterilebilir. E, parantez içine yazılmış değişkenin beklenen (expected) yani ortalama sonucunu verir. Parantez içinde bulunan | operatöründen sonra, hangi koşulda bu ortalama değeri bulduğumuz yazılır. Yani \(\mathbb{E}[Y_1 |\) Yükseköretim almış olma] yazarsak, yükseköğretim almış olanların ortalama gelirlerinden bahsetmiş oluruz, eğer \(\mathbb{E}[Y_0 |\) Yükseköretim almış olma] yazarsak, yükseköğretim almamış kişilerin eğer yükseköğretim alsalardı ortalama ne kadar gelir elde edebileceklerinden bahsetmiş oluruz.

Gözlemleyebildiğimiz değerler:

\[ E[Y_1| \text{Yükseköğretim almış olma}]- \\ E[Y_0| \text{Yükseköğretim almamış olma}] \]

Bu ortalama değerler iki parçaya ayrılabilir.

\[ E[Y_1 | \text{Yükseköğretim almış olma}]- \\ E[Y_0 | \text{Yükseköğretim almış olma}]+\\ E[Y_0 | \text{Yükseköğretim almış olma}]-\\ E[Y_0 | \text{Yükseköğretim almamış olma}]\\ \]

Üst iki satır tedaviyi alanların (örneğimizde tedavi yükseköğretim almaktır) ortalama tedavi etkisini verir (treatment effect). Alt iki satır seçim yanlılığını oluşturur. Tedaviyi alanların, ortalama tedavi etkisi, örneğimizde yükseköğretim almış kişilerin ortalama gelirlerinden, yükseköğretim almamış kişilerin eğer yükseköğretim almış olsalardı kazanacakları ortalama geliri çıkarma yoluyla bulunur. Seçim yanlılığı yükseköğretim almamış kişilerin, eğer yükseköğretim almış olsalardı kazanacakları ortalama gelirden, yükseköğretim almamış olanların ortalama gelirlerini çıkararak bulunabilir. Daha yetenekli kişilerin her zaman olmasa bile yükseköğretim alma olasılıkları daha az yetenekli kişilere göre daha fazla olacağından, yükseköğretim almamış kişilerin üniversiteye katılıp çevre etkisini arttırmaları hiç gitmemelerine göre büyük bir pozitif etki yaratacaktır. Bu durum gözlemlediğimiz etkinin seçim yanlılığı yüzünden büyük pozitif etki yaratmasına neden olabilir. Yapacağınız çalışmalarda seçim yanlılığı problemini aşmak en önemli önceliklerinizden biri olmalıdır.

Rastgele seçim teknik olarak E[\(Y_0\) | Yükseköretim almış olma] ve E[\(Y_0\) | Yükseköretim almamış olma] beklentilerini eşitleyeceğinden seçim yanlılığı sorununu büyük ölçüde azaltabilir. Bir başka deyişle rastgele olarak insanları seçip yükseköğretim aldırırsanız ve rasgele olarak bazı insanlara yükseköğretim aldırmayabilirseniz, yükseköğretim almayacak olup, alanların ve aslında alacak olup almayanların sonuçlarına ulaşabilir ve gerçek neden sonuç ilişkisini bulmaya yaklaşabilirsiniz. Ancak rastgele deneysel çalışmalar örneğimizde olduğu gibi sosyal bilimler için her an uygulanabilecek bir yöntem değildir. Tıp bu deneyleri yıllardır yapmaktadır. Basit bir anlatımla bir ilacın belirli bir hastalığın tedavisinde etkili olup olmadığını anlamak için rasgele seçim yöntemleri kullanılmaktadır. Bu yüzden bu araştırmalarda tedavi etkisi bulunur. Rastgele iki grup seçilir, tedavi grubu ve kontrol grubu. Tedavi grubuna etkisi araştırılan ilaç, kontrol grubuna plasebo (herhangi bir etkisi olmayan ilaç) verilir. Tedaviyi görenler hangi ilacı aldıklarını bilmezler. Sonuçlar karşılattırılıp ilacın hastalık üzerinde anlamlı bir etkisi olup olmadığı araştırılır.

Ekonomi biliminde araştırma yapılırken kontrol ve tedavi grupları oluşturmak eski yapılan çalışmalara göre daha yaygın olmakla birlikte her zaman uygun olmamaktadır. Bu yüzden tam deneysel yöntemler yerine çoğunlukla yarı deneysel yöntemler uygulanır. Bu dersi alan öğrencilerin yarı deneysel yöntemlerle birlikte zaman serisi, panel data vb .ekonometrik yöntemleri öğrenmeleri teşvik edilmektedir.

Perry anaokul projesi (kullanılabilir)

Perry anaokulu projesi, 1962 yılında Michigan’daki Ypsilanti’de 123 siyahi okul öncesi çocuğu kapsayan erken müdahale programının etkilerini değerlendirmek için tasarlanmış bir rastgele deneydir. Perry tedavi grubu, anaokulu eğitimi ve ev ziyaretlerini içeren yoğun bir müdahaleye rastgele olarak atanmıştır. Perry deneyinin küçük ancak iyi tasarlanmış etkisi abartılamaz. Deney, 1993 yılına kadar katılımcıların 27 yaşındayken izlem verileri üretmiştir. Perry bulgularına atıfta bulunan veya kullanan düzinelerce akademik çalışma mevcuttur. En önemlisi, Perry projesi, 1964 yılında başlatılan ve milyonlarca Amerikan çocuğuna hizmet veren devasa Head Start anaokulu programının entelektüel temelini oluşturmuştur.

Seçim yanlılığı

Kitabın bu bölümü bir varsayımla başlıyor. Varsayalım ki bir nedensel “eğer-ise” sorusuyla ilgileniyorsunuz. Somut bir örnek üzerinden konuyu daha iyi anlamak için şunu düşünelim: Hastaneler insanları daha sağlıklı yapar mı? Bu soruyu daha gerçekçi hale getirmek için, hastane acil servislerini birinci basamak sağlık hizmeti olarak kullanan yoksul yaşlı bir nüfusu araştırdığımızı hayal edelim. Bu hastalardan bazıları hastaneye yatırılıyor. Bu tür bir bakım pahalıdır, hastane tesislerini kalabalıklaştırır. Aslında, kırılgan olanların kendilerine hastalık bulaştırabilen diğer hasta kişilerle temas etmesi, sağlıklarına net bir olumsuz etki yapabilir. Hastaneye yatırılanlar birçok değerli hizmet alıyor olsa da, hastane etkinliği sorusunun cevabının hala evet olması olası görünmektedir. Ancak veriler bunu destekleyecek mi? Deneysel bir yaklaşım benimseyen bir kişi için doğal yaklaşım, hastaneye gidenlerin sağlık durumunu, hastaneye gitmeyenlerin sağlığıyla karşılaştırmaktır. NHIS (National Health Interview Survey), bu karşılaştırmayı yapmak için gereken bilgileri içermektedir. Özellikle, “Son 12 ay içinde, katılımcı hastanede bir gece hasta mıydı?” sorusuyla son zamanlarda hastaneye gidenleri belirleyebiliriz. NHIS ayrıca, “Genel olarak sağlığınızın mükemmel, çok iyi, iyi, orta, kötü olduğunu söyler misiniz?” sorusunu da içermektedir. Kitabın bu bölümünde bulunan tablo, hastaneye yatırılan ve yatırılmayanların ortalama sağlık durumunu göstermektedir:

Hastaneye yatan: 7,774 kişi

Sağlık durumlarının ortalaması: 3.21

Standart Hata: 0.014

Hastaneye yatmayan: 90.000 kişi

Sağlık durumlarının ortalaması: 3.93

Standart Hata: 0.003

Ortalama fark 0,72’dir ve yüksek derecede anlamlıdır ve t istatistiği 58,9’dur. Yüzeysel bir şekilde ele alındığında, bu sonuç hastaneye gitmenin insanları daha hastalıklı hale getirdiğini göstermektedir. Bu doğru cevap olabilir çünkü hastaneler, bizi enfekte edebilecek başka hastalarla doludur ve bize zarar verebilecek tehlikeli makineler ve kimyasallar bulunmaktadır. Yine de, bu karşılaştırmanın yüzeysel bir şekilde alınmaması gerektiği kolayca anlaşılabilir: hastaneye giden insanlar muhtemelen başlangıçta daha az sağlıklıdır. Dahası, hastaneye yatıştan sonra bile, tıbbi bakım arayan insanlar ortalama olarak hastaneye yatırılmamış olanlardan daha sağlıklı değildir, ancak muhtemelen başka türlü olacaklarından daha iyi durumdalar.

Bu sorunu daha kesin bir şekilde açıklamak için, hastane tedavisini ikili bir rasgele değişken olarak düşünebiliriz, \(D_i = {0, 1}\). İlgilendiğimiz sonuç, sağlık durumunun bir ölçüsü, \(Y_i\) ile gösterilir. Soru, \(Y_i\)’nin hastane bakımı tarafından etkilenip etkilenmediğidir. Bu soruya cevap bulmak için, hastaneye gitmiş bir kişinin hastaneye gitmeseydi ne olabileceğini ve tam tersini hayal edebileceğimizi varsayıyoruz. Bu nedenle, herhangi bir birey için iki potansiyel sağlık değişkeni vardır: Diğer bir deyişle, \(Y_{0i}\), hastaneye gitmese bile bir bireyin sağlık durumudur, \(Y_{1i}\) ise gitse bile bireyin sağlık durumudur. İlgilendiğimiz, \(Y_{1i}\) ve \(Y_{0i}\) arasındaki farktır ve bu, birey için hastaneye gitmenin nedensel etkisi olarak adlandırılabilir. Bir kişinin tedavi durumunu geriye dönüp değiştirebilseydik, ölçeceğimiz şey budur.

\(Y_{i}\), potansiyel sonuçlar açısından şu şekilde yazılabilir:

\[ Y_i = \left\{ \begin{array}{rcl} Y_{1i} & \mbox{eğer} & D_i = 1 \\ Y_{0i} & \mbox{eğer} & D_i = 0 \end{array}\right. \]

\[ Y_i = Y_{0i} + (Y_{1i} - Y_{0i}) \cdot D_i \]

Bu gösterim, \(Y_{1i} - Y_{0i}\) ’nin bir birey için hastaneye yatırılmanın nedensel etkisidir. Genel olarak, popülasyonda \(Y_{1i}\) ve \(Y_{0i}\)’nin bir dağılımı olması muhtemeldir, bu nedenle tedavi etkisi farklı insanlar için farklı olabilir. Ancak bir kişi için her iki potansiyel sonucu da asla görmediğimiz için hastaneye yatanlar ve yatmayanların ortalama sağlığını karşılaştırarak hastaneye yatmanın etkileri hakkında bilgi edinmeliyiz.

Hastaneye yatış durumuna göre ortalama karşılaştırması, potansiyel sonuçlar hakkında bize bir şeyler anlatır, ancak istediğimiz şeyi tam olarak söylemez. Hastaneye yatanların sağlık durumu üzerine ortalama sağlık durumu karşılaştırması, resmi olarak ortalama nedensel etkiyle ilişkilidir ve aşağıdaki denklemle ifade edilir:

\[ \underbrace{E[Y_i | D_i = 1] - E[Y_i | D_i = 0]}_\text{Ortalama sağlık için gözlenebilen değişim} = \underbrace{E[Y_{1i} | D_i = 1] - E[Y_{0i} | D_i = 1]}_\text{Tedavi edilenlerde ortalama tedavi etkisi} + \underbrace{E[Y_{0i} | D_i = 1] - E[Y_{0i} | D_i = 0]}_\text{Seçim yanlılığı} \]

Bu terim, hastaneye yatanların sağlık durumu \(E[Y_{1i} | D_i = 1]\) ile, hastaneye yatmasalar \(E[Y_{1i} | D_i = 0]\) ne olacağı arasındaki farkı yakalar. Ancak, gözlemlenen sağlık durumu farkı, seçim yanlılığı adı verilen bir terimi de ekler. Bu terim, hastanelik olan ve hastanelik olmayanlar arasındaki ortalama \(Y_{0i}\) farkını temsil eder. Hastanelik olanların, hastalanma olasılığı, sağlıklı olanlardan daha yüksek olduğu için hastanelik olan \(Y_{0i}\) değerleri daha kötüdür, bu da seçim yanlılığını bu örnekte negatif yapar. Seçim yanlılığı, pozitif bir tedavi etkisini tamamen maskeleyebilecek kadar büyük (mutlak değerde) olabilir. Çoğu ampirik ekonomik araştırmanın hedefi, seçim yanlılığını aşmak ve dolayısıyla \(D_{i}\) gibi bir değişkenin nedensel etkisi hakkında bir şeyler söylemektir.

Rastgele atama (Random Assignment), seçim yanlılığı sorununu çözer

Rastgele atama, \(D_{i}\)’yi bağımsız hale getirdiği için seçim yanlılığı sorununu çözer. Hastaneye yatırılmanın rastgele atananların üzerindeki etkisi, rastgele seçilen bir hastanın üzerindeki etkisiyle aynıdır. Ancak asıl önemli olan, rastgele atama sayesinde seçim yanlılığının ortadan kalkmasıdır. Bu, randomize deneylerin sorunsuz olduğu anlamına gelmez, ancak ilkesel olarak ampirik araştırmada ortaya çıkan en önemli sorunu çözer.

Başka bir örnek olorak, hormone replacement therapy (HRT) olarak bilinen bir tıbbi müdahalenin değerlendirilmesini ele alalım. Bu, menopoz semptomlarını azaltmak için orta yaşlı kadınlara önerilen bir tıbbi müdahaledir. Hemşirelerin Sağlık Araştırması’ndan elde edilen kanıtlar, HRT kullananların daha iyi sağlık gösterdiğini gösterdi. Buna karşılık, bir randomize deney, HRT’nin az sayıda fayda sağladığını gösterdi. Dahası, randomize deney, gözlemsel verilerde belirgin olmayan ciddi yan etkileri ortaya çıkardı.

İşgücü ekonomisi alanından başka bir örnek, devlet destekli eğitim programlarının değerlendirmesidir. Bu programlar, uzun süre işsiz kalanlar, uyuşturucu bağımlıları ve eski suçlular gibi dezavantajlı gruplara sınıf içi eğitim ve iş başında eğitim kombinasyonu sağlar. Amaç, istihdamı ve kazançları artırmaktır. Katılımcılar ile katılmayanların karşılaştırılmasına dayanan çalışmalar genellikle eğitimden sonra eğitim alanların daha düşük kazanç elde ettiğini gösterir. Bu durumda da, seçim yanlılığı düşük kazanç potansiyeline sahip erkek ve kadınlara hizmet etmek amacıyla devlet destekli eğitim programlarının doğal bir endişe kaynağıdır. Bu nedenle, program katılımcılarının katılımcı olmayanlarla basit karşılaştırmalarının genellikle katılımcıların daha düşük kazanç gösterdiğini göstermesi şaşırtıcı değildir.

STAR deneyi

Buna karşılık, eğitim programlarının randomize değerlendirmelerinden elde edilen kanıtlar çoğunlukla olumlu etkiler gösterir. Randomize deneyler henüz tıpta olduğu kadar sosyal bilimlerde yaygın değildir, ancak giderek daha yaygın hale gelmektedir. Randomize atamanın öneminin hızla arttığı bir alan, eğitim araştırmalarıdır. Eğitim alanından öncü bir randomize çalışma, ilkokulda daha küçük sınıfların etkilerini tahmin etmek için tasarlanan Tennessee STAR deneyidir. İşgücü ekonomistleri, sınıf ortamının özellikleri ile çocukların öğrenimi arasında nedensel bağlantılar kurmaya çalışırlar, bu da “eğitim üretimi” olarak adlandırdığımız bir araştırma alanını oluşturur. Bu terminoloji, okul ortamının maliyeti olan girdileri düşündüğümüzü, okulların ürettiği çıktının ise öğrenci öğrenimi olduğunu yansıtır. Eğitim üretimi araştırmalarında önemli bir soru, maliyetlerine karşılık olarak hangi girdilerin en fazla öğrenmeyi sağladığıdır. Sınıf büyüklüğü, daha fazla öğretmen işe alarak sadece daha küçük sınıfların elde edilebileceği için en pahalı girdilerden biridir. Bu nedenle, daha küçük sınıfların masrafının başarıda bir getirisi olup olmadığını bilmek önemlidir. STAR deneyi, bu soruya cevap vermek için tasarlanmıştır. Geleneksel olmayan verilerden eğitim üretimi üzerine yapılan birçok çalışma, sınıf büyüklüğü ile öğrenci öğrenimi arasında zayıf veya hiçbir bağlantı olmadığını göstermektedir. Bu nedenle, okul sistemleri daha az öğretmen işe alarak maliyet tasarrufu yapabilirler ve başarıda bir azalma olmaz. Ancak, zayıf öğrenciler genellikle bilinçli bir şekilde daha küçük sınıflara gruplandırıldığı için sınıf büyüklüğü ile öğrenci başarısı arasındaki gözlemlenen ilişkiye yüzde yüz güvenilmemelidir. Randomize bir deney, farklı büyüklükteki sınıflara atanmış öğrencilerin aynı özelliklere sahip olduğunu sağlayarak bu sorunu ortadan kaldırır.

Tablo 2.2.1 replikasyonu

STAR deneyinin kitap içindeki tablolarını tekrar üretebilmek için verilerini indirmemiz gerekiyor.

library(sandwich)
library(tidyverse)

Veri seti Kruger (1999) https://economics.mit.edu/people/faculty/josh-angrist/mhe-data-archive ’den indirilebir.

Stata veri setini R’a yüklemek için haven paketini indirmeyi unutmayın.

library(haven)
webstar <- read_dta("C:/Users/hutku/Downloads/webstar.dta")
head(webstar)
## # A tibble: 6 × 53
##   newid ssex    srace   sbirthq sbirthy stark   star1   star2   star3   cltypek 
##   <dbl> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+lb>
## 1 1122  2 [fem… 2 [bla… 3 [3rd… 1979    2 [no]  2 [no]  2 [no]  1 [yes] NA      
## 2 1137  2 [fem… 1 [whi… 1 [1st… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]  1 [sma…
## 3 1143  2 [fem… 2 [bla… 4 [4th… 1979    1 [yes] 1 [yes] 1 [yes] 1 [yes]  1 [sma…
## 4 1160  1 [mal… 1 [whi… 4 [4th… 1979    2 [no]  2 [no]  2 [no]  1 [yes] NA      
## 5 1183  1 [mal… 2 [bla… 1 [1st… 1980    1 [yes] 2 [no]  2 [no]  2 [no]   3 [reg…
## 6 1195  1 [mal… 1 [whi… 3 [3rd… 1979    2 [no]  2 [no]  1 [yes] 1 [yes] NA      
## # ℹ 43 more variables: cltype1 <dbl+lbl>, cltype2 <dbl+lbl>, cltype3 <dbl+lbl>,
## #   schtypek <dbl+lbl>, hdegk <dbl+lbl>, cladk <dbl+lbl>, totexpk <dbl+lbl>,
## #   tracek <dbl+lbl>, treadssk <dbl>, tmathssk <dbl>, sesk <dbl+lbl>,
## #   schtype1 <dbl+lbl>, trace1 <dbl+lbl>, hdeg1 <dbl+lbl>, clad1 <dbl+lbl>,
## #   totexp1 <dbl+lbl>, treadss1 <dbl>, tmathss1 <dbl>, ses1 <dbl+lbl>,
## #   schtype2 <dbl+lbl>, trace2 <dbl+lbl>, hdeg2 <dbl+lbl>, clad2 <dbl+lbl>,
## #   totexp2 <dbl+lbl>, treadss2 <dbl>, tmathss2 <dbl>, ses2 <dbl+lbl>, …

Tablo 2.2.1’i oluşturmak için öncelikle webstar verisetinde bulunan cltypek treadssk (total reading scaled score) değişkenlerine değişikler yapılmalı. cltypek değişkeninin açıklamarı:

value label *cltypek*
1 small class
2 regular class
3 regular + aide class

stark (attend project star class in kindergarten) değişkeni açıklamaları.

value label *stark*
1 yes
2 no
9 missing + aide class

Verisetinin oluşturulması için kaynak kodlara ve verinin diğer değişkenlerinin açıklamalarına başka bir veri seti üzerinden bu link https://www.rdocumentation.org/packages/AER/versions/1.2-9/topics/STAR vasıtasıyla ulaşabilirsiniz.

Tablo 2.2.1

Webstar veri setinin içindeki cltypek, cltype1, cltype2, cltype3 sırasıyla anaokulu, 1. sınıf, 2. sınıf ve 3. sınıf için sınıf tipini gösteren faktörlerden oluşuyor: normal (regular class), küçük (small class) veya yardımcılı normal (regular + aide class). Değişkenlerde boş satır (NA), hiçbir STAR sınıfına katılmadığını gösteriyor.

head(webstar[,c("cltypek", "cltype1", "cltype2", "cltype3")])
## # A tibble: 6 × 4
##   cltypek                   cltype1          cltype2                   cltype3  
##   <dbl+lbl>                 <dbl+lbl>        <dbl+lbl>                 <dbl+lbl>
## 1 NA                        NA               NA                         2 [regu…
## 2  1 [small class]           1 [small class]  1 [small class]           1 [smal…
## 3  1 [small class]           1 [small class]  3 [regular + aide class]  3 [regu…
## 4 NA                        NA               NA                         1 [smal…
## 5  3 [regular + aide class] NA               NA                        NA       
## 6 NA                        NA                2 [regular class]         2 [regu…

Bir sorunumuzda verisetimiz, havenly labelled yani stata veriseti üzerinden R’a yüklenmiş ve açıklamaları ona uygun yazılmış. Olası hatalardan kurtulmak için bu labelları kaldırmamız gerekir. labelled paketi bunu yapmamızı sağlar.

library(labelled)
webstar <- unlabelled(webstar)
webstar <- data.frame(webstar)

Aynı kodu tekrarlarsak faktörlerin açıklamalı yazıldığını göreceksiniz.

head(webstar[,c("cltypek", "cltype1", "cltype2", "cltype3")])
##                cltypek     cltype1              cltype2              cltype3
## 1                 <NA>        <NA>                 <NA>        regular class
## 2          small class small class          small class          small class
## 3          small class small class regular + aide class regular + aide class
## 4                 <NA>        <NA>                 <NA>          small class
## 5 regular + aide class        <NA>                 <NA>                 <NA>
## 6                 <NA>        <NA>        regular class        regular class

Tablo 2.2.1 bize attrition rate oranlarını veriyor. Attrition rate (katılımcı kaybı)’nı ölçebilmek için anaokulu sınıfında bir sınıf tipine kayıtlı olan herhangi bir katılımcının diğer üç sınıfa geçtiğinde herhangi bir sınıf tipinde boş bırakılıp bırakılmadığı sorusuna cevap verebilmemizi gerektiriyor. Bu yüzden attr diye bir değişken hesaplayacağız. Bu değişken veri setine bakıp eğer cltypek sütununda bulunan öğrenci herhangi bir sınıf tipine atanmışsa, diğer üç sınıfta da başka ya da aynı belirli bir sınıf türüne atanıp atanmadığına bakacak ve bu üç sınıftan herhangi birinde bir sınıf tipi atanmamışsa attr evet (TRUE) değilse FALSE olacak şekilde yazılacak. Eğer anaokulunda satır boşsa (NA), bu durumda attr boş bırakılacak.

webstar <- webstar %>%
  mutate(Attrition = if_else(cltypek %in% c('small class', 'regular class', 'regular + aide class'),
                          is.na(cltype1) | is.na(cltype2) | is.na(cltype3),
                          NA))
head(webstar[,c("Attrition", "cltypek", "cltype1", "cltype2", "cltype3")])
##   Attrition              cltypek     cltype1              cltype2
## 1        NA                 <NA>        <NA>                 <NA>
## 2     FALSE          small class small class          small class
## 3     FALSE          small class small class regular + aide class
## 4        NA                 <NA>        <NA>                 <NA>
## 5      TRUE regular + aide class        <NA>                 <NA>
## 6        NA                 <NA>        <NA>        regular class
##                cltype3
## 1        regular class
## 2          small class
## 3 regular + aide class
## 4          small class
## 5                 <NA>
## 6        regular class

Bu değişken ile attrition rate hesaplanabilir. Yapmamız gereken, anaokulunda sınıf tiplerine göre verisetimizi gruplandırmak ve kaç tanesinde TRUE olduğunu hesaplamak ve o gruptaki toplam gözlem sayısını bölmek. Böylece anaokulunda bir sınıf tipine atanmış öğrencilerden yüzde kaçı deney süresince kayboluyor öğrenmiş olabiliriz.

webstar %>%
  group_by(cltypek) %>%
  summarise(Attrition_rate = mean(Attrition, na.rm = TRUE)) %>%
  select(cltypek, Attrition_rate) %>% drop_na() %>%
  pivot_wider(names_from = cltypek, values_from = Attrition_rate)
## # A tibble: 1 × 3
##   `small class` `regular class` `regular + aide class`
##           <dbl>           <dbl>                  <dbl>
## 1         0.487           0.518                  0.528

Tabloda attrition rate dışında, son harfi k, 1, 2 ve 3 sınıf seviyelerine ayrılmış olan, ses (öğrencinin ücretsiz öğle yemeğine hak kazanıp kazanmadığını gösteren faktör, Free Lunch) ve tmathss, treadss (matematik ve okuma için toplam Stanford Achievement Tests sonuçları), ve seviyelere ayrılamayacak olan srace (“white” (beyaz), “black” (Afrikalı-Amerikalı), “asian” (Asyalı), “hispanic” (İspanyol), “am. indian” (Amerikan-Hintli) veya “other” (diğer) düzeyleriyle öğrencinin etnik kökenini gösteren faktör), sbirthy (öğrencinin doğum yılı) gibi değişkenlerle hazırlanmış olan başka satırlar da var.

Bu satırlar Free Lunch (her bir sınıfta ücretsiz öğle yemeği alan öğrencilerin oranı), White/Asian (Sınıfta bulunan beyaz ve asyalı öğrencilerin toplamının oranı), Age in 1985 (Anaokulu sınıf seviyesinde bulunan öğrencilerin 1985 yılındaki yaş ortalamaları), Attrition rate (üçüncü sınıfı tamamlamadan önce takipte kaybedilen oranı), Class size in kindergarten (anaokulu sınıf seviyesinde sınıf sınıf büyüklükleri), Percentile score in kindergarten (üç Stanford Başarı Testindeki ortalama yüzdelik puan)’ları üç farklı sınıf tipine (cltype) göre gösteriyor ve son sütunda üç grubun tamamında değişken ortalamalarının eşitlik F testi için P değerini gösteriyor (P-value for equality across groups).

Tablo için diğer değişkenleri oluşturun.

webstar <- webstar %>%
  mutate(Free_Lunch = case_when(sesk == "free lunch" ~ 1, 
                                sesk == "non-free lunch" ~ 0))
webstar <- webstar %>%
  mutate(White_Asian = case_when(srace == "white" | srace == "asian"  ~ 1, 
                                srace == "black"  | srace == "hispanic" | srace == "am. indian" | srace == "other" ~ 0))
webstar <- webstar %>%
  mutate(Age_in_1985 =  1985 - sbirthy)
webstar <- webstar %>%
  mutate(Average_Test_score_in_k =  (tmathssk + treadssk)/2)
head(webstar[,c("sesk", "Free_Lunch", "srace", "White_Asian", "sbirthy", "Age_in_1985", "tmathssk", "treadssk", "Average_Test_score_in_k")])
##             sesk Free_Lunch srace White_Asian sbirthy Age_in_1985 tmathssk
## 1           <NA>         NA black           0    1979           6       NA
## 2 non-free lunch          0 white           1    1980           5      473
## 3 non-free lunch          0 black           0    1979           6      536
## 4           <NA>         NA white           1    1979           6       NA
## 5     free lunch          1 black           0    1980           5      463
## 6           <NA>         NA white           1    1979           6       NA
##   treadssk Average_Test_score_in_k
## 1       NA                      NA
## 2      447                     460
## 3      450                     493
## 4       NA                      NA
## 5      439                     451
## 6       NA                      NA
A <- webstar %>%
  group_by(cltypek) %>%
  summarise(
    across(
      .cols = c(
        Free_Lunch, White_Asian, 
        Age_in_1985, Attrition, 
        Average_Test_score_in_k
        ),
      .fns = c(
       kindergarten = \(x) mean(x, na.rm = TRUE)
      ))) %>% drop_na() 
A<- as.data.frame(t(A))
names(A) <- A[1,]
A <- A[-1,]
A <- mutate_all(A, function(x) as.numeric(as.character(x)))

Tabloyu daha güzel sunmak içim kableExtra paketini kullanacağız.

library(kableExtra)
A %>% kbl(digits = 2) %>%
  kable_classic_2(full_width = F)
small class regular class regular + aide class
Free_Lunch_kindergarten 0.47 0.48 0.50
White_Asian_kindergarten 0.68 0.68 0.66
Age_in_1985_kindergarten 5.26 5.24 5.24
Attrition_kindergarten 0.49 0.52 0.53
Average_Test_score_in_k_kindergarten 465.97 459.02 459.18

Bu tablo tam değil. Öncelikle son sütun henüz tamamlanmış değil. Tabloda 6 karakteristik karşılaştırılıyor. Tennessee STAR deneyinde tedavi ve kontrol özelliklerinin karşılaştırılması için kullanılan bu 6 özellikten sınıf büyüklüğü bizim elimizde yok. O yüzden sadece 5 özelliği karşılaştırdık. Ortalama test sonuçlarında, 2 testin ortalamalarını karşılaştırabildik. Diğer sonuçlar tablodaki sonuçlarla örtüşüyor.

Son olarak tabloda P değerleride verilmiş. Bu P değerleri one-way ANOVA testi ile bulunabilir. One-way ANOVA testinin hipotezi, gruplar arasındaki ortalamalar aynıdır olarak özetlenebilir. Verilen P değeri ne kadar büyükse bu üç grup ortalamasının istatistiksel olarak o kadar aynı olduğu varsayımını reddetmeyi beceremiyoruz anlamı çıkar.

İlk olarak ortalama test sonuçları için, sınıf tiplerine göre ortalamaları kıyaslayalım. Bunun için bir grafik de çizebiliriz.

K <- webstar %>% drop_na(c(cltypek,Average_Test_score_in_k)) %>% select(cltypek,Average_Test_score_in_k)
ggplot(K, aes(x = cltypek, y = Average_Test_score_in_k, fill = cltypek)) +
    geom_boxplot() +
    theme_classic()

ATS <- aov(Average_Test_score_in_k ~ cltypek, data = K)
summary(ATS)
##               Df  Sum Sq Mean Sq F value  Pr(>F)    
## cltypek        2   57418   28709   21.26 6.3e-10 ***
## Residuals   5783 7808100    1350                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Sınav ortalamaları için, p değeri çok düşük çıktı. Burdan ortalamaların aynı olduğu hipotezini reddetmek için güçlü bir kanıtımız olduğu ortaya çıkar.

Diğer özellikler için ANOVA p değerlerini bulun.

FK <- webstar %>% drop_na(c(cltypek,Free_Lunch)) %>% select(cltypek,Free_Lunch)
FL <- aov(Free_Lunch ~ cltypek, data = FK)
summary(FL)
##               Df Sum Sq Mean Sq F value Pr(>F)  
## cltypek        2    1.2  0.5978   2.394 0.0913 .
## Residuals   6298 1572.5  0.2497                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WAK <- webstar %>% drop_na(c(cltypek,White_Asian)) %>% select(cltypek,White_Asian)
WA <- aov(White_Asian ~ cltypek, data = WAK)
summary(WA)
##               Df Sum Sq Mean Sq F value Pr(>F)
## cltypek        2    0.6  0.3044   1.381  0.251
## Residuals   6319 1393.0  0.2205
A85K <- webstar %>% drop_na(c(cltypek,Age_in_1985))  %>% select(cltypek,Age_in_1985)
A85 <- aov(Age_in_1985 ~ cltypek, data = A85K)
summary(A85)
##               Df Sum Sq Mean Sq F value Pr(>F)
## cltypek        2    0.3  0.1595   0.797  0.451
## Residuals   6314 1263.8  0.2002
ATTK <- webstar %>% drop_na(c(cltypek,Attrition))  %>% select(cltypek,Attrition)
ATT <- aov(Attrition ~ cltypek, data = ATTK)
summary(ATT)
##               Df Sum Sq Mean Sq F value Pr(>F)  
## cltypek        2    1.9  0.9400   3.765 0.0232 *
## Residuals   6322 1578.4  0.2497                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Sonuçlar tabloda olan sonuçlara çok yakın. Ancak işimiz bitmedi bu sonuçları tabloya taşımalıyız.

Bunun için tabloda varolan PR(>F) değerini nasıl çekeceğimizi bilmemiz gerek. ATT ile başlayalım.

unlistATT = unlist(summary(ATT))
names(unlistATT)
##  [1] "Df1"      "Df2"      "Sum Sq1"  "Sum Sq2"  "Mean Sq1" "Mean Sq2"
##  [7] "F value1" "F value2" "Pr(>F)1"  "Pr(>F)2"

Bütün bu değerleri çağırabiliriz, ancak bizim “Pr(>F)1” değerine ihtiyacımız var.

unlistATT["Pr(>F)1"]
##    Pr(>F)1 
## 0.02322203

Bizim tablomuzun adı A’ydı. Hatılayalım.

A
##                                      small class regular class
## Free_Lunch_kindergarten                0.4709302     0.4773663
## White_Asian_kindergarten               0.6829910     0.6751825
## Age_in_1985_kindergarten               5.2556670     5.2392690
## Attrition_kindergarten                 0.4868421     0.5177758
## Average_Test_score_in_k_kindergarten 465.9709000   459.0214000
##                                      regular + aide class
## Free_Lunch_kindergarten                         0.5027003
## White_Asian_kindergarten                        0.6593456
## Age_in_1985_kindergarten                        5.2412560
## Attrition_kindergarten                          0.5284626
## Average_Test_score_in_k_kindergarten          459.1784000

5 satırlı, 3 sütunlu bir dataframemiz olduğunu görüyorsunuz. Atayacağınız değer yeni açacağımız 4. sütun’da olacak ve 4. satıra yazılacak.

A[4,4] <- unlistATT["Pr(>F)1"]
A[,3:4]
##                                      regular + aide class         V4
## Free_Lunch_kindergarten                         0.5027003         NA
## White_Asian_kindergarten                        0.6593456         NA
## Age_in_1985_kindergarten                        5.2412560         NA
## Attrition_kindergarten                          0.5284626 0.02322203
## Average_Test_score_in_k_kindergarten          459.1784000         NA

V4 adıyla bir sütun açıldı, bu sütunun ismini değiştirelim.

colnames(A)[4] <- "P-value for equality across groups"
A
##                                      small class regular class
## Free_Lunch_kindergarten                0.4709302     0.4773663
## White_Asian_kindergarten               0.6829910     0.6751825
## Age_in_1985_kindergarten               5.2556670     5.2392690
## Attrition_kindergarten                 0.4868421     0.5177758
## Average_Test_score_in_k_kindergarten 465.9709000   459.0214000
##                                      regular + aide class
## Free_Lunch_kindergarten                         0.5027003
## White_Asian_kindergarten                        0.6593456
## Age_in_1985_kindergarten                        5.2412560
## Attrition_kindergarten                          0.5284626
## Average_Test_score_in_k_kindergarten          459.1784000
##                                      P-value for equality across groups
## Free_Lunch_kindergarten                                              NA
## White_Asian_kindergarten                                             NA
## Age_in_1985_kindergarten                                             NA
## Attrition_kindergarten                                       0.02322203
## Average_Test_score_in_k_kindergarten                                 NA

Şimdi diğer değerleri bu sütuna aktaralım.

A$`P-value for equality across groups` <- c(unlist(summary(FL))["Pr(>F)1"], unlist(summary(WA))["Pr(>F)1"], unlist(summary(A85))["Pr(>F)1"], unlist(summary(ATT))["Pr(>F)1"], unlist(summary(ATS))["Pr(>F)1"])
A
##                                      small class regular class
## Free_Lunch_kindergarten                0.4709302     0.4773663
## White_Asian_kindergarten               0.6829910     0.6751825
## Age_in_1985_kindergarten               5.2556670     5.2392690
## Attrition_kindergarten                 0.4868421     0.5177758
## Average_Test_score_in_k_kindergarten 465.9709000   459.0214000
##                                      regular + aide class
## Free_Lunch_kindergarten                         0.5027003
## White_Asian_kindergarten                        0.6593456
## Age_in_1985_kindergarten                        5.2412560
## Attrition_kindergarten                          0.5284626
## Average_Test_score_in_k_kindergarten          459.1784000
##                                      P-value for equality across groups
## Free_Lunch_kindergarten                                    9.132441e-02
## White_Asian_kindergarten                                   2.514185e-01
## Age_in_1985_kindergarten                                   4.508386e-01
## Attrition_kindergarten                                     2.322203e-02
## Average_Test_score_in_k_kindergarten                       6.299957e-10

Tablonun son halini kbl ile güzelleştirelim.

A %>% kbl(digits = 2) %>%
  kable_classic_2(full_width = F)
small class regular class regular + aide class P-value for equality across groups
Free_Lunch_kindergarten 0.47 0.48 0.50 0.09
White_Asian_kindergarten 0.68 0.68 0.66 0.25
Age_in_1985_kindergarten 5.26 5.24 5.24 0.45
Attrition_kindergarten 0.49 0.52 0.53 0.02
Average_Test_score_in_k_kindergarten 465.97 459.02 459.18 0.00

Tablomuzu tamamlamış olduk.

Sınıf büyüklüğü, daha fazla öğretmen istihdam edilerek yalnızca daha küçük sınıflara ulaşılabilen en pahalı girdilerden biridir. Bu nedenle, daha küçük sınıfların maliyetinin öğrenci başarısında bir getiri sağlayıp sağlamadığını bilmek önemlidir. STAR deneyi bu soruyu yanıtlamak için yapılmıştır. Deneysel olmayan verileri kullanan birçok eğitim üretimi çalışması, sınıf büyüklüğü ile öğrenci öğrenimi arasında neredeyse hiçbir bağlantı olmadığını göstermektedir. Bu nedenle belki de okul sistemleri, daha az öğretmen istihdam ederek para tasarrufu yapabilirler ve başarıda herhangi bir azalma olmaz. Ancak sınıf büyüklüğü ile öğrenci başarısı arasındaki gözlemlenen ilişki yüzeysel olarak kabul edilmemelidir, çünkü zayıf öğrenciler genellikle bilinçli olarak daha küçük sınıflara gruplandırılır. Rastgele bir deney, farklı büyüklükteki sınıflara atanmış öğrencileri aynı özelliklere sahip olarak karşılaştırarak, elma ile elma karşılaştırması yapmamızı sağlayarak bu sorunu aşar. Tennessee STAR deneyinin sonuçları, daha küçük sınıfların güçlü ve kalıcı bir getirisi olduğunu göstermektedir. Deney, 1985-86 yıllarında bir grup anaokulu öğrencisi için uygulanmıştır. Deney, anaokulu öğrencilerinin üçüncü sınıfa geçtiği dört yıl boyunca devam etmiş ve yaklaşık 11.600 çocuğu içermiştir. Deneyde, öğrenciler üç farklı gruba atanmıştır: 13-17 çocuklu küçük sınıflar, 22-25 çocuklu düzenli sınıflar ve yarı zamanlı bir öğretmen yardımcısı veya tam zamanlı bir öğretmen yardımcısı bulunan düzenli sınıflar. Deneyin özellikle etkileyici ve etkili olduğu için detaylı olarak tanımlanmaya değer olduğunu belirtmek önemlidir. STAR deneyi yaklaşık 12 milyon dolarlık bir maliyete sahip olmuştur. Rastgele atama işlevini sağlamak için, her sınıf seviyesinde en az üç sınıfı olan okullar deneye katılmayı seçebilmiştir. Bir rastgele deney hakkında sormamız gereken ilk soru, rastgele atamanın farklı tedavi grupları arasında öznenin özelliklerini başarıyla dengeleyip dengelemediğidir. Bu değerlendirmek için, genellikle gruplar arasında pretreatment sonuçları veya diğer değişkenleri karşılaştırmak yaygındır. Maalesef, STAR verileri herhangi bir pretreatment test skoru içermez, ancak çocukların ırk ve yaş gibi özelliklerine bakmak mümkündür. Krueger (1999) tarafından yeniden üretilen 2.2.1 Tablosu, bu değişkenlerin ortalamalarını karşılaştırır. Tablodaki öğrenci özellikleri, ücretsiz öğle yemeği durumu, öğrenci ırkı ve öğrenci yaşıdır. Ücretsiz öğle yemeği durumu, yalnızca düşük gelirli çocukların ücretsiz okul yemeği için uygun olduğu için aile gelirinin iyi bir ölçüsüdür. Bu değişkenlerin sınıf tipleri arasındaki farkları küçüktür ve hiçbiri sıfırdan farklı değildir, son sütunda belirtilen p-değerleriyle gösterilir. Bu, rastgele atamanın amaçlandığı gibi çalıştığını gösterir. 2.2.1 Tablosu ayrıca ortalama sınıf büyüklüğü, kayıp oranı ve test skorları gibi bilgileri de sunar. Küçük anaokulu sınıflarında kayıp oranı daha düşüktür. Bu ilkesel olarak bir sorun olabilir. Atanması beklenen küçük sınıflarda sınıf büyüklüğü önemli ölçüde daha düşüktür, bu da deneyin istenen değişkenliği yarattığı anlamına gelir. Eğer düzenli sınıflara atanmış olan çocukların ebeveynlerinin çoğu başarıyla öğretmen ve müdürlere lobici yaparak çocuklarının küçük sınıflara atanmasını sağlamış olsaydı, gruplar arasındaki sınıf büyüklüğü farkı çok daha küçük olurdu. Rastgele atama seçim yanlılığını ortadan kaldırdığı için, tedavi grupları arasındaki sonuç farkı sınıf büyüklüğünün ortalama nedensel etkisini (yarı zamanlı bir yardımcı ile düzenli sınıflara göre) yakalar.

Tablo 2.2.2 replikasyonu

Krueger (1999) tarafından türetilen 2.2.2 Tablosu’nda bildirilen anaokulu öğrencileri için regresyon tahminleri, yaklaşık beş persentil puanlık bir küçük sınıf etkisi gösterir (tablonun diğer satırları, regresyonlardaki kontrol değişkenlerinin katsayılarını gösterir).

Tablo 2.2.1’de olduğu gibi yüzdelik test sonuçlarına ihtiyacımız var.

Tablo 2.2.2’yi üretebilmek için veri setimizi https://www.rdocumentation.org/packages/AER/versions/1.2-9/topics/STAR’de bulunan kaynak kodlarından yardım alarak değiştirmemiz gerekecek.

Yapmamız gereken basitçe, webstar verisetinde, kindergarten, 1. sınıf, 2. sınıf ve 3. sınıf için ayrı ayrı sütunlarda verilen değerleri bir araya getirerek, geniş olan verisetimizi uzun verisetine çevirmek.

Bu sitede olan kodları bizim veri setimize uyarlamak için grade seviyelerini belirleyen unsurlar (k, 1, 2, 3) bütün değişkenlerde aynı olmalı ancak sysid ve schid değişkenleri bu unsurlarla bitmiyor. Örneğin kindergargen için değişken sysid değişkeni sysidk yerine, diğer bütün grade seviyesini gösteren değişkenlerin aksine sysidkn olarak bitiyor. Bu değişkenleri tekrar isimlendirmemiz gerekir.

newname <- c('sysidk', 'sysid1', 'sysid2', 'sysid3', 'schidk', 'schid1', 'schid2', 'schid3')
oldname <- c('sysidkn', 'sysid1n', 'sysid2n', 'sysid3n', 'schidkn', 'schid1n', 'schid2n', 'schid3n')

Bu isim değişikliği sayesinde, geniş veriseti webstar’da ayrı ayrı olan sysid sadece bir sütuna inecek.

webstar <- webstar %>% rename_with(~ newname, all_of(oldname))

sysid ve schid değişkenleri artık n ile bitmiyor, diğer seviye değişkenleri gibi k, 1, 2 veya 3 ile bitiyor. Artık bütün bu 4 sınıf seviyesi için ortak bir kod yazıp herbirini kendi değişkeni altında tek bir sütuna indirebiliriz. Bu değişkenlerin hangileri olduğunu bu kod’dan anlayabilirsiniz.

name <- c("star","cltype", "treadss", "tmathss", "ses", "schtype", "hdeg", "clad", "totexp", "trace", "sysid", "schid")
seviye <- c("k", "1", "2", "3")

Geniş verisetini, uzun verisetine çevirmek için reshape kodunu kullanacağız. Bu yüzden times kısmına seviye değişkenimizi yazıyoruz. Bu şekilde sınıf seviyelerini zaman değişkeni olarak alıp alt alta yazabilir. Bu zaman değişkenin adını da grade olarak verdik. Böylece her bir öğrencinin k’den 3’e kadar devamını alt alta grade değişkeninden gözlemleyebiliriz. varying kod’a name serisine tek tek gidip seviye elementleriyle tek tek yapıştırmasını ve arasında (sep) hiç boşluk bırakmamasını (““) söylüyor. Bu durumda zamana göre değişen değişkenler bu yapıştırarak isimleri bulunan varying değişkenleri oluyor. times’a eşit olan seviye’ye göre de bu değişkenliği alt alta yazmaya başlıyor.

star <- reshape(webstar, idvar = "newid", ids = row.names(webstar),
  times = seviye, timevar = "grade", direction = "long",
  varying = lapply(name, function(x) paste(x, seviye, sep = "")))

Yeni star verisinde grade sütununu factor olarak tekrar isimlendirebilirsiniz. Çünkü değişkenin satırlarında, k, 1, 2, 3 olması faktör yerine numeric ile karıştırılabilir.

star$newid <- factor(star$newid)
star$grade <- factor(star$grade, levels = seviye, labels = c("kindergarten", "1st", "2nd", "3rd"))

Son olarak, NA bulunan satırları yok edelim.

star <- star[complete.cases(star),]
head(star)
##        newid   ssex srace                  sbirthq sbirthy Attrition Free_Lunch
## 1137.k  1137 female white  1st qtr - jan,feb,march    1980     FALSE          0
## 1143.k  1143 female black    4th qtr - oct,nov,dec    1979     FALSE          0
## 1183.k  1183   male black  1st qtr - jan,feb,march    1980      TRUE          1
## 1277.k  1277   male white 2nd qtr - april,may,june    1980     FALSE          0
## 1292.k  1292   male white 2nd qtr - april,may,june    1980     FALSE          1
## 1308.k  1308   male white 2nd qtr - april,may,june    1980     FALSE          1
##        White_Asian Age_in_1985 Average_Test_score_in_k        grade stark
## 1137.k           1           5                   460.0 kindergarten   yes
## 1143.k           0           6                   493.0 kindergarten   yes
## 1183.k           0           5                   451.0 kindergarten   yes
## 1277.k           1           5                   503.5 kindergarten   yes
## 1292.k           1           5                   468.0 kindergarten   yes
## 1308.k           1           5                   442.5 kindergarten   yes
##                     cltypek treadssk tmathssk           sesk        schtypek
## 1137.k          small class      447      473 non-free lunch    rural school
## 1143.k          small class      450      536 non-free lunch suburban school
## 1183.k regular + aide class      439      463     free lunch      inner-city
## 1277.k        regular class      448      559 non-free lunch    rural school
## 1292.k          small class      447      489     free lunch    rural school
## 1308.k        regular class      431      454     free lunch    rural school
##            hdegk        cladk totexpk tracek sysidk schidk
## 1137.k bachelors      level 1       7  white     30     63
## 1143.k bachelors      level 1      21  white     11     20
## 1183.k bachelors probationary       0  white     11     19
## 1277.k bachelors      level 1      16  white     35     69
## 1292.k bachelors      level 1       5  white     41     79
## 1308.k bachelors      level 1       8  white      4      5

2 önemsiz sorunumuz var. Birincisi satır isimlerini id’ye göre göstermeye çalışıyor. İkincisi değişkenler k ile bitiyor, oysaki biliyoruz ki satırlar grade değişkenine göre her 4 sınıf için verilmiş durumda.

rownames(star) <- 1:nrow(star)
head(star)
##   newid   ssex srace                  sbirthq sbirthy Attrition Free_Lunch
## 1  1137 female white  1st qtr - jan,feb,march    1980     FALSE          0
## 2  1143 female black    4th qtr - oct,nov,dec    1979     FALSE          0
## 3  1183   male black  1st qtr - jan,feb,march    1980      TRUE          1
## 4  1277   male white 2nd qtr - april,may,june    1980     FALSE          0
## 5  1292   male white 2nd qtr - april,may,june    1980     FALSE          1
## 6  1308   male white 2nd qtr - april,may,june    1980     FALSE          1
##   White_Asian Age_in_1985 Average_Test_score_in_k        grade stark
## 1           1           5                   460.0 kindergarten   yes
## 2           0           6                   493.0 kindergarten   yes
## 3           0           5                   451.0 kindergarten   yes
## 4           1           5                   503.5 kindergarten   yes
## 5           1           5                   468.0 kindergarten   yes
## 6           1           5                   442.5 kindergarten   yes
##                cltypek treadssk tmathssk           sesk        schtypek
## 1          small class      447      473 non-free lunch    rural school
## 2          small class      450      536 non-free lunch suburban school
## 3 regular + aide class      439      463     free lunch      inner-city
## 4        regular class      448      559 non-free lunch    rural school
## 5          small class      447      489     free lunch    rural school
## 6        regular class      431      454     free lunch    rural school
##       hdegk        cladk totexpk tracek sysidk schidk
## 1 bachelors      level 1       7  white     30     63
## 2 bachelors      level 1      21  white     11     20
## 3 bachelors probationary       0  white     11     19
## 4 bachelors      level 1      16  white     35     69
## 5 bachelors      level 1       5  white     41     79
## 6 bachelors      level 1       8  white      4      5

k harfini 12. satırdan sonra başlayan sütun isimlerinden kaldır.

colnames(star[, 12:ncol(star)])
##  [1] "stark"    "cltypek"  "treadssk" "tmathssk" "sesk"     "schtypek"
##  [7] "hdegk"    "cladk"    "totexpk"  "tracek"   "sysidk"   "schidk"
onm <- c("stark",    "cltypek",  "treadssk", "tmathssk", "sesk", "schtypek", "hdegk", "cladk", "totexpk", "tracek", "sysidk", "schidk")
nnm <- c("star",    "cltype",  "treadss", "tmathss", "ses", "schtype", "hdeg", "clad", "totexp", "trace", "sysid", "schid")
star <- star %>% rename_with(~ nnm, all_of(onm))
kbl(star[1:10, ]) %>%
  kable_styling()
newid ssex srace sbirthq sbirthy Attrition Free_Lunch White_Asian Age_in_1985 Average_Test_score_in_k grade star cltype treadss tmathss ses schtype hdeg clad totexp trace sysid schid
1137 female white 1st qtr - jan,feb,march 1980 FALSE 0 1 5 460.0 kindergarten yes small class 447 473 non-free lunch rural school bachelors level 1 7 white 30 63
1143 female black 4th qtr - oct,nov,dec 1979 FALSE 0 0 6 493.0 kindergarten yes small class 450 536 non-free lunch suburban school bachelors level 1 21 white 11 20
1183 male black 1st qtr - jan,feb,march 1980 TRUE 1 0 5 451.0 kindergarten yes regular + aide class 439 463 free lunch inner-city bachelors probationary 0 white 11 19
1277 male white 2nd qtr - april,may,june 1980 FALSE 0 1 5 503.5 kindergarten yes regular class 448 559 non-free lunch rural school bachelors level 1 16 white 35 69
1292 male white 2nd qtr - april,may,june 1980 FALSE 1 1 5 468.0 kindergarten yes small class 447 489 free lunch rural school bachelors level 1 5 white 41 79
1308 male white 2nd qtr - april,may,june 1980 FALSE 1 1 5 442.5 kindergarten yes regular class 431 454 free lunch rural school bachelors level 1 8 white 4 5
1324 female black 2nd qtr - april,may,june 1980 TRUE 1 0 5 409.0 kindergarten yes regular + aide class 395 423 free lunch inner-city masters level 1 17 white 11 16
1441 female white 1st qtr - jan,feb,march 1980 FALSE 0 1 5 475.5 kindergarten yes regular class 451 500 non-free lunch rural school bachelors apprentice 3 black 24 56
1465 female black 3rd qtr - july,aug,sept 1980 FALSE 0 0 5 458.5 kindergarten yes small class 478 439 non-free lunch rural school bachelors level 1 11 white 8 11
1499 female white 3rd qtr - july,aug,sept 1980 FALSE 0 1 5 491.5 kindergarten yes small class 455 528 non-free lunch rural school bachelors level 1 10 white 32 66

Tablo 2.2.1’den de hatırlayacağınız üzere test skorları 100’de üzerinden verilmişti. Ancak bizim verisetimizde aralıkları çok daha yüksek.

range(star$tmathss)
## [1] 320 774

Bu yüzden test sonuçlarını 0’ile 1 arasında sıralamamız lazım.

Size https://towardsdatascience.com/what-why-and-how-to-read-empirical-cdf-123e2b922480 sitesinde anlatılan ecdf yazısını okumanızı öneriyorum. Kümalif dağılım fonksiyonlarını zaten biliyorsunuz. Örneğin, emprical cdf grafikleri, verisetinizde bir değişkeni en büyükten en küçüğe sıraladığınızda nasıl bir dağılıma sahip olduğunu gösterek grafikler diyebiriz. Benzer birşeyi ntile fonksiyonuyla da gerçekleştirebiliriz. Test sonuçlarını 100 üzerinden gösterecek iki araca sahibiz.

ecdf ve ntile test sonuçlarını oluşturun.

star <- star %>% arrange(cltype)
star <- star %>% group_by(grade) %>% mutate(pctr = ecdf(treadss)(treadss))
star <- star %>% group_by(grade) %>% mutate(pctrntile = ntile(treadss, 100))
star <- star %>% group_by(grade) %>% mutate(pctm = ecdf(tmathss)(tmathss))
star <- star %>% group_by(grade) %>% mutate(pctmntile = ntile(tmathss, 100))
star <- star %>% mutate(apct = ((pctr+pctm)/2)*100)
star <- star %>% mutate(apctile = (pctrntile+pctmntile)/2)

2.2.2 tablosunda ilk sütun ve ikinci sütununun açıklayıcı değişkenlerini oluşturun.

star <- star %>%
    mutate(small = cltype == "small class",
           regularaide  = cltype == "regular + aide class",
           girl  = ssex == "female")

Hem ecdf hem ntile ile oluşturulmuş ortalama percentile skorlarını, small ve regular + aide değişkenleriyle regresyona sokalım. Bunu bütün sınıflar için ayrı ayrı yapmak isterseniz modelleri toplu bir şekilde kaydedebilirsiniz.

msc = star %>% 
    group_by(grade) %>%
    do(model = lm(apct ~ small + regularaide, data = .))
msctile = star %>% 
    group_by(grade) %>%
    do(model = lm(apctile ~ small + regularaide, data = .))

Örneğin msc 4 sınıf için de sonuçları kaydetmiş durumda. msc[[1]] hangi grade seviyelerine sahip olduğumuzu gösteriyor.

msc
## # A tibble: 4 × 2
## # Rowwise: 
##   grade        model 
##   <fct>        <list>
## 1 kindergarten <lm>  
## 2 1st          <lm>  
## 3 2nd          <lm>  
## 4 3rd          <lm>
  1. sütunda ise modeller var. Eğer kindergarten sonuçlarına bakmak isterseniz summary fonksiyonunu kullanabilirsiniz.
summary(msc[[2]][[1]])
## 
## Call:
## lm(formula = apct ~ small + regularaide, data = .)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -54.199 -22.159   0.764  22.313  50.423 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      49.9921     0.6363  78.573  < 2e-16 ***
## smallTRUE         4.9245     0.9283   5.305 1.17e-07 ***
## regularaideTRUE  -0.4155     0.8897  -0.467    0.641    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.85 on 5220 degrees of freedom
## Multiple R-squared:  0.007703,   Adjusted R-squared:  0.007323 
## F-statistic: 20.26 on 2 and 5220 DF,  p-value: 1.715e-09

mctile modelleri içinde aynı şeyi yapabilirsiniz.

summary(msctile[[2]][[1]])
## 
## Call:
## lm(formula = apctile ~ small + regularaide, data = .)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -52.006 -22.506   0.494  22.092  51.075 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      48.9250     0.6377  76.725  < 2e-16 ***
## smallTRUE         4.0813     0.9304   4.387 1.17e-05 ***
## regularaideTRUE   0.4830     0.8917   0.542    0.588    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.91 on 5220 degrees of freedom
## Multiple R-squared:  0.00432,    Adjusted R-squared:  0.003939 
## F-statistic: 11.32 on 2 and 5220 DF,  p-value: 1.237e-05

Tabloda ki ikinci sütun regresyonlara, okul fixed effect etkisini ekliyor.

mscfe = star %>% 
    group_by(grade) %>%
    do(model = lm(apct ~ small + regularaide + factor(schid), data = .))
msctilefe = star %>% 
    group_by(grade) %>%
    do(model = lm(apctile ~ small + regularaide + factor(schid), data = .))

Ancak bu yöntemle summary sonuçları çok fazla schlid katsayısına sahip olur. Bu katsayıları tabloda görmek istemiyoruz bu yüzden estimatr paketini kullanarak, fixed effect opsiyonu olan lm_robust kullanacağız.

library(estimatr)
mscfe1 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apct ~ small + regularaide , fixed_effects = ~ factor(schid),  data = .))
msctilefe1 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apctile ~ small + regularaide , fixed_effects = ~ factor(schid),  data = .))
mscfe1[[2]][[1]]
##                  Estimate Std. Error   t value     Pr(>|t|)  CI Lower CI Upper
## smallTRUE       6.0345947  0.8455836 7.1366034 1.089657e-12  4.376891 7.692298
## regularaideTRUE 0.5367953  0.7866973 0.6823403 4.950545e-01 -1.005466 2.079057
##                   DF
## smallTRUE       5142
## regularaideTRUE 5142
msctilefe1[[2]][[1]]
##                 Estimate Std. Error  t value     Pr(>|t|)   CI Lower CI Upper
## smallTRUE       5.211380  0.8482842 6.143437 8.682990e-10  3.5483824 6.874378
## regularaideTRUE 1.437543  0.7881005 1.824060 6.820097e-02 -0.1074695 2.982555
##                   DF
## smallTRUE       5142
## regularaideTRUE 5142

Üçüncü ve dördüncü sütunlar fe kullanmaya devam ediyor. Biz de lm_robust kullanmaya devam edeceğiz. Üçüncü sütunda White/Asian, Girl ve Free Lunch kontrolleri ekleniyor.

mscfe3 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apct ~ small + regularaide + White_Asian + girl + Free_Lunch , fixed_effects = ~ factor(schid),  data = .))
msctilefe3 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apctile ~ small + regularaide + White_Asian + girl + Free_Lunch  , fixed_effects = ~ factor(schid),  data = .))
mscfe3[[2]][[1]]
##                    Estimate Std. Error     t value     Pr(>|t|)    CI Lower
## smallTRUE         5.9491582  0.8062119   7.3791493 1.847996e-13   4.3686396
## regularaideTRUE   0.7201341  0.7507422   0.9592296 3.374882e-01  -0.7516402
## White_Asian       9.1750135  1.3451721   6.8206986 1.010446e-11   6.5379035
## girlTRUE          4.7716555  0.6281969   7.5957963 3.612440e-14   3.5401222
## Free_Lunch      -13.5900727  0.7678035 -17.6999359 4.254904e-68 -15.0952945
##                   CI Upper   DF
## smallTRUE         7.529677 5139
## regularaideTRUE   2.191908 5139
## White_Asian      11.812123 5139
## girlTRUE          6.003189 5139
## Free_Lunch      -12.084851 5139
msctilefe3[[2]][[1]]
##                   Estimate Std. Error    t value     Pr(>|t|)    CI Lower
## smallTRUE         5.125880  0.8087232   6.338237 2.522591e-10   3.5404377
## regularaideTRUE   1.621177  0.7521578   2.155369 3.117930e-02   0.1466278
## White_Asian       9.217658  1.3434116   6.861380 7.625672e-12   6.5839992
## girlTRUE          4.800243  0.6298701   7.621005 2.978900e-14   3.5654292
## Free_Lunch      -13.604884  0.7682990 -17.707798 3.730241e-68 -15.1110774
##                   CI Upper   DF
## smallTRUE         6.711321 5139
## regularaideTRUE   3.095727 5139
## White_Asian      11.851316 5139
## girlTRUE          6.035056 5139
## Free_Lunch      -12.098691 5139

Sonuçlar birebir aynı olmasa da kabul edilebilecek seviyede.

Dördüncü sütun, White teacher, Teacher experience ve Teacher Master’s degree kontrollerini ekliyor. Veri setine iki yeni dummy eklememiz gerekecek.

star <- star %>%
    mutate(White_teacher = trace == "white",
           t_masters_degree  = hdeg == "masters")
mscfe4 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apct ~ small + regularaide + White_Asian + girl + Free_Lunch + White_teacher + totexp + t_masters_degree, fixed_effects = ~ factor(schid),  data = .))
msctilefe4 = star %>% 
    group_by(grade) %>%
    do(model = lm_robust(apctile ~ small + regularaide + White_Asian + girl + Free_Lunch + White_teacher + totexp + t_masters_degree  , fixed_effects = ~ factor(schid),  data = .))
mscfe4[[2]][[1]]
##                         Estimate Std. Error    t value     Pr(>|t|)    CI Lower
## smallTRUE              5.9091508 0.81084089   7.287682 3.632497e-13   4.3195573
## regularaideTRUE        0.5196433 0.75553826   0.687779 4.916230e-01  -0.9615335
## White_Asian            9.2219414 1.34135895   6.875073 6.934405e-12   6.5923064
## girlTRUE               4.6956663 0.62715909   7.487201 8.233865e-14   3.4661673
## Free_Lunch           -13.5065486 0.76686479 -17.612686 1.831375e-67 -15.0099303
## White_teacherTRUE     -2.2183086 1.31787596  -1.683245 9.238838e-02  -4.8019069
## totexp                 0.2669032 0.06427384   4.152595 3.340571e-05   0.1408991
## t_masters_degreeTRUE  -1.3815810 0.79360323  -1.740896 8.176161e-02  -2.9373814
##                         CI Upper   DF
## smallTRUE              7.4987444 5136
## regularaideTRUE        2.0008202 5136
## White_Asian           11.8515763 5136
## girlTRUE               5.9251652 5136
## Free_Lunch           -12.0031669 5136
## White_teacherTRUE      0.3652897 5136
## totexp                 0.3929073 5136
## t_masters_degreeTRUE   0.1742193 5136
msctilefe4[[2]][[1]]
##                         Estimate Std. Error    t value     Pr(>|t|)
## smallTRUE              5.0864931  0.8135563   6.252171 4.375152e-10
## regularaideTRUE        1.4220116  0.7571555   1.878097 6.042450e-02
## White_Asian            9.2644547  1.3397196   6.915219 5.241854e-12
## girlTRUE               4.7247024  0.6288250   7.513541 6.749585e-14
## Free_Lunch           -13.5218487  0.7673943 -17.620470 1.608563e-67
## White_teacherTRUE     -2.2079579  1.3149501  -1.679119 9.318964e-02
## totexp                 0.2652605  0.0644940   4.112948 3.967444e-05
## t_masters_degreeTRUE  -1.3696630  0.7962109  -1.720226 8.545155e-02
##                          CI Lower    CI Upper   DF
## smallTRUE              3.49157619   6.6814101 5136
## regularaideTRUE       -0.06233578   2.9063590 5136
## White_Asian            6.63803369  11.8908757 5136
## girlTRUE               3.49193749   5.9574673 5136
## Free_Lunch           -15.02626848 -12.0174289 5136
## White_teacherTRUE     -4.78582014   0.3699044 5136
## totexp                 0.13882475   0.3916962 5136
## t_masters_degreeTRUE  -2.93057560   0.1912496 5136

Bütün regresyonları, bütün sınıf seviyeleri için bitirdik. Öncelikle kitap da sonuçları veilen kindergarten için tabloyu hazırlayın.

library(modelsummary)
modelsummary(list(msctile[[2]][[1]],msctilefe1[[2]][[1]], msctilefe3[[2]][[1]], msctilefe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept",  estimate =  "{estimate}{stars}")
 (1)   (2)   (3)   (4)
smallTRUE 4.081*** 5.211*** 5.126*** 5.086***
(0.930) (0.848) (0.809) (0.814)
regularaideTRUE 0.483 1.438+ 1.621* 1.422+
(0.892) (0.788) (0.752) (0.757)
White_Asian 9.218*** 9.264***
(1.343) (1.340)
girlTRUE 4.800*** 4.725***
(0.630) (0.629)
Free_Lunch -13.605*** -13.522***
(0.768) (0.767)
White_teacherTRUE -2.208+
(1.315)
totexp 0.265***
(0.064)
t_masters_degreeTRUE -1.370+
(0.796)
Num.Obs. 5223 5223 5223 5223
R2 0.004 0.251 0.316 0.318
R2 Adj. 0.004 0.239 0.305 0.307
AIC 49221.0 50292.8 50582.7 50600.3
BIC 49247.2 50312.5 50622.0 50659.3
Log.Lik. -24606.502
RMSE 26.90 29.82 30.64 30.67

Tablodaki isimler, 2.2.2 tablosunda bulunan isimlerle uyuşmuyor. İsimleri değiştirebilirsiniz.

cm <- c('smallTRUE'    = 'Small class',
        'regularaideTRUE'    = 'Regular/aide class',
        'White_Asian' = 'White/Asian',
        'girlTRUE'    = 'Girl',
        'Free_Lunch'    = 'Free lunch',
        'White_teacherTRUE' = 'White teacher',
        'totexp'    = 'Teacher experience',
        't_masters_degreeTRUE'    = 'Teacher Master’s degree')
modelsummary(list(msctile[[2]][[1]],msctilefe1[[2]][[1]], msctilefe3[[2]][[1]], msctilefe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm)
 (1)   (2)   (3)   (4)
Small class 4.081 5.211 5.126 5.086
(0.930) (0.848) (0.809) (0.814)
Regular/aide class 0.483 1.438 1.621 1.422
(0.892) (0.788) (0.752) (0.757)
White/Asian 9.218 9.264
(1.343) (1.340)
Girl 4.800 4.725
(0.630) (0.629)
Free lunch -13.605 -13.522
(0.768) (0.767)
White teacher -2.208
(1.315)
Teacher experience 0.265
(0.064)
Teacher Master’s degree -1.370
(0.796)
Num.Obs. 5223 5223 5223 5223
R2 0.004 0.251 0.316 0.318
R2 Adj. 0.004 0.239 0.305 0.307
AIC 49221.0 50292.8 50582.7 50600.3
BIC 49247.2 50312.5 50622.0 50659.3
Log.Lik. -24606.502
RMSE 26.90 29.82 30.64 30.67

Bazı gösterilen istatistik değerlerini kaldırabiliriz.

modelsummary(list(msctile[[2]][[1]],msctilefe1[[2]][[1]], msctilefe3[[2]][[1]], msctilefe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm, gof_map = c("r.squared"))
 (1)   (2)   (3)   (4)
Small class 4.081 5.211 5.126 5.086
(0.930) (0.848) (0.809) (0.814)
Regular/aide class 0.483 1.438 1.621 1.422
(0.892) (0.788) (0.752) (0.757)
White/Asian 9.218 9.264
(1.343) (1.340)
Girl 4.800 4.725
(0.630) (0.629)
Free lunch -13.605 -13.522
(0.768) (0.767)
White teacher -2.208
(1.315)
Teacher experience 0.265
(0.064)
Teacher Master’s degree -1.370
(0.796)
R2 0.004 0.251 0.316 0.318

Tabloya not ekleyin.

modelsummary(list(msctile[[2]][[1]],msctilefe1[[2]][[1]], msctilefe3[[2]][[1]], msctilefe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm, gof_map = c("r.squared"), notes = list('Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir'))
 (1)   (2)   (3)   (4)
Small class 4.081 5.211 5.126 5.086
(0.930) (0.848) (0.809) (0.814)
Regular/aide class 0.483 1.438 1.621 1.422
(0.892) (0.788) (0.752) (0.757)
White/Asian 9.218 9.264
(1.343) (1.340)
Girl 4.800 4.725
(0.630) (0.629)
Free lunch -13.605 -13.522
(0.768) (0.767)
White teacher -2.208
(1.315)
Teacher experience 0.265
(0.064)
Teacher Master’s degree -1.370
(0.796)
R2 0.004 0.251 0.316 0.318
Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir

2.2.1 Tablosunda olan ama bizim tablomuzda olmayan başka bir satır daha var. School fixed effects satırını ekleyelim.

library(tibble)
rows <- tribble(~term,          ~`(1)`,  ~`(2)`, ~`(3)`,  ~`(4)`,
                'School fixed effects', 'No',   'Yes', 'Yes',   'Yes')
attr(rows, 'position') <- c(17)
modelsummary(list(msctile[[2]][[1]],msctilefe1[[2]][[1]], msctilefe3[[2]][[1]], msctilefe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm, gof_map = c("r.squared"), notes = list('Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir'), add_rows = rows)
 (1)   (2)   (3)   (4)
Small class 4.081 5.211 5.126 5.086
(0.930) (0.848) (0.809) (0.814)
Regular/aide class 0.483 1.438 1.621 1.422
(0.892) (0.788) (0.752) (0.757)
White/Asian 9.218 9.264
(1.343) (1.340)
Girl 4.800 4.725
(0.630) (0.629)
Free lunch -13.605 -13.522
(0.768) (0.767)
White teacher -2.208
(1.315)
Teacher experience 0.265
(0.064)
Teacher Master’s degree -1.370
(0.796)
School fixed effects No Yes Yes Yes
R2 0.004 0.251 0.316 0.318
Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir

Diyelim ki kindergarten için ctile’la yaptığımız percentile’i değil, diğeriyle yaptığımız percentile’i kullanmak istiyorusunuz.

modelsummary(list(msc[[2]][[1]],mscfe1[[2]][[1]], mscfe3[[2]][[1]], mscfe4[[2]][[1]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm, gof_map = c("r.squared"), notes = list('Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir'))
 (1)   (2)   (3)   (4)
Small class 4.924 6.035 5.949 5.909
(0.928) (0.846) (0.806) (0.811)
Regular/aide class -0.416 0.537 0.720 0.520
(0.890) (0.787) (0.751) (0.756)
White/Asian 9.175 9.222
(1.345) (1.341)
Girl 4.772 4.696
(0.628) (0.627)
Free lunch -13.590 -13.507
(0.768) (0.767)
White teacher -2.218
(1.318)
Teacher experience 0.267
(0.064)
Teacher Master’s degree -1.382
(0.794)
R2 0.008 0.254 0.318 0.321
Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir

Bu kodla diğer sınıf seviyelerinin tablolarını kurmak da çok kolay. Örneğin msc[[2]][[2]] 1. sınıf, msc[[2]][[3]] 2. sınıf ve msc[[2]][[4]] 3. sınıf sonuçlarını verir.

** 1. sınıf regresyon tablosu**

modelsummary(list(msc[[2]][[2]],mscfe1[[2]][[2]], mscfe3[[2]][[2]], mscfe4[[2]][[2]]), output = "kableExtra", coef_omit = "Intercept", coef_map = cm, gof_map = c("r.squared"), notes = list('Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir'))
 (1)   (2)   (3)   (4)
Small class 7.176 7.595 7.564 7.245
(1.048) (0.928) (0.893) (0.904)
Regular/aide class 3.071 1.631 1.502 1.071
(1.078) (0.952) (0.913) (0.926)
White/Asian 8.248 8.191
(1.618) (1.620)
Girl 3.868 3.907
(0.732) (0.731)
Free lunch -13.413 -13.404
(0.916) (0.917)
White teacher -3.581
(1.394)
Teacher experience 0.036
(0.051)
R2 0.012 0.275 0.331 0.332
Krueger (1999) tablo V uyarlamasıdır. Bağımlı değişken, Stanford Başarı Testi yüzdelik puanıdır. Örnek büyüklüğü 5.681 dir

Tennessee STAR deneyinden elde edilen sonuçlar, daha küçük sınıfların güçlü ve kalıcı bir getirisi olduğunu göstermektedir. STAR deneyi, örnek bir randomize deney olup, lojistik zorlukları, uzun süresi ve yüksek maliyeti de vurgulamaktadır. Birçok durumda bu tür deneyler pratik olmayabilir. Bu nedenle, yapılan araştırmalar daha ucuz ve daha kolay ulaşılabilir değişkenlik kaynaklarını kullanmaya çalışır. Angrist ve Lavy (1999) tarafından yapılan sınıf büyüklüğü üzerine yapılan kısmi deneysel çalışma, gözlemsel verilerin deneysel bir ruhla nasıl analiz edilebileceğini göstermektedir. Angrist ve Lavy çalışması, İsrail’de sınıf büyüklüğünün 40 kişiyle sınırlandığı bir gerçeğe dayanmaktadır. Bu nedenle, 40 öğrencilik bir beşinci sınıf kohortundaki bir çocuk, bir sınıfta 40 öğrenciye sahip olurken, 41 öğrencilik bir beşinci sınıf kohortundaki bir çocuk, kohortun bölünmesi nedeniyle yalnızca yarısı kadar küçük bir sınıfa girer. 40 ve 41 öğrenciye sahip kohortlardaki öğrencilerin yetenek ve aile geçmişi gibi diğer boyutlarda benzer olmaları muhtemeldir, bu nedenle 40 ve 41 öğrenci arasındaki farkı “gerçekten rastgele atanmış gibi” düşünebiliriz. Angrist-Lavy çalışması, daha büyük ve daha küçük sınıflara kaydolanlar arasında yapılan basit karşılaştırmalara dayanan saf analizlere karşı keskin bir sınıf büyüklüğü değişikliğinin etkilerini iyi kontrol edilmiş tahminlerle oluşturmuştur (Bu çalışmanın replikasyonlarına 6. bölüm Regression Discontinuity Tasarımları dersinde geri döneceğiz). Tennessee STAR çalışması gibi, Angrist ve Lavy (1999) sonuçları da daha küçük sınıf öğrenci başarısı üzerinde olumlu etkilere sahip olduğunu göstermektedir. Daha küçük sınıf büyüklüğünün etkisi öğrenci-öğretmen etkileşimlerindeki iyileşme, daha fazla bireysel dikkat ve öğrenme ortamında daha fazla odaklanmayla açıklanmıştır. Daha küçük sınıfların genellikle daha sessiz ve disiplinli olduğu, öğretmenlere daha fazla zaman ve enerji harcama imkanı tanıdığı ve daha fazla öğrenci katılımını teşvik ettiği düşünülmektedir.