R Dersleri - Ali Onur Gitmez

Ana Sayfa Ders 1 Ders 2 Ders 3 Ders 4 Ders 5 Ders 6 Ders 7 Ders 8 Ders 9 Ders 10 Ders 11 Ders 12 Ders 13 Ders 14 Ders 15

Inferential Statistics

Çıkarımsal istatistik, örneklem kullanarak popülasyon hakkında çıkarımlar yapmamıza olanak sağlar. İstatistik analizi dediğimiz zaman asıl bahsettiğimiz yöntemler bu grubun altına düşer. Yöntemlere geçmeden önce bazı temel kavramları ve öğreneceğiz.

  • Point estimation, bir popülasyon parametresini tahmin etmek için tek bir değer kullanmamızdır. Mesela bir örneklemin ortalamasını kullanarak genel popülasyonun ortalaması hakkında bir tahmin yaparız.

  • Interval estimation, bir popülasyon parametresini tahmin ederken bu tahmini bir aralık olarak ifade etmemizdir. Bu yöntem, tahminin ne kadar güvenilir olduğunu ve gerçek değerin bu aralıkta olma olasılığını gösterir. Burada önemli bir kavram confidence interval. Confidence interval, bir popülasyon parametresinin (örneğin ortalama) gerçek değerinin, belirli bir güven düzeyine göre, örneklem verilerimizden hesaplanan bir aralıkta yer alma olasılığını temsil eder. Genellikle %95 güven aralığı kullanırız, bu da bu analizi 100 kere tekrarlarsak, elde edeceğimiz güven aralıklarının yaklaşık 95 tanesinin gerçek popülasyon parametresini içereceği anlamına gelir. Bu da confidence level ile significance level ile doğrudan işikilidir.

Bu analizi yaparken kullanacağımız yöntemin genel adı hipotez testi. Örnek olarak Ankara ilçelerinin gelir ortalamasının Türkiye ortalamasından farklı olup olmadığını ölçmek için bu yöntemi kullanırız. Burada bazı kritik kavramlar var.

  • Null Hypothesis: \(H_0\) olarak gösterilir. Bu herhangi bir etki veya fark olmadığını söyler. Hipotez testi yaparken varsayımsal olarak doğru olduğunu kabul ettiğimiz ve verilerle yanlışlamaya çalıştığımız hipotez budur. Ortaya koyduğumuz hipotez buna karşı konuluyor diyebiliriz. Mesela Ankara ilçelerinin ortalama geliri Türkiye ortalamasından farklı değildir’ veya ‘Eğitim, gelir seviyesini artırmaz’ diyebilir. Biz ise çalışmamızda veri ile farkın olduğunu veya etkinin olduğunu göstermeye çalışırız.

  • Alternative Hypohtesis: \(H_1\) veya \(H_a\) olarak gösterilir. Alternatif hipotez, null hipotezin karşıtıdır ve araştırmacının ispatlamaya çalıştığı hipotezdir. İki grup arasında fark var veya X’in Y üzerinde pozitif/negatif etkisi var der.

ÖNEMLİ bir nokta var. Araştırmalarımızda biz doğrudan null hipotez üstünden gideriz. Mesela null hipotezi yanlışmlamayı başardıysak “We can reject the null hypothesis” deriz veya başaramadıysak da “We fail to reject the null hypothesis” deriz.We accept the alternative hypothesis demeyiz, çünkü elimizdeki veri yalnızca null hipotezin doğru olma olasılığını azaltır, ancak alternatif hipotezin kesinlikle doğru olduğunu kanıtlamaz. Sonuçlar alternatif hipotezi destekler gibi görünse de, istatistiksel analizde odak noktamız null hipotezi yanlışlamaktır. Bu nedenle, kullandığımız dile dikkat etmek önemlidir. Verimiz de null hipotezin elimizdeki veri ile gerçek olamayacağını gösteriyor. Bunu birazdan göreceğimiz p-değerini kullanarak yapacağız.

Type-1 error: Null hipotez yani \(H_0\) doğruyken reddettiğimiz durumda gerçekleşir. Yani, gerçekte bir ilişki veya fark yokken, varmış gibi bir sonuca varırsak bu hatayı yapmış oluruz. Bu hata, significance level (önem düzeyi) ile ifade edilir ve genellikle \(\alpha = 0.05\) ve \(\alpha = 0.01\) gibi değerlerle gösterilir. Bu, yanlışlıkla null hipotezi reddetme olasılığını gösterir. p-değeri de bu konuyla yakından ilişkilidir. Mesela COVID testi oluyorsunuz ve test pozitif çıkıyor ancak aslında hasta değilsiniz.

Type-2 error: Null hipotez yani \(H_0\) yanlışken reddedemediğimiz durumda gerçekleşir. Yani, aslında popülasyonlar arasında bir fark veya bir etki varken, yapılan test bu farkı veya etkiyi bulamazsa bu hatayı yapmış oluruz. \(\beta\) ile gösterilir ve testin gücü (power) ile ilişkilidir. Elimizde yeterince veri yoksa gücü de zayıf olacağı için bu hataya düşebiliriz. Mesela COVID testi oluyorsunuz ve test negatif çıkıyor ancak aslında hastasınız.

p-değeri, istatistiksel analizlerde en sık kullanacağımız terimlerden biridir. p-değeri, null hipotezin doğru olduğunu varsayarsak, elimizdeki veri kadar uç veya daha uç bir sonucu elde etme olasılığını gösterir.Genellikle 0.1, 0.05 veya 0.01 gibi significance level (önem düzeyleri) kullanılır; ancak sosyal bilimlerde en çok 0.05 kullanılır. Bu seviyeler, null hipotezi reddetme kararı verirken belirlediğimiz eşik değerlerdir. Bu aynı zamanda bizim güven seviyemizdir. Significance level bulmak için 1-confidence level formülün kullanrız. Yani %5 significance level %95 güven düzeyi karşılığına gelir.

Eğer p-değeri, significance level olarak belirlediğimiz \(\alpha = 0.05\) değerinden düşükse, null hipotezi reddedebiliriz. Bu durumda söylediğimiz şey aslında şu: ‘Eğer arada bir ilişki yoksa (null hipotez doğruysa), bu sonucu elde etme olasılığım %5’in altında.’ Bu nedenle, elimizdeki veriler arada bir ilişki olduğunu gösteriyor olabilir ve bu yüzden null hipotezi reddediyoruz.

Standard Error (SE), istatistiksel analizlerde sıklıkla karşılaşacağımız bir terimdir. SE, bir örneklem istatistiğinin (örneğin, ortalama veya oran) popülasyon parametresinden ne kadar sapabileceğini gösteren bir ölçüdür. Örneklemin standart sapması gibi düşünülebilir; ancak standart hata, örneklem ortalamasının popülasyon ortalamasına olan uzaklığını ifade eder ve örneklem büyüklüğüne bağlı olarak değişir.

Örneklemin standart sapmasının örneklem büyüklüğünün kareköküne bölünmesiyle hesaplanır:

\(SE = \frac{s}{\sqrt(n)}\)

Bu formül, standart hatanın örneklem büyüklüğü arttıkça azaldığını gösterir; yani, daha büyük bir örneklem daha kesin bir tahmin sunar. Bu nedenle, standart hata hesaplaması ve yorumlaması, veri analizinde sonuçların güvenilirliğini ve genellenebilirliğini anlamamıza yardımcı olur.

Basit testler ile konuyu anlamaya girebiliriz. Korelasyon testi bize iki değişken arasındaki ilişkinin gücünü ve yönünü gösterir. Aslında geçen hafta yaptığımız analizin inferential verisyonu. Burada null hipotez iki değişken arasındaki korelasyonun 0 olması. Biz ise alternatif olarak iki değişken arasında korelasyon var diyoruz.

library(tidyverse)
set.seed(123)
data <- data.frame(x = rnorm(100), y = rnorm(100) + 0.5 * rnorm(100))
cor_test_result <- cor.test(data$x, data$y, method = "pearson")
print(cor_test_result)
## 
##  Pearson's product-moment correlation
## 
## data:  data$x and data$y
## t = -0.99696, df = 98, p-value = 0.3212
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.29089413  0.09814862
## sample estimates:
##        cor 
## -0.1002012

Bu sonuçlara baktığımız zaman p değeri 0.32 olarak gözüküyor. Yani iki değişken arasında bir ilişki olmadığı durumda yani null hipotez doğru olduğu durumda bu sonucu bulma ihtimalimiz %32. Bu da çok yüksek bir ihtimal olduğu için null hipotezi reddetmeyi başaramıyoruz. Normalde istatistik testi yapınca eğer böyle bir sonuç buluyorsak yorumlamaya geçmemize gerek yok. Zaten bir ilişki olmadığı için ilişkinin yönü veya gücü bizim için önemli olmuyor. Ancak pratik olarak bakalım. cor değeri bize ilişkinin değerini gösteriyor. İlişki negatif ve 0.1 düzeyinde görünüyor bunu hemen doğruluyalım.

cor(data$x, data$y)
## [1] -0.1002012

Bu da bize aradaki ilişkinin negatif ve zayıf olduğunu gösterir ancak zaten p-değeri 0.05 üstü olduğu için bu bizim için pek de önemli değil. Yine de ileride işe yaraması için, 0 ve 0.1 arası gözardı edilebilecek ilişki, 0.1 ve 0.3 arası zayıf, 0.3 ve 0.5 arası orta, 0.5 ve 0.7 arası güçlü ve 0.7 üstü çok güçlü ilişkiyi belirtir.

t değeri ise bizim test istatistiğimiz. cor değerini kullanarak bu test için hesaplanır. İlişkinin significant olup olmadığını anlamamız için önemlidir ancak sayı olarak tek başına bir anlam ifade etmiyor.

%95 güven aralığımız ise 100 test yaparsak bu aralığın 95 defa gerçek korelasyonu içereceğini belirtiyor. Bu bize korelasyonun kesin buraya düşeceğini değil ancak bu aralık içinde %95 oranda olabileceğini belirtir. Bu örnekte güven aralığı 0 içeriyor. Bu tarz analizlerde bu aralık 0 içeriyorsa p değeri anlamlı çıkmaz. Yani p değerine bakmadan bile veri hakkında yorum yapabiliriz.

Bunun hesaplamasını da şu şekilde yapıyoruz:

r <- cor(data$x, data$y) 
n <- length(data$x)
z <- 0.5 * log((1 + r) / (1 - r))
SE <- 1 / sqrt(n - 3)
z_lower <- z - (1.96 * SE)
z_upper <- z + (1.96 * SE)
r_lower <- (exp(2 * z_lower) - 1) / (exp(2 * z_lower) + 1)
r_upper <- (exp(2 * z_upper) - 1) / (exp(2 * z_upper) + 1)
r_lower
## [1] -0.2908975
r_upper
## [1] 0.09815224

Bunları teker teker anlatacak olursak:

z transformation sadece korelasyonda CI hesaplarken kullanacağımız bir değer olduğu için üstüne çok değinmeye gerek yok ama bunu hesaplamamız için dağılımın normal olması gerekiyor ve korelasyonda dağılım normal olmadığı için bunu kullanıyoruz. Standard error hesaplarken n-3 yapmamız ise hem 2 değişkenimiz hem de 1 korelasyon parametresi ile alakalı. Degreees of freedom konusuna birazdan değineceğim.

%95 güven aralığı için 1.96 kullanılmasının sebebi normal dağılım olduğu zaman verilerin %95’inin \(\pm\) 1.96 standard sapma içine düşmesi.

Yine sondaki işlem korelasyondan dolayı daha karışık duruyor ancak normalde daha basitçe hallidiliyor. Sadece sağlama açısndan nasıl yapıldığını ve genel mantığını göstermek için kullandım.

Degrees of freedomelimizdeki veriler üzerinde ne kadar bağımsız tahmin yapabileceğimizi gösterir. Her bir veri noktası veya tahmin, elimizdeki toplam serbestlikten bir miktarını kullanır ve sonuçta elimizde daha az tahmin alanı kalır. Örneğin, 10 kitabımız var ve bu kitapların ortalama sayfa sayısının 120 olduğunu biliyoruz. Bu durumda toplam sayfa sayısı 1200 olur. Eğer ilk kitabın 90 sayfa olduğunu öğrenirsek, kalan 9 kitap için toplamda 1110 sayfa kalmış demektir. Bu, kalan kitapların sayfa sayısı hakkında daha az esneklik olduğunu gösterir; çünkü artık belirli bir toplamı koruma zorunluluğu vardır.

Yukarıdaki süreç böyle devam ederse, her kitap için sayfa sayısını öğrendikçe, son kitabın kaç sayfa olabileceği konusunda hiç serbestliğimiz kalmaz. Yani, toplamı korumak adına o son kitabın kaç sayfa olduğunu kesin olarak bilmek zorunda kalırız. İstatistiksel terimlerle, bu özgürlük derecelerinin azalması demektir; çünkü her yeni tahmin veya hesap, elimizdeki toplam serbestlikten bir miktarını kullanır.

Özgürlük dereceleri, özellikle standart hata (standard error, SE) hesaplamalarında ve istatistiksel testlerde kritik bir rol oynar. Örneğin, bir korelasyon katsayısının anlamlılığını test ederken, elimizdeki verilerden kaç tanesinin bağımsız bilgi olarak kaldığını belirlemek için özgürlük derecelerini kullanırız. Eğer elimizdeki verilerin özgürlüğünü hesaba katmazsak, standart hatamız (SE) yanlış olur ve bu da test sonuçlarımızın geçerliliğini etkileyebilir. Bu durumda sonuçlarımız ya gereğinden fazla iyimser ya da fazla muhafazakar olabilir.

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = "lm", level = 0.95, color = "blue") +
  labs(title = "Scatter Plot with 95% Confidence Interval",
       x = "Variable X",
       y = "Variable Y") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Kategorik veriler için de basit testler yapmamız mümkün. Chi-square testi bunlar için iyi bir örnek. İki kategorik değişken arasında ilişki olup olmadığını göstermek için kullanırız.

data2 <- matrix(c(50, 30, 20, 10), nrow = 2, byrow = TRUE)
rownames(data2) <- c("Group 1", "Group 2")
colnames(data2) <- c("Outcome A", "Outcome B")
chi_square_result <- chisq.test(data2)
print(chi_square_result)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  data2
## X-squared = 0.033147, df = 1, p-value = 0.8555

Chi square test sonuçları bize iki beklenen ve gözlenen değerler arasındaki farkı gösterir. Beklenen değerler kategoriler ve gruplar arasında ilişki olmadığı durumda beklediğimiz değerleri gösterir. Yani null hipotez doğruyken gözlemleyeceğimiz ilişkiyi gösterir. Değer 0’a yakınsa bu gözlemlenen ve beklenen arasındaki farkın çok olmadığını gösterir. Bu da iki değer arasında güçlü bir ilişki olmadığının göstergesidir.

Bu örnekte hem \(X^2\) düşük hem de p-değeri 0.85. Yani eğer iki değer arasında ilişki olmasadyı böyle veya daha ekstrem bir ilişkiyi bulma ihtimalimiz %85. Bu da istediğimiz 0.05 değerinin çok üstünde. Sonuç olarak da iki değişken arasında ilişki olduğunu söyleyemeyiz. Bir de ters örneğe bakalım.

data3 <- matrix(c(90, 10, 20, 80), nrow = 2, byrow = TRUE)
rownames(data3) <- c("Group 1", "Group 2")
colnames(data3) <- c("Outcome A", "Outcome B")
chi_square_result2 <- chisq.test(data3)
print(chi_square_result2)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  data3
## X-squared = 96.182, df = 1, p-value < 2.2e-16

Burada iki grup farklarını bilerek çok yüksek tuttum. Burada gördüğümz üzere \(X^2\) 96 gibi yüksek bir değer almış ancak bu her türlü değeri alabileceği için bizim için çok bir anlam ifade etmiyor. p-değeri standardize bir karşılaştırma imkanı sunduğu için bizim için daha kullanışlı ve bu örnekte görüldüğü üzere arada bir fark olabileceğini söylüyoruz. Ancak bu farkın gücü hakkında bize bir bilgi vermiyor. Onu ileride öğreneceğimiz farklı yöntemler ile ölçeceğiz.

t-test

t-test istatistik analizlerimizde en temel testlerden birisidir. Genelde iki grubun ortalamalarını karşılaştırmak veya bir grubun ortalamasının popülasyon ortalamasından farklı olup olmadığını görmek için kullanırız. Özellikle psikoloji çalışmalarının temelini oluşturur.

One sample t-test elimizdeki örneklem ortalamasının bildiğimiz veya beklediğimiz popülasyon ortalamasından farklı olup olmadığını görmek için kullanılır. Bu testte verilerin continious olmasını ve normal dağılıma sahip olmasını bekleriz.

Bu örneği inceleyelim:

Bu örnekte 100 öğrencinin sınav notları elimizde olsun. Bu notların ortalamasını genel ülke ortalaması olarak öğrendiğimiz 30 ile karşılaştıralım. Bu test bize öğrenci notlarının ülke ortalamasndan anlamlı olarak farklı olup olmadığını gösterecek.

Bu testin null ve alternarif hipotezleri nedir?

set.seed(123)
one_sample_t <- round(rnorm(100, mean = 32, sd = 5))
t.test(one_sample_t, mu = 30)
## 
##  One Sample t-test
## 
## data:  one_sample_t
## t = 5.4441, df = 99, p-value = 3.789e-07
## alternative hypothesis: true mean is not equal to 30
## 95 percent confidence interval:
##  31.58247 33.39753
## sample estimates:
## mean of x 
##     32.49

Analiz sonuçlarına göre p değeri 0’dan küçük. Yani iki grubun ortalamaları arasında fark yok diyen sıfır hipotezini reddedebiliyoruz. Bu da bize iki grubun arasında istatistiksel olarak anlamlı bir fark olduğunu belirtiyor. Bu farkın yönünün de pozitif olduğunu t değeri ve ortalama değerine bakarak görebiliyoruz. %95 güven aralığı ise 31.58 ve 33.39 değer aralığının 100 test yaptığımız durumda 95 defa bu ortalamayı içereceğini gösteriyor. Burada da p değeri 0.05 altındaydı ve gördüğümüz üzere bu aralık 0 içermiyor.

t_values <- seq(-4, 4, length.out = 100)
t_dist <- dt(t_values, df = 99)

ggplot(data.frame(t_values, t_dist), aes(x = t_values, y = t_dist)) +
  geom_line(color = "blue") +
  geom_vline(xintercept = qt(0.975, df = 99), linetype = "dashed", color = "red") +
  geom_vline(xintercept = qt(0.025, df = 99), linetype = "dashed", color = "red") +
  labs(title = "t-Distribution with Critical Values",
       x = "t-value",
       y = "Density") +
  theme_minimal()

Two sample test ise kendi içinde ikiye ayrılır. Bunlardan ilki iki farklı grubu karşılaştıran independent samples t-test. Mesela iki sınıfın sınav notlarını karşılaştırıyorsak bunu kullanırız. Verilerin continious ve normal dağılıma sahip olmasının yanısıra varyansın eşit olmasını ve iki grubun birbirinden bağımsız olmasını bekleriz. Burada null ve alternatif hipotez nelerdir?

Bir örnekle inceleyelim:

set.seed(123)
group1 <- rnorm(100, mean = 30, sd = 5)
group2 <- rnorm(100, mean = 34, sd = 5)
t.test(group1, group2)
## 
##  Welch Two Sample t-test
## 
## data:  group1 and group2
## t = -4.5274, df = 197.35, p-value = 1.031e-05
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.321431 -1.699042
## sample estimates:
## mean of x mean of y 
##  30.45203  33.46227

Bu testin sonuçları p-değerinin 0.05’ten küçük olduğunu gösteriyor. Yani iki grup arasında anlamlı bir fark var. Test bize bu farkın negatif olduğunu söylüyor. Bunu da t değerin,n negatif yönlü olmasından anlıyoruz. Bunun sebebi de ilk grubu ikinci gruba göre karşılaştırması. İlk grubun ortalaması 30 ikinici de 35 civarında olduğu için negatif değer alıyor. Confidence interval yine 0 içermiyor.

Paired sample ise aynı örneklemin önce ve sonra gibi karşılaştırılmasıdır. Mesela bir sınıfın eğitim öncesi ve sonrası notlarını karşılaıtırıyorsak bunu kullanırız. Verilerin continious ve normal dağılıma sahip olması gerekir. Aynı zamanda iki grup ortak olmalı.

set.seed(123)
before <- round(rnorm(100, mean = 23, sd = 5))
after <- before + round(rnorm(100, mean = 6, sd = 2))
t.test(before, after, paired = TRUE)
## 
##  Paired t-test
## 
## data:  before and after
## t = -29.619, df = 99, p-value < 2.2e-16
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -6.156543 -5.383457
## sample estimates:
## mean difference 
##           -5.77

Sonuçlara baktığımız zaman p değeri yine 0.05’in altında. Bu da bize aralarındaki farklın anlamlı olduğunu gösteriyor. Negatif t değeri de önce ortalamasının sonra ortalamasına göre daha düşük olduğunu gösteriyor. Mean difference kısmında bu farkın ne kadar olduğunu görebiliyoruz. Confidence interval da 0 içermediği için sonuçlarımızı destekliyor.

Şu ana kadar öğrendiğimiz testler varyansların eşit olmadığına varsayımına göre iş yaptı. Bu özellikle iki grubun sample size’ı birbirinden önemli ölçüde farklı olduğu zaman sorun yaratır. Biz de bu gibi durumlarda kullanılan Welch’s test dediğimiz bir yöntemi uyguladık. Bazı istatistikçiler ise hep Welch test yapmayı savunur çünkü daha robust olduğu için errorlerden daha arınmış olduğunu söylerler.

Bu yaptığımız testlerin hespinde null hipotez grup ortalamalarının birbirine eşit olduğu yönündeydi. Bizim alternatif hiptezimiz ise bunların biririnden farklı olduğunu söylüyordu. Bunu söylerken ise bir yön belirtmemiştik. Bu tarz analizlere two-tailed diyoruz. Ancak bazen farkın yönü için beklentilerimiz olabilir. Mesela iki grubun arasında daha az veya daha çok gibi bir beklentimiz varsa bunu kullanabiliriz. Bu bize daha çok tesipt gücü sağlar çünkü two-tailed testlerde 0.05 alt ve üst olmak üzere ikiye bölünür ve 0.025 olarak iki tarafta test edilir.

One tailed testlerde ise null hipotez ya ilişkinin olmadığı ya da beklenen yönün tersi yönünde olduğudur. Alternatif ise beklediğimiz yönde bir fark olduğudur. Örnekle bakalım:

Bu örnekte ilk grup ikinci gruba göre less dedik. Bu fark da anlamlı olduğu için null hipotezi reddetmeyi başardık.

set.seed(123)
before <- round(rnorm(100, mean = 23, sd = 5))
after <- before + round(rnorm(100, mean = 6, sd = 2))
t.test(before, after, paired = TRUE, alternative = "less")
## 
##  Paired t-test
## 
## data:  before and after
## t = -29.619, df = 99, p-value < 2.2e-16
## alternative hypothesis: true mean difference is less than 0
## 95 percent confidence interval:
##       -Inf -5.446541
## sample estimates:
## mean difference 
##           -5.77

Ancak tam tersini yapsaydık bu sefer p değeri 1 yani hiç olamaması gereken bir değer çıkıyor. Bu da beklediğimiz ilişkinin hiç olmadığını gösteriyor. Ancak testi two tailed yaptığımız zaman bile null hipotezi reddetmeyi başarmıştık. Bu da teorik beklentimizin, hipotezimizin ve analiz yöntemimizin sonuç elde etme konsunda ne kadar önemli olduğunu gösteriyor.

set.seed(123)
before <- round(rnorm(100, mean = 23, sd = 5))
after <- before + round(rnorm(100, mean = 6, sd = 2))
t.test(before, after, paired = TRUE, alternative = "greater")
## 
##  Paired t-test
## 
## data:  before and after
## t = -29.619, df = 99, p-value = 1
## alternative hypothesis: true mean difference is greater than 0
## 95 percent confidence interval:
##  -6.093459       Inf
## sample estimates:
## mean difference 
##           -5.77

Şu ana kadar analizlerde hep p değerine odaklandık. Ancak p değeri bize istatistiksel anlamlılığı verir ve bu analizin gücüne göre değişir. Mesela küçük bir fark bile sample size yeterince büyükse anlamlı sonuç verebilir veya tam tersi de gerçekleşebilir. Ayrıca etkinin gücü hakkında da bir şey söylemez. Mesela öğrencilerin 75 aldığı ilk sınavdan sonra eğitim 2 puanlık bir katkı sağlıyorsa bu kağıt üstünde çok önemli bir etki olmayabilir ancak p-değeri istatistiksel olarak anlamlı çıkabilir. Burada istatistiksel olarak anlamlı olsa bile teorik olarak olmayabilir.

Mesela 100 sample ile anlamlı olmayan fark sample size 1000 ounca anlamlı oldu.

set.seed(123)
before <- round(rnorm(100, mean = 75, sd = 12))
after <- before + round(rnorm(100, mean = 2, sd = 20))
t.test(before, after, paired = TRUE)
## 
##  Paired t-test
## 
## data:  before and after
## t = 0.056943, df = 99, p-value = 0.9547
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -3.723031  3.943031
## sample estimates:
## mean difference 
##            0.11
set.seed(123)
before <- round(rnorm(1000, mean = 75, sd = 12))
after <- before + round(rnorm(1000, mean = 2, sd = 20))
t.test(before, after, paired = TRUE)
## 
##  Paired t-test
## 
## data:  before and after
## t = -4.4542, df = 999, p-value = 9.369e-06
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -4.098386 -1.591614
## sample estimates:
## mean difference 
##          -2.845

Bu gibi durumlarda da effect size dediğimiz kavrama başvururuz. Bunun regresyoneda standardize bir karşılığı var ancak t-test yaparken de kullanacağımız bir karşılğı olacak. Buna Cohen’s d deriz.

mean_diff <- mean(after - before)
sd_diff <- sd(after - before)
cohen_d <- mean_diff / sd_diff
cohen_d
## [1] 0.1408549

Sample size 1000 olduğu için null hipotezi reddetmeyi başarmıştık. Ancak effect size kısına baktığımız zaman 0.14 değerini görüyoruz. Burada genel olarak kabul edilen cutoff noktaları

  • Küçük etki için 0.2
  • Orta etki için 0.5
  • Büyük etki için 0.8

Bu örnekte gelen sonuç 0.14 olduğu için güçlü bir etkiden sözedemeyiz. Yani statistically significant olmasına rağmen substantive significance düşük. P-değeri farklı faktörlerden kolayca etkilendiği için birçok dergi uzun zamandır p-değeri istemiyor bile ve effect size gibi faktörlerin belirtilmesini şart koşuyor. Bu da p-hacking dediğimiz br mevzuyu önlemek için.

ANOVA

Açılımı Analysis of Variance. T-test ile benzerdir ancak t-test iki grubu karşılatırmak için uygunken ANOVA’yı üç ve daha fazla grup olduğu zaman kullanırız. Aslında ortalamaları karşılaştırıyoruz ancak varyans dememizin sebebi şu: gruplar arasındakı variation ile grup içi variationı karşılaştırıyor.

One-way ANOVA en temel ANOVA yöntemidir. 3 veya daha fazla grubun ortalamlarının birbirinden ayrılıp ayrılmadığına bakar. Burada null hipotez grupların ortalamarının farklı olmadığıdır. Alternatif hipotez ise en az bir grubun ortalamasının farklı olduğudur. Assumptionları t-test ile aynıdır. Yani, gruplar birbirinden bağımsız olmalı, incelenen değişken gruplar içinde normal dağılmış olmalı ve bu değişkenin varyansları da homojen dağılmalı.

Bir örnekle inceleyelim:

data("PlantGrowth")
anova_result <- aov(weight ~ group, data = PlantGrowth)
summary(anova_result)
##             Df Sum Sq Mean Sq F value Pr(>F)  
## group        2  3.766  1.8832   4.846 0.0159 *
## Residuals   27 10.492  0.3886                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Bu örnekte p-değeri 0.0159 geldi yani bizim beklediğimiz 0.05 seviyesinden daha düşük. Böylece null hipotezi reddedebiliyoruz. Bu da bize gruplar arasında bir fark olduğunu söylüyor.

Normality assumptionı ANOVA için önemliydi. Bunu test etmek için Shapiro Wilk testini kullanabiliriz. Bu testte eğer p değeri 0.05 altındaysa değişken normal DAĞILMIYOR deriz. Yani null hipotez değişkenin normal dağılması. Bunu reddedemezsek bizim için daha iyi. Aynısı varyansın homojen dağılımını test eden Levene test için de geçerli. Burda da p değeri 0.05 üstü olduğu için bu assumption violet edilmiş olmuyor.

library(car)
shapiro.test(residuals(anova_result))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(anova_result)
## W = 0.96607, p-value = 0.4379
leveneTest(weight ~ group, data = PlantGrowth)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  1.1192 0.3412
##       27

Assumption kısmında sorunumuz yok, ANOVA p-değeri de 0.05 altı çıktı. Yani farklar var ama so what? Hangi gruplar arasında fark olduğunu henüz bilmiyoruz. Bunun içinse post-hoc test yapmamız gerekiyor. Burada analize ve veriye göre farklı testler var ama bunlar arasında en popüleri Tukey’s Honest Significant Difference testi. Bu ise grupları karşılaştırıp aralarında fark olup olmadığına bakıyor. Eğer p değeri 0.05 altındaysa da gruplar arasında fark var diyebiliriz.

tukey_result <- TukeyHSD(anova_result)
tukey_result
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = weight ~ group, data = PlantGrowth)
## 
## $group
##             diff        lwr       upr     p adj
## trt1-ctrl -0.371 -1.0622161 0.3202161 0.3908711
## trt2-ctrl  0.494 -0.1972161 1.1852161 0.1979960
## trt2-trt1  0.865  0.1737839 1.5562161 0.0120064

Effect size hesaplamayı da paket ile rahatlıkla yapabiliriz. Burada Cohen’s d değil de \(\eta^2\) kullanırız. Burada ise Cohen’s d ile farklı bir cutoff point kullanırız.

  • 0.01 altı görmezden gelinebilir
  • 0.06 altı küçük
  • 0.14 altı orta
  • 0.14 üstü ise büyük
library(effectsize)
eta_squared(anova_result, partial = FALSE)
## # Effect Size for ANOVA (Type I)
## 
## Parameter | Eta2 |       95% CI
## -------------------------------
## group     | 0.26 | [0.04, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
plot(anova_result, 1)

plot(anova_result, 2)

Two-way ANOVA ise iki kategrik değişkenin bir continious değişken üstündeki etkisini inceler. Aynı zamanda iki kategori arasındaki interaction effect dediğimiz ortak etkiyi de hesaba katar. Mesela gübre ve sulamanın bitki boyutuna olan etkisini inceliyorsak bu yöntemi kullanırız. Böylece hem sulamanın, hem gübrenin hem de ikisinin ortak etkisini inceleyebiliriz. Assumptionları one way ile aynıdır ve buna ek olarak interaction effect için de bu geçerli olmalı.

data("warpbreaks")
model_tw <- aov(breaks ~ wool * tension, data = warpbreaks)
summary(model_tw)
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## wool          1    451   450.7   3.765 0.058213 .  
## tension       2   2034  1017.1   8.498 0.000693 ***
## wool:tension  2   1003   501.4   4.189 0.021044 *  
## Residuals    48   5745   119.7                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Bu sonuçlar bize şunu gösteriyor. Wool controlling for all levels of tension does not have a statistically significant effect on breaks. On the other hand tension, contolling for all levels of wool has a statistically significant effect at 0.001 level.

Burada kontrol etme önemli bir laf. Çünkü amacımız X değişkenin Y değişkenine etkisini Z değişkenini açıklamaması. Ondan dolayı main effect veya independent effect deriz. Amacımız sadece o değişkenin etkisini bulmak. Elbet bu kafamıza göre değiken ekleyip zaten hepsi kendi kısmını açıklasın diyebiliriz anlamına gelmiyor. Regresyon kısmında daha detaylı göreceğiz ancak değişkenlerin ortak noktalara vurmadan farklı varyasyonları açıklaması önemlidir.

Interaction effect ise farklı bir noktaya değiniyor. Wool’un etkisi tension farklı seviyelerine göre değişiyor mu değişmiyor mu ona bakıyor. Bu da wool ve tension değişkenlerinin dependent variable üstünde bağımsız etkilerinden ayrı olarak ortak bir etkisi olduğunu gösteriyor.

interaction.plot(warpbreaks$tension, warpbreaks$wool, warpbreaks$breaks,
                 col = c("red", "blue"), lty = 1:2, legend = TRUE,
                 xlab = "Tension", ylab = "Breaks",
                 main = "Interaction Plot for Wool and Tension")

Bu sonuçlara göre her iki tipte de, tension arttıkça breaklerde azalma olmuş. Ancak bu etki paralel değil. Bunu iki çizginin farklı eğimlerine ve şekillerine bakıp görebiliyoruz. Birbirlerine paralel olmamaları da interaction etkisinin varlığını gösteriyor.

Son göreceğimiz ANOVA ise repeated measures ANOVA. Bu kişiler veya genel olarak subjeler farklı treatmentlara maruz kaldığında veya farklı zamanlarda ölçüldüğünde işe yarar. Bu tip bir analizde wide mı yoksa long format mı daha uygun?

library(ez)
library(tidyverse)
set.seed(123)
subjects <- 20
timepoints <- 3
anova_data <- data.frame(
  subject = rep(1:subjects, each = timepoints),
  timepoint = rep(c("Pre", "Post", "Follow_up"), subjects),
  score = round(rnorm(subjects * timepoints, mean = 70, sd = 10) + 
                rep(rnorm(subjects, mean = 0, sd = 5), each = timepoints) +
                rep(c(0, 5, 7), subjects), 1)
)

Bu test için assumption diğerlerindeki residuaların yani errorlerin normal dağılmış olması ve sphericity dediğimiz, bütün kombinasyonlar arasındaki farkın varyansının eşit olması gerekliliği. Mauchly’s Test ise kontrol edilir. Kullanacağımız pakette bu otomatik yapılır.

anova_result <- ezANOVA(
  data = anova_data,
  dv = score,
  wid = subject,
  within = timepoint,
  detailed = TRUE
)
## Warning: Converting "subject" to factor for ANOVA.
## Warning: Converting "timepoint" to factor for ANOVA.
print(anova_result)
## $ANOVA
##        Effect DFn DFd         SSn      SSd           F            p p<.05
## 1 (Intercept)   1  19 329078.2042 1250.659 4999.352378 1.780020e-24     *
## 2   timepoint   2  38    555.9103 3706.296    2.849825 7.027601e-02      
##         ges
## 1 0.9851604
## 2 0.1008387
## 
## $`Mauchly's Test for Sphericity`
##      Effect         W       p p<.05
## 2 timepoint 0.9546494 0.65856      
## 
## $`Sphericity Corrections`
##      Effect       GGe      p[GG] p[GG]<.05      HFe      p[HF] p[HF]<.05
## 2 timepoint 0.9566169 0.07301187           1.061192 0.07027601

Bu testin sonucunu şu şekilde interpret edebiliriz:

There is no significant effect of “timepoint” on the dependent variable, as indicated by the ANOVA and the sphericity-corrected results.

Mauchly’s test ise p değer 0.05’den büyük. Yani assumpitonlar açısından bir sorun yok demek.

Eğer test sonucumuz significant olsaydı post-hoc test yapacaktık. Normalde şu anda gerek yok ama yine de bakalım.

Post-hoc test olarak baktığımız zamansa doğal olarak 0.05 altında çıkan bir değer yok. Bu da herhangi bir grubun diğerlerinden ayrılmadığını gösteriyor.

pairwise.t.test(anova_data$score, anova_data$timepoint, paired = TRUE, p.adjust.method = "bonferroni")
## 
##  Pairwise comparisons using paired t tests 
## 
## data:  anova_data$score and anova_data$timepoint 
## 
##      Follow_up Post
## Post 0.75      -   
## Pre  0.11      0.62
## 
## P value adjustment method: bonferroni

SON