Okul ortamının maliyeti olan girdiler ve okulların ürettiği çıktının ise öğrenci öğrenimidir.

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.

library(sandwich)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.1     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Stata veri setini R’a yüklemek için haven paketini indirdik Daha sonra haven paketini library fonksiyonu yardımıyla çalıştırdık.

library(haven)

Veri seti Kruger (1999)’den indirilmiştir.

webstar <- read_dta("C:/Users/User1/Downloads/webstar.dta")

Veri setini indirdikten sonra veri setinin ilk 6 satrını görebilmek için head fonksiyonu kullanılmıştır.

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>, …

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…

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.

Veri setinde yer alan NA değişkenleri sorununu çözmek adına aşağıdaki işlemi uygulaya biliriz.

webstar verisetinde bulunan cltypek treadssk (total reading scaled score) değişkenlerine değişikler yapılmalı. cltypek değişkeninin açıklamarı:

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

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

label stark

1 yes 2 no 3 missing + aide class

Daha sonra veri setimize ait değişkenlerin son altı satrını görmek için tail fonksiyonu kullanılmıştır.

tail(webstar)
## # A tibble: 6 × 53
##   newid     ssex       srace     sbirthq sbirthy stark   star1   star2   star3  
##   <dbl+lbl> <dbl+lbl>  <dbl+lbl> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l>
## 1 186634    1 [male]   1 [white] 3 [3rd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 2 186650    1 [male]   1 [white] 3 [3rd… 1979    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 3 186665    2 [female] 1 [white] 3 [3rd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 4 186687    1 [male]   1 [white] 1 [1st… 1980    2 [no]  1 [yes] 1 [yes] 1 [yes]
## 5 186705    2 [female] 2 [black] 1 [1st… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## 6 186718    1 [male]   2 [black] 2 [2nd… 1980    1 [yes] 1 [yes] 1 [yes] 1 [yes]
## # ℹ 44 more variables: cltypek <dbl+lbl>, 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>, …

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 yüklendikten sonra library fonksiyonu yardımıyla çalıştırılır.

library(labelled)
webstar <- unlabelled(webstar)

Daha sonra veritabanımızı oluşturmak için data.frame fonksiyonu kullanabiliriz. Data.frame yapmazsak hata verebilir.

webstar <- data.frame(webstar)

Artık aynı kodu tekrarlarsak faktörlerin açıklamalı yazıldığını görebiliriz.

Daha sonra faktörlerin açıklamalı yazdığını göre bilmemiz için head fonksiyonunu kullanarak tekrardan veri setinin ilk altı fonksiyonunu görebiliriz.

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

Tabloda, 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.

Yukarıda bahsettiğimiz gibi veri setimize yeni değişken eklenmesi gerekmektedir. Bunun için mutate fonksiyonu kullanılmıştır.

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))

Ardından tekrar değişkenlere ait veri setine değişken eklendikten sonraki ilk altı satrını kontrol edebilmek adına head fonksyionu kullanılmıştır.

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.

pivot_wider: Verileri genişletir, sütun sayısını artırır ve satır sayısını azaltır. summarise: Yeni bir veri çerçevesi oluşturur.

summarise aldığımız kısımda atrrition rate yani sınıfın % kaçı sınıfı bırakıyor.

Gruplara ayır. Attritionların ortalamalarını al, NA’ları sayma (attrition rate). True ve False’ları aldık. Daha sonra select diyerek alttakı tablo oluşturulmuştur.

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

Tablo sonuçlarına göre okulu small class’ın %49’i, regular class’ın %52’si ve regular + aide class’ın ise % 53’ü okulu terketmiştir.

Sonuç olarak elde edilen değerlerin anlamlı olup olmadığını anlamak için 0’ a yaklaşıp yaklaşmadığıdır. Dolayısıyla bu gruplar bir birinden farklıdır ve istatistiksel olarak anlamlı olduğunu söyleye biliriz.

Söz konusu değişkenler için tablo oluşturulursa

mutate() fonksiyonu, mevcut değişkenlerin işlevleri olan yeni sütunlar oluşturur. Ayrıca sütunları değiştirebilir (eğer ad mevcut bir sütunla aynıysa) ve silebilir (değerlerini NULL olarak ayarlayarak)

Aşağıdaki işlemde ücretsiz öğle yemeğinden yararlana bilen öğrencileri 1, yararlanamayan öğrenceileri ise 0 ile göstererek yeni sütunlar oluşturuyoruz.

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) gibi değişkenlerle hazırlanmış olan başka satırlar da var.

webstar <- webstar %>%
  mutate(Free_Lunch = case_when(sesk == "free lunch" ~ 1, 
                                sesk == "non-free lunch" ~ 0))

Oluşturulan tabloya 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.

webstar <- webstar %>%
  mutate(White_Asian = case_when(srace == "white" | srace == "asian"  ~ 1, 
                                srace == "black"  | srace == "hispanic" | srace == "am. indian" | srace == "other" ~ 0))

Oluşturulacak olan tabloda 1985 yılından önce doğanlar için de sütun oluşturulmuştur. (Anaokulu sınıf seviyesinde bulunan öğrencilerin 1985 yılındaki yaş ortalamaları)

webstar <- webstar %>%
  mutate(Age_in_1985 =  1985 - sbirthy)

tmathss, treadss (matematik ve okuma için toplam Stanford Achievement Tests sonuçları) eklenmiştir tabloya

webstar <- webstar %>%
  mutate(Average_Test_score_in_k =  (tmathssk + treadssk)/2)

Yukarıdaki işlemleri uyguladıktan sonra değişkenlerin tümünün ilk altı satrını görebilmemiz için head fonksiyonu kullandık.

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 düzenli sunabilmemiz için kableExtra paketini yüklenmiştir.

library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows

Tablo henüz tam değil, 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.

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

Verilen p değerleri one-way ANOVA testi ile bulunabilir. One-way ANOVA testi ya da tek yönlü varyans analizi, bağımsız grupların ortalamaları arasında istatistiksel olarak anlamlı fark olup olmadığının test edilmesinde kullanılan bir araçtır.

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.

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

Elde edilen sonuçlar tablodaki sonuçlara çok yakın. Artık sonuçları tabloya taşıyabiliriz.

Bunun için tabloda varolan PR(>F) değerini nasıl çekeceğimizi bilmemiz gerekiyor.

ATT ile başlayalım. Bunun için aşağıdaki işlem uygulanacaktır.

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. Dolayısıyla aşağıdaki işlemi yaparak sadece “Pr(>F)1” değerini çağıra biliriz.

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

Tablomuzu A olarak isimlendirmiştik.

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 oluşturulmuşrur. Atayacağımız değer yeni açacağımız 4. sütun’da olacak ve 4. satıra yazılacaktır.

Aşağıda uygulayacağımız işlemde artık atayacağımız değerin 4. satır ve 4. sütunda oluşturulduğunu görebiliriz.

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ştirirsek,

sütun ismi ise colnames()fonksiyonu yardımıyla değiştirilmiştir. 4. sütun ismi değiştirileceği için de [4] olarak eklendi.

colnames(A)[4] <- "P-value for equality across groups"

Düzenlemeler yapıldıktan sonra A olarak isimlendirdiğiğimiz tabloyu görebilmemiz için aşağıdaki işlemi uygulayabiliriz.

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 de diğer değerleri sütuna aktarırsak aşağıdaki işlemi ugulayabiliriz.

Uygulanan işlemde değerler A olarak isimlendirdiğimiz tabloya aktatılacağı için A$ şeklinde işleme başlanılmıştır.

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"])

Tekrardan diğer değerleri sütuna aktardıktan sonra A olarak isimlendirilen tabloyu görmek istersek

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

Ardından tablonun son halini görecek olursakta aşağıdaki işlemi uygulayabiliriz.

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

Sonuç olarak: 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.

Tablo 2.2.2 REPLİKASYONU

Krueger (1999) tarafından türetilen bu tabloda 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).

Bu tabloyu üretmek için, diğer tabloda olduğu gibi yüzdelik test sonuçlarına ihtiyacımız olacaktır.

Bu tabloyu üretebilmek için veri setimizi çalışmada bulunan kaynak kodlarındaqn yararlanarak değiştirmemiz gerekir.

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.

Söz konusu kaynakta 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.

Değişkenleri tekrar isimlendirmemiz gerekiyor. Bunun için aşağıdaki işlem uygulanmaktadır.

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.

İşlemde uygulanan lapply fonksiyonu, R’deki uygulama ailesi işlevlerinin bir parçasıdır ve bir liste veya vektör üzerine bir işlevin uygulanmasına ve bir liste döndürmesine olanak tanır.

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 edersek

star <- star[complete.cases(star),]

NA bulunan değişkenlerde yok edildikten sonra artık head fonksiyonu yardımıyla veri setimizin ilk altı satrını görebiliriz. Bunun için aşağıdaki işlem uygulanmaktadır.

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. 1. satır isimlerini id’ye göre göstermeye çalışıyor. 2. 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() fonksiyonu ile bir veri çerçevesinin satırlarına erişilebilir. Yeni satır adlarını sayısal veya dizelerden oluşan bir vektör kullanarak belirleyebilir ve onu tekrar rownames() yöntemine atayabiliriz. Veri çerçevesi daha sonra yeni satır adlarını yansıtacak şekilde değiştirilir.

rownames(star) <- 1:nrow(star)
  1. sorunumuzu çözdükten sonra artık 2.sorunumuz k ile biten değişkenlerin düzeltmemiz gerekiyor. Bunun için

k harfini 12. satırdan sonra başlayan sütun isimlerinden kaldırırsak aşağıdaki işlemi uygulayabiliriz.

İşlemde 12 yazmasının nedeni 12.satırdan sonra başlayan sütun isimlerini kaldırılması anlamına gelmektedir.

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

Çalışmamızda oluşturulan ilk tabloda test skorları 100’de üzerinden verilmişti. Ancak bizim verisetimizde aralıkları çok daha yüksek. Bunun için

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

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

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österen grafikler olduğunu söyleyebiliriz. 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şturursak, bunun için aşağıdaki işlemleri uygulayabiliriz.

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şturursak

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.

Modelleri toplu bir şekilde kaydetmek için aşağıdaki işlemleri uygulatabiliriz.

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>

Tabloda 2.sütunda ise modeller var.

Eğer kindergarten sonuçlarına bakmak istersek summary() fonksiyonunu kullanabiliriz.

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ı işlemi uygulayabiliriz.

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.

estimatr paketini indirdikten sonra library() fonksiyonu ile çalışırtırıyoruz.

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ütuna 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ırlamak için aşağıdaki işlem uygulanmaktadır.

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ştirebiliriz. Bunun için aşağıdaki işlemi uygulayarak isimleri değiştire biliriz.

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. Bunun için

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
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)
library(modelsummary)
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

Sonuç olarak, Tennessee STAR deneyinde 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.