ÖĞRENCİ REHBERİ · ÖZGÜN ÖRNEKLER

PALS 1–4 · Adım adım R kod rehberi

Kaynağın yanında açık tutabileceğin, kodu parça parça okuyup uygulayabileceğin bağımsız bir rehber.

Nasıl kullanılır? Kendi RStudio Script dosyana örnekleri sırayla yaz; her bloktan önce sonucu tahmin et ve satırları Ctrl+Enter ile çalıştır. # ile başlayan satırlar açıklamadır, çalıştırılan komut değildir. ... doldurulacak yerdir. Yeni haftaya geçerken ilgili haftanın ilk bloğundan başla. 2–4. haftalar sırayla çalıştırıldığında aynı oturumda tidyverse kullanır.

Dört haftanın R uygulamaları, ilgili CSV sütunları, veri sözlüğü ve görselleştirme ders notları incelendi; ilgili doküman ve bölümler aşağıda belirtiliyor. Özgün dosyalar ve öğrenci verileri yayımlanmaz. Kodlar öğretim amaçlı kurmaca örneklerle yeniden yazılmıştır; resmî UCL cevap anahtarı değildir.

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 →

Kendi veri sözlüğünü kontrol et. Week 1 code-book.pdf s. 4–5, occasion için 0=ön test, 1=son test, 2=bir haftalık takip; sex için 1=kadın, 2=erkek tanımlar. Bazı pratik ipuçları bunlarla çelişiyor. Gerçek veriyi kullanırken kendi codebook’unu ve öğretmeninle farkı yeniden kontrol et. Farklı kişilerin ön/son ortalamaları tek başına bireysel değişimi veya nedensel etkiyi göstermez.

Dört haftalık çalışma rotasına dön →