HAFTA 01
Hafta 1 · R ile tanışma
Kaynak: pr01. Familiarisation (3).r; 1, 2, 3, 5, 6, 7, 8 ve 9. başlıklar. Kaynak dosya numaralandırmasında 4. başlık yoktur.
Hesap makinesi
R önce parantezi hesaplar; sonuçlar sırasıyla 7 ve 8’dir. * çarpma, + toplama işlemidir. Satırı seçip Ctrl+Enter (Mac: Cmd+Enter) ile Console’a gönder.
6 + 1
2 * (1 + 3)
Nesneye atama
isim <- değer biçiminde sağdaki sonuç hesaplanıp soldaki isme kaydedilir. x 55’tir; x / 10 5.5 verir. Atama sonucu bir nesne oluşturur; ekranda görmek için adını ayrı çalıştırabilirsin.
x <- 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
x
x / 10
Metin, sayı ve vektör
Tırnaklar character (metin) değeri belirtir; sayı için tırnak gerekmez. c(...) değerleri sırayla bir vektörde birleştirir. İsimler büyük/küçük harfe duyarlıdır: score ve Score farklıdır. Boşluk yerine _ kullan ve isme rakamla başlama.
student_label <- "Example"
score <- 12
values <- c(4, 7, 9)
student_label
score
values
Veri çerçevesi
USArrests, R ile gelen örnek veri kümesidir; crime adıyla tabloya atanır. head() ilk satırları, names() sütun adlarını ve str() yapıyı gösterir. RStudio Environment panelindeki nesne adına da tıklayabilirsin. Sütunlar Murder, Assault, UrbanPop ve Rape’tir; bunlar veri kümesinin değişken adlarıdır.
crime <- USArrests
head(crime)
names(crime)
str(crime)
Fonksiyonlar ve yardım
fonksiyon(girdi) yazımında fonksiyon adı işlem, parantez içi ise girdidir. max(values) vektördeki en büyük değeri 9 olarak bulur. ?max yardım sayfasını açar; konsoldaki ... yer tutucusu çözüm kodu değildir.
max(values)
?max
Fonksiyonun parçaları ve eksik değer
mean(demo, na.rm = TRUE) ifadesinde mean fonksiyon adı, demo ilk girdi, na.rm = TRUE ise adı belirtilmiş bir ayardır. Virgül girdileri ayırır; parantezler bunları fonksiyona verir. İlk ortalama NA, eksikler çıkarılarak hesaplanan ikinci ortalama 3 olur. na.rm kullanmadan önce eksikliğin nedenini ve kaç değer çıkarıldığını incele.
demo <- c(2, 4, NA)
mean(demo)
mean(demo, na.rm = TRUE)
Sütun seçimi ve en büyük değer
tablo$sütun tek bir sütunu seçer. crime$Murder bir sayı vektörü döndürür; max(...) bunun en büyük değerini bulur. İki max çağrısı sırasıyla Murder ve Assault sütunlarını ayrı değerlendirir. Bir sütunda eksik değer varsa max(crime$Murder, na.rm = TRUE) eksikleri çıkarır; önce neden eksik olduklarını araştır.
crime$Murder
max(crime$Murder)
max(crime$Assault)
Ön izleme ve temizleme
head(crime) varsayılan olarak ilk altı satırı gösterir. rm(crime) yalnızca çalışma oturumundaki crime nesnesini kaldırır; R’nin USArrests veri kümesini silmez. Tekrar kullanmak için crime <- USArrests çalıştır.
head(crime)
rm(crime)
Hafta rotasına dön →
HAFTA 02
Hafta 2 · Veri düzenleme
Kaynak: pr02. Data Wrangling.r, Part A 1–3 ve Part B; ayrıca code-book.pdf s. 4–5. Örnek veriler kurmacadır.
A1–A2 · Hazırlık ve dosya okuma
Practical 02, Part A, 1–2. RStudio’da script ve CSV dosyalarını aynı klasöre koyup Session → Set Working Directory → To Source File Location seçebilirsin. getwd() mevcut klasörü gösterir. read.csv("dosya.csv") dosyayı okur; pinfo <- ... sonucu nesneye kaydeder. Yorum satırlarının başındaki # işaretini yalnızca kendi izinli dosyaların hazır olduğunda kaldır. library(tidyverse) her yeni oturumda paketi yükler; kurulu değilse önce bir kez install.packages("tidyverse") çalıştır.
library(tidyverse)
getwd()
# pinfo <- read.csv("participant-info.csv")
# responses <- read.csv("ahi-cesd.csv")
A3 · İki anahtarla birleştirme
Part A, 3. Bunlar gerçek kişilere ait olmayan kurgusal tablolardır. Kendi verilerini okuduysan bu bloktaki iki data.frame() atamasını çalıştırma: aynı adlı nesnelerin üzerine yazar. Rehber örneği için bu iki tabloyu kullan. inner_join(x, y, by = c("id", "intervention")) iki sütunu birlikte anahtar alır ve yalnız eşleşen satırları tutar. Bir kişide birden çok ölçüm olabilir; birleşim sonrası satır sayısı kişi sayısına eşit olmak zorunda değildir. Anahtarların türünü, eşleşmeyen ve yinelenen kayıtları kontrol et.
pinfo <- data.frame(id = c(1, 2, 3), intervention = c(1, 2, 1),
sex = c(1, 2, 1), age = c(20, 22, 21),
educ = c(2, 3, 2), income = c(1, 2, 2))
responses <- data.frame(id = c(1, 1, 2, 3), intervention = c(1, 1, 2, 1),
occasion = c(0, 1, 0, 1),
ahiTotal = c(50, 55, 65, 60), cesdTotal = c(20, 18, 12, NA))
all_data <- inner_join(pinfo, responses, by = c("id", "intervention"))
all_data
B1 · Sütunları seç
Part B, select. select(veri, sütunlar) yalnız istenen sütunları alır. %>% soldaki tabloyu bir sonraki fonksiyonun ilk girdisi yapar. names() sonucu kontrol eder; yeni tablo oluşturmak orijinali değiştirmez.
selected_vars <- all_data %>%
select(id, intervention, ahiTotal, cesdTotal, sex, age, educ, income, occasion)
names(selected_vars)
B2–B3 · Zamanı süz ve sırala
Part B, filter ve arrange. %in% c(0, 1) iki koddan birine eşit satırları tutar; == eşitlik karşılaştırmasıdır. arrange(ahiTotal) artan sıralar. Kaynak uyuşmazlığı: pratik yönergesindeki ön/son 1/2 ipucu, Week 1 code-book.pdf s. 4–5 ile çelişir; sözlükte ön test 0, son test 1, 2 ise takiptir. Gerçek analizde bu farkı öğretmeninle doğrula.
pre_post <- selected_vars %>% filter(occasion %in% c(0, 1))
pre_post_asc <- pre_post %>% arrange(ahiTotal)
pre_post_asc
B2–B3 · VEYA ve azalan sıralama
filter(veri, koşul) koşula uyan satırları seçer; select(veri, sütunlar) ise sütunları seçer. == eşitliği sınar, | VEYA anlamına gelir: 0 veya 1 olan satır kalır. Bu koşul bu örnekte occasion %in% c(0, 1) ile eşdeğerdir. desc(ahiTotal) büyükten küçüğe sıralar; desc() kullanılmazsa sıralama küçükten büyüğedir.
selected_vars %>%
filter(occasion == 0 | occasion == 1) %>%
arrange(desc(ahiTotal))
B4–B5 · Özetler ve gruplar
Part B, summarise ve group_by. group_by(occasion) her zaman noktası için ayrı grup oluşturur; summarise() her grupta satır sayısı ve ortalamaları verir. na.rm = TRUE eksikleri hesaplamadan çıkarır; tüm değerler eksikse örnekte CES-D ortalaması NA kalır. Ön/son gruplar aynı kişiler olmayabileceğinden grup ortalamaları tek başına bireysel değişimi göstermez.
pre_post_asc %>%
group_by(occasion) %>%
summarise(n_rows = n(), n_ahi = sum(!is.na(ahiTotal)),
mean_ahi = mean(ahiTotal, na.rm = TRUE),
mean_cesd = if (all(is.na(cesdTotal))) NA_real_ else mean(cesdTotal, na.rm = TRUE),
.groups = "drop")
B6 · Yeni sütun ve etiket
Part B, mutate ve recode. mutate() yeni sütunlar üretir; factor() sayısal kodları kategori etiketiyle gösterir. Sözlük s. 4’e göre 1=kadın, 2=erkek; bazı pratik ipuçlarında ters verilmiştir. sadness çıkarma işlemi dosyadaki programlama alıştırmasıdır; iki farklı ölçeğin farkına klinik anlam yüklenmez.
pre_post <- pre_post %>%
mutate(sadness = cesdTotal - ahiTotal,
sex_label = factor(sex, levels = c(1, 2), labels = c("Female", "Male")))
pre_post %>% select(id, sadness, sex, sex_label)
Hafta rotasına dön →
HAFTA 03
Hafta 3 · Yanıtları düzenleme ve özetleme
Kaynak: wk3_practical_summarising_data (1).r, Part A Tasks 1–4 ve Parts B–C; AQ.csv, Qformats.csv, Scoring.csv sütun yapısı. Örnek veriler ve puan kuralları kurmacadır.
A1 · Üç kaynak tablo
Practical 03, Part A, Task 1. Kaynakta AQ.csv yanıtları, Qformats.csv her sorunun F/R biçimini, Scoring.csv ise biçim–yanıt–puan eşlemesini içerir. Aşağıdaki üç soru, iki yanıt türü ve puan kuralları tamamen örnektir; gerçek 10 soruluk ölçeğin anahtarı değildir. Yorum satırları kendi dosyalarını okuma biçimini gösterir. Kendi dosyalarını okuduysan aşağıdaki üç data.frame() atamasını çalıştırma; aynı adlı nesneleri değiştirir.
library(tidyverse)
# responses <- read.csv("AQ.csv")
# qformats <- read.csv("Qformats.csv")
# scoring <- read.csv("Scoring.csv")
responses <- data.frame(Id = c(1, 2), Q1 = c("Agree", "Disagree"),
Q2 = c("Disagree", "Agree"), Q3 = c("Agree", "Agree"))
qformats <- data.frame(Question = c("Q1", "Q2", "Q3"), QFormat = c("F", "R", "F"))
scoring <- data.frame(QFormat = c("F", "F", "R", "R"),
Response = c("Agree", "Disagree", "Agree", "Disagree"),
Score = c(1, 0, 0, 1))
A2 · Wide → long
Part A, Task 2. Geniş tabloda her soru bir sütundur. pivot_longer() sütun adlarını Question, hücreleri Response sütununa taşır; Id korunur. İki kişi × üç örnek soru = altı satır. Gerçek dosyada Q1–Q10 sütunları seçildiğini kontrol et.
rlong <- responses %>%
pivot_longer(cols = starts_with("Q"), names_to = "Question", values_to = "Response")
rlong
A3 · İki ayrı eşleştirme
Part A, Task 3. İlk inner_join() soru numarasına göre F/R bilgisini, ikincisi biçim ve yanıt birlikte eşleşince puanı ekler. Eşleşmeyen satırlar iç birleşimde düşer: satır sayılarını karşılaştır ve anti_join() ile eşleşmeyenleri gör. Yazım, boşluk ve anahtar türlerini kontrol et; sözlükte tekrar eden anahtarlar satır çoğaltabilir.
with_format <- inner_join(rlong, qformats, by = "Question")
scored <- inner_join(with_format, scoring, by = c("QFormat", "Response"))
with_format
scored
nrow(rlong); nrow(with_format); nrow(scored)
anti_join(with_format, scoring, by = c("QFormat", "Response"))
A4 ve B · Kişi başına toplam
Part A, Task 4 ve Part B. group_by(Id) kişileri ayırır; summarise() her kişiye bir toplam üretir. Örnekte üç maddenin tamamı varsa toplam hesaplanır. Gerçek on maddelik çalışmada sayıyı 10 olarak doğrulayıp her sorunun yalnız bir kez eşleştiğinden emin ol; yalnız satır sayısı tek başına bu kontrol için yeterli değildir. Pipe, işlemleri okunma sırasına dizer.
aq_scores <- scored %>%
group_by(Id) %>%
summarise(n_items = n(), AQTotal = if (n() == 3 && !any(is.na(Score))) sum(Score) else NA_real_,
.groups = "drop")
aq_scores
C · Betimleme ve histogram
Part C. mean() ortalama, sd() örnek standart sapmasıdır; min ve max aralığın uçlarıdır. Histogramın x ekseni örnekte 0–3’tür; kaynakta on maddelik toplam için 0–10 kullanılır. Kaynak ayrıca 6 üzeri tarama eşiğini sorgular: yalnız doğru gerçek ölçekle değerlendir; üç maddelik örneğe uygulama. Tarama puanı tanı değildir. Yaklaşık %68 kuralı normal dağılım varsayımına bağlıdır; kesikli puanlara otomatik uygulanmaz.
aq_scores %>% summarise(mean_total = mean(AQTotal, na.rm = TRUE),
sd_total = sd(AQTotal, na.rm = TRUE),
min_total = min(AQTotal, na.rm = TRUE),
max_total = max(AQTotal, na.rm = TRUE))
ggplot(aq_scores, aes(x = AQTotal)) +
geom_histogram(binwidth = 1) + theme_classic() +
scale_x_continuous(breaks = 0:3)
# For a valid, complete 10-item score only; not for the fictional example above:
# aq_scores %>% filter(AQTotal > 6)
# aq_scores %>% summarise(n_above_6 = sum(AQTotal > 6, na.rm = TRUE))
Hafta rotasına dön →
HAFTA 04
Hafta 4 · Grafiklerle anlatım
Kaynak: wk4_practical_visualisation.r, kurulum ve Parts 1–2; Lecture 4. Visualising data - notes.pdf s. 1–3. Örnek veriler kurmacadır.
Kurulum ve veri
Week 4, setup. Dosyanın iç başlığı yanlışlıkla Practical 03 dese de içeriği grafiklerdir. Yönerge Week 1–2’deki participant-info.csv ve ahi-cesd.csv dosyalarını okuyup birleştirir; bu sayfa gerçek veriler yerine kurmaca tablo kullanır. Klasördeki atsq_scores.csv ve p_info.csv, bu yönergede istenen AHI/CES-D çiftinin yerine geçmez. factor() kategori etiketler; cinsiyet için sözlükteki 1=kadın, 2=erkek kodlarını kontrol et.
library(tidyverse)
all_data <- data.frame(id = c(1, 1, 2, 2, 3, 3),
occasion = c(0, 1, 0, 1, 0, 1), intervention = c(1, 1, 2, 2, 1, 1),
sex = c(1, 1, 2, 2, 1, 1),
ahiTotal = c(50, 56, 65, 63, 60, 68), cesdTotal = c(20, 18, 12, 14, 16, 11))
all_data <- all_data %>% mutate(sex_label = factor(sex, levels = c(1, 2),
labels = c("Female", "Male")))
1 · Histogram
Part 1, histogram. ggplot(veri, aes(x = değişken)) veriyi ve x eşlemesini tanımlar; + katman ekler. geom_histogram() sayısal değerlerin aralıklar içindeki sıklığını çizer; binwidth aralık genişliğidir. 5 yerine 1 deneyip şeklin nasıl değiştiğine bak. Lecture 4 s. 2, dağılım için histogram seçimini açıklar.
ggplot(all_data, aes(x = ahiTotal)) +
geom_histogram(binwidth = 5, boundary = 0, colour = "white") +
labs(x = "Example AHI total", y = "Count")
2 · Saçılım ve renk
Part 1, scatterplot. Her nokta bir ölçümü, x ve y iki puanı gösterir; colour kategoriyi renkle eşler. Ölçümler aynı kişiye ait tekrarlar içerebilir. İlişkinin yönünü ve olağan dışı noktaları incele; korelasyon tek başına nedensellik değildir. Lecture 4 s. 3 iki sayısal değişken için saçılım grafiğini ele alır.
ggplot(all_data, aes(x = ahiTotal, y = cesdTotal, colour = sex_label)) +
geom_point(size = 3, alpha = 0.7) +
labs(x = "Example AHI total", y = "Example CES-D total", colour = "Sex")
3–4 · Boxplot ve violin
Part 1, boxplot ve violin. factor(occasion) zamanları kategorik x eksenine çevirir. Violin dağılımın düzgünleştirilmiş biçimini, kutu ortanca ve çeyrekleri, noktalar gözlemleri gösterir. Lecture 4 s. 3’te boxplot için M/SD ifadesi yer alır; standart boxplot doğrudan ortalama ± SD çizmez. Küçük örneklemin violin biçimi güvenilir değildir.
ggplot(all_data, aes(x = factor(occasion), y = ahiTotal)) +
geom_violin(fill = "#91e2d5", alpha = 0.4) +
geom_boxplot(width = 0.2, outlier.shape = NA) +
geom_point(position = position_jitter(width = 0.06), alpha = 0.7) +
labs(x = "Occasion", y = "Example AHI total")
5 · Ortalama ve gruplanmış çubuk
Part 1, bar plot. İki değişkene göre group_by() her zaman–grup birleşimi için özet üretir. geom_col() hesaplanmış ortalamaların yüksekliklerini çizer; position_dodge() çubukları yan yana koyar. geom_bar() varsayılan olarak satır sayar; hesaplanan y için geom_col() veya geom_bar(stat = "identity") kullanılır. Tek gözlemli grubun SD’si NA olur.
summary_data <- all_data %>%
group_by(occasion, intervention) %>%
summarise(n = n(), mean_ahi = mean(ahiTotal, na.rm = TRUE),
sd_ahi = sd(ahiTotal, na.rm = TRUE), .groups = "drop")
summary_data
ggplot(summary_data, aes(x = factor(occasion), y = mean_ahi, fill = factor(intervention))) +
geom_col(position = position_dodge(width = 0.9)) +
labs(x = "Occasion", y = "Mean AHI", fill = "Intervention")
6 · Çizgi ve standart sapma
Part 1, line graph. group = intervention her grubun noktalarını ayrı bağlar. geom_errorbar() ortalama − SD ile ortalama + SD arasını gösterir; ±1 SD, %95 güven aralığı değildir. Küçük örnekte tek gözlemli grupların SD çubukları çizilmez. coord_cartesian() görünümü sınırlar; gerçek veride karşılaştırma öncesi eksik ve eşleştirilmiş ölçümleri incele.
ggplot(summary_data, aes(x = occasion, y = mean_ahi,
colour = factor(intervention), group = intervention)) +
geom_line() + geom_point() +
geom_errorbar(aes(ymin = mean_ahi - sd_ahi, ymax = mean_ahi + sd_ahi), width = 0.08,
na.rm = TRUE) +
coord_cartesian(ylim = c(24, 120)) +
labs(x = "Occasion", y = "Mean AHI ± 1 SD", colour = "Intervention")
7 · Tema, etiket, panel ve görünüm
Part 2, themes, labels, facet_wrap, size/shape/colour. theme_classic() görsel temayı, labs() başlık ve eksenleri ayarlar; theme_bw() ile karşılaştır. facet_wrap(~ sex_label) kategori başına panel oluşturur. size, shape, alpha sırasıyla boyut, şekil ve saydamlıktır; shape = 17 üçgendir. Lecture 4 s. 1 açık etiket ve ölçek seçiminin önemini vurgular.
ggplot(all_data, aes(x = ahiTotal, y = cesdTotal)) +
geom_point(colour = "purple", size = 4, shape = 17, alpha = 0.3) +
facet_wrap(~ sex_label) + theme_classic() +
labs(x = "Example AHI total", y = "Example CES-D total", title = "Example relationship")
Hafta rotasına dön →