22  Hareketli ortalamalar

Bu sayfa, hareketli ortalamaları hesaplamak ve görselleştirmek için iki yöntemi kapsayacaktır:

  1. slider paketi ile hesaplama
  2. **tidyquant* paketi ile ggplot() komutu içinde hesaplama

22.1 Hazırlık

Paketleri yükleme

Bu kod parçası, analizler için gerekli olan paketlerin yüklenmesini göstermektedir. Bu el kitabında, gerekirse paketi kuran ve kullanım için yükleyen pacman’ın p_load() fonksiyonunu öneriyoruz. Ayrıca, R tabanından library() ile kurulu paketleri yükleyebilirsiniz. R paketleri hakkında daha fazla bilgi için [R temelleri] sayfasına bakın.

pacman::p_load(
  tidyverse,      # verinin yönetimi ve görselleştirilmesi için
  slider,         # hareketli ortalamaları hesaplamak için
  tidyquant       # ggplot içinde hareketli ortalamaları hesaplamak için
)

Verinin içe aktarımı

Simüle edilmiş Ebola salgını vakalarını içeren veri setini içe aktarıyoruz. Takip etmek istiyorsanız, “temiz” satır listesini (.rds dosyası olarak) indirmek için tıklayın. rio paketinden import() fonksiyonu ile verileri içe aktarın (.xlsx, .csv, .rds gibi birçok dosya türünü işler - ayrıntılar için İçe Aktarma ve Dışa Aktarma sayfasına bakın).

# satır listesini içe aktar
linelist <- import("linelist_cleaned.xlsx")

Satır listesinin ilk 50 satırı aşağıda görüntülenir.

22.2 slider ile hesaplama

Grafik haline getirmeden önce bir veri çerçevesinde hareketli ir ortalama hesaplamak için bu yaklaşımı kullanın.

slider paketi, yuvarlanan ortalamaları, kümülatif toplamları, yuvarlanan regresyonları vb. hesaplamak için “kayan pencere” fonksiyonu içerir. Bir veri çerçevesini bir satır vektörü olarak ele alır ve bir veri çerçevesi üzerinde satır bazında yinelemelere izin verir.

Ortak fonksiyonlardan bazıları:

  • slide_dbl() - kayan pencere kullanarak işlem gerçekleştiren sayısal bir sütunu yineler (dolayısıyla “_dbl”)
    • slide_sum() - slide_dbl() için yuvarlanan toplam kısayol fonksiyonu
    • slide_mean() - slide_dbl() için yuvarlanan ortalama kısayol fonksiyonu
  • slide_index_dbl() - pencere ilerlemesini indekslemek için ayrı bir sütun kullanarak; yuvarlanan pencereyi sayısal bir sütuna uygular (bazı tarihler eksikken tarihe göre yuvarlanıyorsa kullanışlıdır)
    • slide_index_sum() - indeksleme ile birlikte yuvarlanan toplam kısayol fonksiyonu
    • slide_index_mean() - indekslemeli yuvarlanan ortalama kısayol fonksiyonu

slider paketi, bu sayfada Kaynaklar bölümünde ele alınan birçok başka fonkisyona da sahiptir. En yaygın olanlara kısaca değineceğiz.

Temel argümanlar

  • Varsayılan ilk argüman olan .x, yinelenecek ve fonksiyonu uygulayacak vektördür.
  • .i = slider fonksiyonların “indeks” versiyonları için - geçişi “indekslemek” için bir sütun oluşturur aşağıdaki bölüme bakın)
  • .f =, varsayılan ikinci argüman;
    • Ortalama gibi parantezsiz yazılmış bir fonksiyon veya
    • Bir fonksiyona dönüştürülecek bir formül. Örneğin ~ .x - ortalama(.x), mevcut değerden pencerenin değerinin ortalamasını hesaplar ve elde edilen sonucu sunar.
  • Daha fazla ayrıntı için bu kaynak materyaline bakın

Pencere büyüklüğü

.before, .after veya her iki argümanı kullanarak pencerenin boyutunu belirtin:

  • .before = - Bir tamsayı verin
  • .after = - Bir tamsayı verin
  • .complete = - Yalnızca eksiksiz pencerelerde hesaplama yapılmasını istiyorsanız bunu DOĞRU olarak ayarlayın

Örneğin, mevcut değeri ve önceki altı değeri içeren 7 günlük bir pencere elde etmek için .before = 6 argümanını kullanın. “Ortalanmış” bir pencere elde etmek için hem .before = hem de .after = için aynı sayıyı sağlayın.

Varsayılan olarak, .complete = FALSE olarak kodlanmıştır, bu nedenle tam satır penceresi mevcut değilse, fonksiyonlar hesaplamayı gerçekleştirmek için mevcut satırları kullanacaktır. Bu argümanı DOĞRU olarak ayarlamak, hesaplamaların yalnızca eksiksiz pencerelerde gerçekleştirilmesini sağlar.

Pencerenin genişletilmesi

Kümülatif işlemleri gerçekleştirmek için, .before = argümanını Inf olarak ayarlayın. Bu argüman, işlemi mevcut değerde ve daha önceki değerlerde yürütecektir.

Tarihe göre yuvarlama

Uygulamalı epidemiyolojide yuvarlanan hesaplamanın en olası kullanım durumu, zaman içinde değişim gösteren bir ölçümün incelenmesidir (Örnek: Günlük vaka sayılarına dayalı olarak vaka insidansının yuvarlanan bir ölçümü)

Her tarih için değer içeren temiz bir zaman serisi veriniz varsa, burada Zaman Serisi ve Salgın Tespiti sayfasında gösterildiği gibi slide_dbl() fonksiyonunu kullanabilirsiniz.

Bununla birlikte, birçok epidemiyoloji uygulamasında, kaydedilen hiçbir olayın gerçekleşmediği, verilerinizde eksik tarihler olabilir. Bu durumlarda, slider fonksiyonların “indeks” sürümlerini kullanmak doğrudur.

İndekslenmiş veri

Aşağıda, vaka satır listesinde slide_index_dbl() fonksiyonunu kullanan bir örnek gösterilmiştir. Diyelim ki hedefimiz 7 günlük bir insidansı hesaplamak (7 günlük bir pencere kullanarak vakaların toplamını göstermek). Yuvarlanan ortalama örneği için, gruplandırılmış yuvarlanma ile ilgili aşağıdaki bölüme bakın.

Başlamak için, dplyr’den count() fonksiyonu ile hesaplandığı gibi, satır listesinde günlük vaka sayılarını göstermek için daily_counts veri kümesi oluşturulur.

# günlük sayımların veri kümesini oluştur
daily_counts <- linelist %>% 
  count(date_hospitalisation, name = "new_cases")

daily_counts veri çerçevesinden nrow(daily_counts) satır elde edilebilir. Günlük vaka sayısında her gün bir satırla temsil edilmektedir, ancak özellikle salgının başlarında bazı günler mevcut değil (o günlerde vaka tespit edilmemiştir).

Standart bir yuvarlanma işlevinin (slide_dbl() gibi) 7 günlük değil 7 satırlık bir pencere kullanacağını bilmek önemlidir. Dolayısıyla, eksik tarihler varsa, bazı pencereler aslında 7 takvim gününden daha fazla uzatılacaktır!

slide_index_dbl() ile “akıllı” bir yuvarlanma penceresi elde edilebilir. “İndeks”, işlevin yuvarlanan pencere için “indeks” olarak alacağı ayrı bir sütun kullandığı anlamına gelir. Pencere sadece veri çerçevesinin satırlarına bağlı değildir.

İndeks sütunu bir tarihse, pencere içeriğini lubridate days() veya month() fonksiyonları ile .before = ve/veya .after = olarak belirtebilirsiniz. Bu durumda fonksiyon, pencerede olmayan günleri sanki oradaymış gibi (NA değerleri olarak) kabul edecektir.

Bir karşılaştırma gösterilirse. Aşağıda, düzenli ve indekslenmiş pencerelerle 7 günlük vaka insidansını hesaplıyoruz.

rolling <- daily_counts %>% 
  mutate(                                # yeni sütunlar oluştur
    # Using slide_dbl()
    ###################
    reg_7day = slide_dbl(
      new_cases,                         # new_cases üzerinde hesapla
      .f = ~sum(.x, na.rm = T),          # fonksiyon, eksik değerler kaldırılmış sum() işlemidir
      .before = 6),                      # pencere mevcut SATIR ve 6 önceki SATIR
    
    # slide_index_dbl() kullanımı
    #########################
    indexed_7day = slide_index_dbl(
        new_cases,                       # new_cases üzerinde hesapla
        .i = date_hospitalisation,       # date_onset ile indekse eklenme 
        .f = ~sum(.x, na.rm = TRUE),     # fonksiyon, eksik değerlerin olmadığı sum() işlevidir
        .before = days(6))               # pencere mevcut GÜN ve 6 önceki GÜN
    )

İlk 7 satır için normal sütunda, satırlar birbirine için 7 günlük aralık içinde olmamasına rağmen istikrarlı artışı gözlemleyin! Komşu “indekslenmiş” sütun, eksik takvim günlerini de hesaba katar, bu nedenle 7 günlük toplamları, vakaların birbirlerinden daha uzak zamanlarda görüldüğü salgın döneminde çok daha düşüktür.

Bu veri, ggplot() fonksiyonu kullanılarak grafik haline getirilebilir.

ggplot(data = rolling)+
  geom_line(mapping = aes(x = date_hospitalisation, y = indexed_7day), size = 1)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

Gruba göre yuvarlanma

slider fonksiyonlarını kullanmadan önce verilerinizi gruplandırırsanız, kayan pencereler grup olarak uygulanacaktır. Satırlarınızı grup bazında istediğiniz sıraya göre düzenlemeye özen gösteriniz.

Her yeni grup başladığında, kayan pencere yeniden başlayacaktır. Bu nedenle, bilinmesi gereken bir ayrıntı vardır. Verileriniz gruplandırılmışsa ve .complete = TRUE olarak ayarladıysanız, gruplar arasındaki her geçişte boş değerler elde edersiniz. Fonksiyon satırlar arasında aşağı doğru hareket ettikçe, gruplandırma sütunundaki her geçiş, hesaplamaya izin vermek için minimum pencere boyutunun oluşturulma sürecini yeniden başlatacaktır.

Verileri gruplandırmayla ilgili ayrıntılar için [Verilerin Gruplandırılması] ile ilgili el kitabı sayfasına bakın.

Aşağıda, listedeki vakaları tarihe ve hastaneye göre sayıyoruz. Daha sonra sıraları artan şekilde, önce hastaneye göre sonra da tarihe göre sıralamaktayız. Sonrasında group_by() fonksiyonunu ayarlıyoruz. Ardından yeni yuvarlanan ortalamamızı oluşturabiliriz.

grouped_roll <- linelist %>%

  count(hospital, date_hospitalisation, name = "new_cases") %>% 

  arrange(hospital, date_hospitalisation) %>%   # satırları hastaneye ve ardından tarihe göre düzenle
  
  group_by(hospital) %>%              # hastaneye göre grupla
    
  mutate(                             # yuvarlanan ortalama  
    mean_7day_hosp = slide_index_dbl(
      .x = new_cases,                 # hastane-gün başına vaka sayısı
      .i = date_hospitalisation,      # giriş tarihi indeksi
      .f = mean,                      # mean() kullanımı                  
      .before = days(6)               # mevcut günü ve önceki 6 günü kullan
      )
  )

İşte yeni veri seti:

Artık ggplot() içinde ~ hastaneyi - hospital facet_wrap() içinde belirterek verileri grup bazında görüntüleyerek hareketli ortalamaları çizebiliriz. Burada iki şekil oluşturuyoruz - günlük vaka sayılarını gösteren bir geom_col() ve 7 günlük hareketli ortalamayı gösteren bir geom_line().

ggplot(data = grouped_roll)+
  geom_col(                       # günlük vaka sayılarını gri çubuklar olarak çiz
    mapping = aes(
      x = date_hospitalisation,
      y = new_cases),
    fill = "grey",
    width = 1)+
  geom_line(                      # hastaneye göre renklendirilen çizgi olarak yuvarlanan ortalama grafiği
    mapping = aes(
      x = date_hospitalisation,
      y = mean_7day_hosp,
      color = hospital),
    size = 1)+
  facet_wrap(~hospital, ncol = 2)+ # hastane başına mini grafikler oluştur
  theme_classic()+                 # arka planı basitleştir  
  theme(legend.position = "none")+ # çizelgeyi (legend) kaldır
  labs(                            # grafik etiketlerini ekle
    title = "7-day rolling average of daily case incidence",
    x = "Date of admission",
    y = "Case incidence")

**TEHLİKE:_** “slide() tsibble 0.9.0’da kullanımdan kaldırılmıştır ve artık geçersizdir” şeklinde bir hata alırsanız, lütfen bunun yerine slider::slide() kullanın. Bu, tsibble paketindeki slide() fonksiyonunun, slider paketindeki slide() fonksiyonunu maskelediği anlamına gelir. Slider::slide_dbl() şekklinde komutunuzda paketi belirterek bu hatayı düzeltin.

22.3 ggplot() içinde tidyquant hesabı

tidyquant paketi, bir ggplot() komutunun içinde hareketli ortalamaları hesaplamak için başka bir yaklaşım sunar.

Satır listesinin altındaki veriler, başlangıç tarihine göre sayılır ve soluk bir çizgi (alpha < 1) olarak çizilir. Üstte, tidyquant paketinden geom_ma() ile oluşturulan, belirtilen renk ve kalınlıkta 7 günlük (n = 7) pencereli bir satır yer alır.

Varsayılan olarak geom_ma() basit hareketli ortalama kullanır (ma_fun = "SMA"), ancak başka türler de belirtilebilir, örneğin:

  • “EMA” - üstel hareketli ortalama (son gözlemlere daha fazla ağırlık verilir)
  • “WMA” - ağırlıklı hareketli ortalama (ağırlık, hareketli ortalamadaki gözlemleri ağırlıklandırmak için kullanılır)
  • Diğerleri fonksiyon belgelerinde bulunabilir
linelist %>% 
  count(date_onset) %>%                 # gün başına vaka sayımı
  drop_na(date_onset) %>%               # başlangıç tarihi eksik vakaları kaldır
  ggplot(aes(x = date_onset, y = n))+   # ggplot’u başlat
    geom_line(                          # ham değerleri çiz
      size = 1,
      alpha = 0.2                       # yarı şeffaf çizgi
      )+             
    tidyquant::geom_ma(                 # hareketli ortalama grafiği çiz
      n = 7,           
      size = 1,
      color = "blue")+ 
  theme_minimal()                       # sade arka plan
Warning: Using the `size` aesthetic in this geom was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` in the `default_aes` field and elsewhere instead.

tidyquant’ta bulunan seçenekler hakkında daha fazla ayrıntı için bu skece bakın.

22.4 Kaynaklar

slider paketi için yararlı çevrimiçi skeç

slider github sayfası

slider skeci

tidyquant skeci

Hafta sonlarını ve tatilleri “atlamanızı” gerekiyorsa, almanac paketini kullabilirsiniz.