## paketleri CRAN'dan yükle
::p_load(rio, # Dosya içe aktarma
pacman# Dosya bulucu
here, # veri yönetimi + ggplot2 grafikleri
tidyverse, # zaman serisi veri kümelerini işleme
tsibble, # anket işlevleri için
survey, # anket paketi için dplyr sarmalayıcı
srvyr, # tablolar üretmek için anket paketi için sarıcı
gtsummary, # yaş piramitleri oluşturmaya adanmış bir paket
apyramid, # ggplot'ları birleştirmek için
patchwork, # alüvyon/sankey grafikleri için
ggforce
)
## paketleri github'dan yükle
::p_load_gh(
pacman"R4EPI/sitrep" # gözlem süresi / ağırlıklandırma fonksiyonları için
)
26 Anket analizi
26.1 Genel bakış
Bu sayfa, anket analizi için çeşitli paketlerin kullanımını göstermektedir.
Çoğu anket R paketleri, ağırlıklı analiz yapmak için survey paketine güvenir. survey paketinin yanı sıra srvyr (tidyverse-stili kodlamaya izin veren bir survey sarmalayıcısı) ve gtsummary (yayına hazır tablolara izin veren bir survey sarmalayıcısı) kullanacağız. Orijinal survey paketi tidyverse-stili kodlamaya izin vermese de, anket ağırlıklı genelleştirilmiş doğrusal modellere izin verme avantajına sahiptir (bu sayfaya daha sonraki bir tarihte eklenecektir). Örnekleme ağırlıkları oluşturmak için sitrep paketinden bir fonksiyonu kullanmayı da göstereceğiz (n.b , bu paket şu anda CRAN’da değil, ancak github’dan kurulabilir).
Bu sayfanın çoğu “R4Epis” projesi için yapılan çalışmalara dayanmaktadır; ayrıntılı kod ve R-markdown şablonları için “R4Epis” github sayasına bakabilirsiniz. survey paketine ait kodlardan bazıları, EPIET vaka çalışmalarının ilk sürümlerini temel almaktadır.
Şu anda bu sayfa, örneklem büyüklüğü hesaplamalarını veya örneklemeyi ele almamaktadır. Örnek boyutu hesaplayıcıyı kullanmak için basit bir kullanım için OpenEpi’ye bakabilirsiniz. El kitabının GIS temelleri sayfasında eninde sonunda uzamsal rastgele örnekleme üzerine bir bölüm mevcuttur ve bu sayfa sonunda örnekleme çerçeveleri ve örnek boyutu hesaplamaları hakkında bir bölüme sahip olacaktır.
- Anket verisi
- Gözlem süresi
- Ağırlıklandırma
- Anket tasarım nesneleri
- Tanımlayıcı analiz
- Ağırlıklı orantılar
- Ağırlıklı hızlar
26.2 Hazırlık
Paketler
Bu kod parçası, analizler için gereken paketlerin yüklenmesini gösterir. Bu el kitabında, gerekirse paketi kuran ve kullanım için yükleyen pacman paketinden p_load()
fonksiyonunu kullanacağız. Ayrıca R tabanı’dan library()
ile paketleri yükleyebilirsiniz. R paketleri hakkında daha fazla bilgi için [R temelleri] sayfasına bakabilirsiniz.
Burada ayrıca, github’dan henüz CRAN’da yayınlanmayan bir paketi yüklemek için pacman paketinden p_load_gh()
fonksiyonunu kullanmayı gösteriyoruz.
Veri yükleme
Bu bölümde kullanılan örnek veri kümeleri aşağıda listelenmiştir:
- kurgusal ölüm anketi verileri.
- araştırma alanı için kurgusal nüfus sayımları.
- kurgusal ölüm anketi verileri için veri sözlüğü.
Bu, MSF OCA etik inceleme kurulu tarafından önceden onaylanmış ankete dayanmaktadır. Kurgusal veri seti “R4Epis” projesi kapsamında üretilmiştir. Bunların tümü, Open Data Kit’e dayalı bir veri toplama yazılımı olan KoboToolbox kullanılarak toplanan verilere dayanmaktadır.
Kobo, hem toplanan verileri hem de bu veri kümesi için veri sözlüğünü dışa aktarmanıza olanak tanır. Veri temizlemeyi basitleştirdiği ve değişkenleri/soruları aramak için kullanışlı olduğu için bunu yapmanızı şiddetle tavsiye etmekteyiz.
İPUCU: Kobo veri sözlüğünün anket sayfasının “name” sütununda değişken adları vardır. Her değişken için olası değerler, seçenekler sayfasında belirtilmiştir. Seçenekler sekmesinde “name” kısaltılmış değere sahiptir ve “label::english” ve “label::french” sütunları gerekli uzun versiyonlara da sahiptir. Bir Kobo sözlük excel dosyasını içe aktarmak için epidict paketi msf_dict_survey()
fonksiyonunu kullanarak bu adları otomatik olarak yeniden biçimlendirebilirsiniz. Bu sayede kodlarınızı tekrardan kullanma şansınız olur.
DİKKAT: Bu örnek veri kümesi dışa aktarılan formatı ile aynı değildir (Kobo’da farklı anket düzeylerini ayrı ayrı dışa aktardığınız gibi) - farklı düzeyleri birleştirmek için aşağıdaki anket verileri bölümüne bakmalısınız.
Veri kümesi, rio paketinden import()
fonksiyonu kullanılarak içe aktarılır. Verileri içe aktarmanın çeşitli yolları için İçe ve dışa aktarma sayfasına bakın.
# anket verilerini içe aktar
<- rio::import("survey_data.xlsx")
survey_data
# sözlüğü R’ın içine aktar
<- rio::import("survey_dict.xlsx") survey_dict
Anketin ilk 10 satırı aşağıda gösterilmiştir.
Uygun ağırlıklar üretebilmemiz için örneklem popülasyonundaki verileri de içe aktarmak istiyoruz. Bu veriler farklı formatlarda olabilir, ancak aşağıda görüldüğü gibi olmasını öneririz (bu sadece bir excel’e yazılabilir).
# nüfus verilerini içe aktar
<- rio::import("population.xlsx") population
Anketin ilk 10 satırı aşağıda gösterilmiştir.
Küme anketleri için küme düzeyinde anket ağırlıkları eklemek isteyebilirsiniz. Bu verileri yukarıdaki gibi okuyabilirsiniz. Alternatif olarak, yalnızca birkaç sayı varsa, bunlar bir tibble’a aşağıdaki gibi girilebilir. Her durumda, anket verilerinizle eşleşen bir küme tanımlayıcısına sahip bir sütuna ve her bir kümedeki hane sayısını içeren başka bir sütuna ihtiyacınız olacaktır.
## her kümedeki hane sayısını tanımla
<- tibble(cluster = c("village_1", "village_2", "village_3", "village_4",
cluster_counts "village_5", "village_6", "village_7", "village_8",
"village_9", "village_10"),
households = c(700, 400, 600, 500, 300,
800, 700, 400, 500, 500))
Veri temizleme
Aşağıdaki kodlar, tarih sütununun uygun biçimde olmasını sağlar. Bunu yapmanın başka yolları da vardır (ayrıntılar için Tarihlerle çalışma sayfasına bakın), ancak tarihleri tanımlamak için sözlüğü kullanmak hızlı ve kolaydır.
Ayrıca **epikit* paketindeki age_categories()
fonksiyonunu kullanarak bir yaş grubu değişkeni oluşturuyoruz - ayrıntılar için el kitabındaki Verileri temizleme bölümüne bakabilirsiniz. Ek olarak, çeşitli kümelerin hangi bölgede olduğunu tanımlayan bir karakter değişkeni oluşturuyoruz.
Son olarak, tüm evet/hayır değişkenlerini DOĞRU/YANLIŞ değişkenlere yeniden kodlarız - aksi takdirde bunlar survey orantı fonksiyonları tarafından kullanılamaz.
## sözlükten tarih değişkeni adlarını seç
<- survey_dict %>%
DATEVARS filter(type == "date") %>%
filter(name %in% names(survey_data)) %>%
## filter to match the column names of your data
pull(name) # select date vars
## tarihleri değiştir
<- survey_data %>%
survey_data mutate(across(all_of(DATEVARS), as.Date))
## yıl değişkenine yalnızca ay cinsinden yaşı olanları ekle (on ikiye böl)
<- survey_data %>%
survey_data mutate(age_years = if_else(is.na(age_years),
/ 12,
age_months
age_years))
## yaş grubu değişkenini tanımla
<- survey_data %>%
survey_data mutate(age_group = age_categories(age_years,
breakers = c(0, 3, 15, 30, 45)
))
## farklı bir değişkenin gruplarına dayalı bir karakter değişkeni oluştur
<- survey_data %>%
survey_data mutate(health_district = case_when(
%in% c(1:5) ~ "district_a",
cluster_number TRUE ~ "district_b"
))
## sözlükten evet/hayır değişken isimlerini seç
<- survey_dict %>%
YNVARS filter(type == "yn") %>%
filter(name %in% names(survey_data)) %>%
## filter to match the column names of your data
pull(name) # select yn vars
## tarihleri değiştir
<- survey_data %>%
survey_data mutate(across(all_of(YNVARS),
str_detect, pattern = "yes"))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `across(all_of(YNVARS), str_detect, pattern = "yes")`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.
# Previously
across(a:b, mean, na.rm = TRUE)
# Now
across(a:b, \(x) mean(x, na.rm = TRUE))
26.3 Anket verisi
Anketler için kullanılabilecek çok sayıda farklı örnekleme tasarımı vardır. Burada şu kodları göstereceğiz: - Tabakalı - Küme - Tabakalı ve küme
Yukarıda açıklandığı gibi (anketinizi nasıl tasarladığınıza bağlı olarak) her seviye için veriler Kobo’dan ayrı bir veri seti olarak dışa aktarılacaktır. Örneğimizde, haneler için bir düzey ve bu hanelerdeki bireyler için bir düzey vardır.
Bu iki seviye benzersiz bir tanımlayıcı ile birbirine bağlanır. Bir Kobo veri kümesi için bu değişken, bireysel düzeyde “_parent_index” ile eşleşen hane düzeyinde “_index” dir. Bu, eşleşen her bireyle hane için yeni satırlar oluşturacaktır, ayrıntılar için Verileri ekleme ilgili el kitabı bölümüne bakabilirsiniz.
## eksiksiz bir veri seti oluşturmak için bireysel ve hane verilerini birleştir
<- left_join(survey_data_hh,
survey_data
survey_data_indiv,by = c("_index" = "_parent_index"))
## iki düzeyin endekslerini birleştirerek benzersiz bir tanımlayıcı oluştur
<- survey_data %>%
survey_data mutate(uid = str_glue("{index}_{index_y}"))
26.4 Gözlem süresi
Mortalite araştırmaları için, ilgilendiğimiz döneme ait uygun bir ölüm oranını hesaplayabilmek için her bireyin bölgede ne kadar süredir bulunduğunu bilmek istiyoruz. Bu, tüm anketlerde geçerli değildir, ancak özellikle ölüm anketleri için bu önemlidir, çünkü bunlar sık sık hareketli veya göç etmiş nüfuslarda kullanılabilir.
Bunu yapmak için önce, geri çağırma dönemi olarak da bilinen ilgilendiğimiz süreyi tanımlarız (yani, katılımcılardan soruları cevaplarken rapor vermelerinin istendiği süre). Daha sonra bu süreyi, uygun olmayan tarihleri kayıp olarak ayarlamak için kullanabiliriz, örneğin ölümler ilgili dönemin dışından bildirilirse.
## geri çağırma süresinin başlangıcını/sonunu ayarla
## veri setinden tarih değişkenleri olarak değiştirilebilir
## (örn. başlangıç tarihi & anket tarihi)
<- survey_data %>%
survey_data mutate(recall_start = as.Date("2018-01-01"),
recall_end = as.Date("2018-05-01")
)
# kurallara göre uygunsuz tarihleri NA olarak ayarla
## örneğin, başlangıçtan önce varışlar, bitişten sonra ayrılışlar
<- survey_data %>%
survey_data mutate(
arrived_date = if_else(arrived_date < recall_start,
as.Date(NA),
arrived_date),birthday_date = if_else(birthday_date < recall_start,
as.Date(NA),
birthday_date),left_date = if_else(left_date > recall_end,
as.Date(NA),
left_date),death_date = if_else(death_date > recall_end,
as.Date(NA),
death_date) )
Daha sonra her birey için başlangıç ve bitiş tarihlerini tanımlamak için tarih değişkenlerimizi kullanabiliriz. Tarihlerin nedenlerini belirlemek için sitrep paketinden find_start_date()
fonksiyonunu kullanabilir ve ardından bunu günler arasındaki farkı (kişi-zaman) hesaplamak için kullanabiliriz.
başlangıç tarihi: Geri çağırma döneminiz içindeki en erken uygun varış olayı Geri çağırma sürenizin başlangıcı (önceden tanımladığınız) veya varsa, geri çağırma başlangıcından sonraki bir tarih (örneğin varışlar veya doğumlar)
bitiş tarihi: Geri çağırma süreniz içindeki en erken uygun ayrılma olayı Geri çağırma sürenizin sonu ya da varsa, geri çağırma süresinin bitiminden önceki bir tarih (örn. ayrılışlar, ölümler)
## başlangıç ve bitiş tarihleri/nedenleri için yeni değişkenler oluştur
<- survey_data %>%
survey_data ## ankete girilen en erken tarihi seç
## doğumlardan, hane girişlerinden ve kamp varışlarından
find_start_date("birthday_date",
"arrived_date",
period_start = "recall_start",
period_end = "recall_end",
datecol = "startdate",
datereason = "startcause"
%>%
) ## ankete girilen en erken tarihi seç
## kamptan ayrılma, ölüm ve çalışmanın bitiminden
find_end_date("left_date",
"death_date",
period_start = "recall_start",
period_end = "recall_end",
datecol = "enddate",
datereason = "endcause"
)
## başlangıçta/sonda olanları etiketle (doğumlar/ölümler hariç)
<- survey_data %>%
survey_data mutate(
##geri çağırma süresinin başlangıcı olarak başlangıç tarihini gir (boş olanlar için)
startdate = if_else(is.na(startdate), recall_start, startdate),
## geri çağırma periyoduna eşitse, başlangıç nedenini başlangıçta gösterecek şekilde ayarla
## doğum tarihine eşit değilse
startcause = if_else(startdate == recall_start & startcause != "birthday_date",
"Present at start", startcause),
## geri çağırma süresinin bitimi için bitiş tarihini gir (boş olanlar için)
enddate = if_else(is.na(enddate), recall_end, enddate),
## son nedeni, geri çağırma sonuna eşitse, sonunda sunacak şekilde ayarla
## ölüm tarihine eşit olmadıkça
endcause = if_else(enddate == recall_end & endcause != "death_date",
"Present at end", endcause))
## Gözlem süresini gün olarak tanımla
<- survey_data %>%
survey_data mutate(obstime = as.numeric(enddate - startdate))
26.5 Ağırlıklandırma
Anket ağırlıkları eklemeden önce hatalı gözlemleri bırakmanız önemlidir. Örneğin, negatif gözlem süresine sahip gözlemleriniz varsa, bunları kontrol etmeniz gerekecektir (bunu sitrep paketinden assert_positive_timespan()
fonksiyonuyla yapabilirsiniz. Başka bir şey de boş satırlar bırakmak istiyorsanız (örneğin drop_na(uid)
ile) veya kopyaları kaldırabilirsiniz (ayrıntılar için El Kitabının [Tekilleştirme] bölümüne bakın). İzinsiz olanların da çıkarılması gerekir.
Bu örnekte, bırakmak ve ayrı bir veri çerçevesinde saklamak istediğimiz durumları filtreliyoruz - bu şekilde anketten hariç tutulanları tanımlayabiliriz. Ardından, bu bırakılan durumları anket verilerimizden çıkarmak için dplyr paketinden anti_join()
fonksiyonunu kullanırız.
TEHLİKE: Ağırlık değişkeninizde veya anket tasarımınızla ilgili herhangi bir değişkende (örneğin yaş, cinsiyet, tabaka veya küme değişkenleri) eksik değerler olamaz.
## düşürdüğünüz vakaları tanımlayabilmek için sakla (ör.rıza dışı
## veya yanlış köy/küme)
<- survey_data %>%
dropped filter(!consent | is.na(startdate) | is.na(enddate) | village_name == "other")
## kullanılmayan satırları anket veri setinden çıkarmak için bırakılan vakaları kullan
<- anti_join(survey_data, dropped, by = names(dropped)) survey_data
Yukarıda bahsedildiği gibi, üç farklı çalışma tasarımı (katmanlı, küme ve tabakalı küme) için ağırlıkların nasıl ekleneceğini gösteriyoruz. Bunlar, kaynak popülasyon ve/veya incelenen kümeler hakkında bilgi gerektirir. Bu örnek için tabakalı küme kodunu kullanacağız, ancak çalışma tasarımınız için en uygun olanı kullanın.
# tabakalı ------------------------------------------------------------------
# "surv_weight_strata" adında bir değişken oluştur
# her birey için ağırlıklar içerir - yaş grubuna, cinsiyete ve sağlık bölgesine göre
<- add_weights_strata(x = survey_data,
survey_data p = population,
surv_weight = "surv_weight_strata",
surv_weight_ID = "surv_weight_ID_strata",
age_group, sex, health_district)
## küme ---------------------------------------------------------------------
# hane başına görüşülen bireylerin kişi sayısını al
# hane (ebeveyn) indeks değişkeni sayılarına sahip bir değişken ekler
<- survey_data %>%
survey_data add_count(index, name = "interviewed")
## küme ağırlıkları oluştur
<- add_weights_cluster(x = survey_data,
survey_data cl = cluster_counts,
eligible = member_number,
interviewed = interviewed,
cluster_x = village_name,
cluster_cl = cluster,
household_x = index,
household_cl = households,
surv_weight = "surv_weight_cluster",
surv_weight_ID = "surv_weight_ID_cluster",
ignore_cluster = FALSE,
ignore_household = FALSE)
# tabakalı ve küme ---------------------------------------------------------
# küme ve tabalalar için bir anket ağırlığı oluştur
<- survey_data %>%
survey_data mutate(surv_weight_cluster_strata = surv_weight_strata * surv_weight_cluster)
26.6 Anket tasarım nesneleri
Çalışma tasarımınıza göre anket nesnesi oluşturun. Ağırlık orantılarını vb. hesaplamak için veri çerçeveleri ile aynı şekilde kullanılır. Bundan önce gerekli tüm değişkenlerin oluşturulduğundan emin olun.
Dört seçenek vardır, kullanmadıklarınızı yorumlayarak kodun dışında bırakın:
- Basit rastgele
- Tabakalı
- Küme
- Tabakalı küme
Bu şablon için - anketleri iki ayrı katmanda (sağlık bölgeleri A ve B) gruplandırdığımızı farz edeceğiz. Bu nedenle, genel tahminler elde etmek için küme ve tabaka ağırlıklarının birleştirilmesine ihtiyacımız var.
Daha önce de belirtildiği gibi, bunu yapmak için iki paket mevcuttur. Klasik olan survey paketidir; ve daha sonra düzenli tidyverse dostu nesneler ve işlevler yapan srvyr adında bir sarmalayıcı paket vardır. Burada her ikisini de göstereceğiz, ancak bu bölümdeki kodun çoğunun srvyr tabanlı nesneleri kullanacağını unutmayın. Tek istisna, gtsummary paketinin yalnızca anket nesnelerini kabul etmesidir.
26.6.1 Survey paketi
survey paketi, R tabanı kodlamasını etkin bir şekilde kullanır ve bu nedenle tüneller (%>%
) veya diğer dplyr sözdizimini kullanmak mümkün değildir. survey paketiyle, uygun kümeler, ağırlıklar ve tabakalarla bir anket nesnesi tanımlamak için svydesign()
fonksiyonunu kullanırız.
NOT: Değişkenlerin önünde yaklaşık işareti (~
) kullanmamız gerekir, bunun nedeni paketin formüllere dayalı değişkenler atamak için R tabanı sözdizimini kullanmasıdır.
# basit rastgele ---------------------------------------------------------------
<- svydesign(ids = ~1, # küme kimliği yok demek için 1
base_survey_design_simple weights = NULL, # Ağırlık eklenmedi
strata = NULL, # örnekleme basitti (tabaka yok)
data = survey_data # veri kümesini belirtmek zorunda
)
## tabakalı --------------------------------------------------------------------
<- svydesign(ids = ~1, # küme kimliği yok demek için 1
base_survey_design_strata weights = ~surv_weight_strata, # yukarıda oluşturulan ağırlık değişkeni
strata = ~health_district, # örnekleme bölgelere göre tabakalandırılmıştır
data = survey_data # veri kümesini belirtmek zorunda
)
# küme -------------------------------------------------------------------------
<- svydesign(ids = ~village_name, # küme kimlikleri
base_survey_design_cluster weights = ~surv_weight_cluster, # yukarıda oluşturulan ağırlık değişkeni
strata = NULL, # örnekleme basitti (tabaka yok)
data = survey_data # veri kümesini belirtmek zorunda
)
# tabakalı küme ----------------------------------------------------------------
<- svydesign(ids = ~village_name, # küme kimlikleri
base_survey_design weights = ~surv_weight_cluster_strata, # yukarıda oluşturulan ağırlık değişkeni
strata = ~health_district, # örnekleme bölgelere göre tabakalandırılmıştır
data = survey_data # veri kümesini belirtmek zorunda
)
26.6.2 Srvyr paketi
srvyr paketiyle, yukarıdakiyle aynı argümanlara sahip olan ancak tünellere (%>%
) izin veren as_survey_design()
fonksiyonunu kullanabiliriz ve bu nedenle tilde (~
) kullanmamız gerekmez.
## basit rastgele --------------------------------------------------------------
<- survey_data %>%
survey_design_simple as_survey_design(ids = 1, # küme kimliği yok demek için 1
weights = NULL, # Ağırlık eklenmedi
strata = NULL # örnekleme basitti (tabaka yok)
)## tabakalı --------------------------------------------------------------------
<- survey_data %>%
survey_design_strata as_survey_design(ids = 1, # küme kimliği yok demek için 1
weights = surv_weight_strata, # yukarıda oluşturulan ağırlık değişkeni
strata = health_district # örnekleme bölgelere göre tabakalandırılmıştır
)## küme ------------------------------------------------------------------------
<- survey_data %>%
survey_design_cluster as_survey_design(ids = village_name, # küme kimlikleri
weights = surv_weight_cluster, # yukarıda oluşturulan ağırlık değişkeni
strata = NULL # örnekleme basitti (tabaka yok)
)
## tabakalı küme ---------------------------------------------------------------
<- survey_data %>%
survey_design as_survey_design(ids = village_name, # küme kimlikleri
weights = surv_weight_cluster_strata, # yukarıda oluşturulan ağırlık değişkeni
strata = health_district # örnekleme bölgelere göre tabakalandırılmıştır
)
26.7 Tanımlayıcı analiz
Temel tanımlayıcı analiz ve görselleştirme, el kitabının diğer bölümlerinde kapsamlı bir şekilde ele alınmıştır, bu nedenle burada üzerinde durmayacağız. Ayrıntılar için tanımlayıcı tablolar, istatistiksel testler, sunum tabloları, ggplot temelleri ve R markdown raporları ile ilgili bölümlere bakabilirsiniz.
Bu bölümde, örnekleminizdeki yanlılığı nasıl araştırıp bunu görselleştireceğimize odaklanacağız. Ayrıca alüvyon/sankey diyagramlarını kullanarak bir anket ortamında nüfus akışını görselleştirmeye bakacağız.
Genel olarak, aşağıdaki tanımlayıcı analizleri dahil etmeyi düşünmelisiniz:
- Dahil edilen kümelerin, hanelerin ve bireylerin nihai sayısı
- Dışlanan kişi sayısı ve dışlanma nedenleri
- Küme başına medyan (aralık) hane ve hane başına birey sayısı
26.7.1 Örnekleme yanlılığı
Örnekleminiz ve kaynak popülasyon arasındaki her yaş grubundaki orantıları karşılaştırın. Bu, potansiyel örnekleme yanlılığını vurgulayabilmek için önemlidir. Benzer şekilde, cinsiyete göre dağılımlara bakarak da bunu tekrarlayabilirsiniz.
Bu p değerlerinin yalnızca gösterge niteliğinde olduğunu ve kaynak popülasyona kıyasla çalışma örneğinizdeki dağılımların açıklayıcı bir tartışmasının (veya aşağıdaki yaş piramitleriyle görselleştirmenin) binom testinin kendisinden daha önemli olduğunu unutmayın. Bunun nedeni, örnek boyutunun artmasının, verilerinizi ağırlıklandırdıktan sonra alakasız olabilecek farklılıklara yol açmamasıdır.
## çalışma popülasyonunun sayıları ve orantıları
<- survey_data %>%
ag group_by(age_group) %>%
drop_na(age_group) %>%
tally() %>%
mutate(proportion = n / sum(n),
n_total = sum(n))
## kaynak popülasyonun sayıları ve orantıları
<- population %>%
propcount group_by(age_group) %>%
tally(population) %>%
mutate(proportion = n / sum(n))
## iki tablonun sütunlarını birbirine bağla, yaşa göre grupla ve bir
## n/toplamın popülasyondan önemli ölçüde farklı olup olmadığını görmek için binom testi orantısı.
## buradaki son ek, iki veri kümesinin her birindeki sütunların sonuna metne ekler
left_join(ag, propcount, by = "age_group", suffix = c("", "_pop")) %>%
group_by(age_group) %>%
## broom::tidy(binom.test()) binom testinden bir veri çerçevesi yapar ve
## p.value, parametre, conf.low, conf.high, method ve değişkenlerini ekleyecektir.
## Burada sadece p.value kullanacağız. diğerlerini dahil edebilirsiniz
## güven aralıklarını bildirmek istiyorsanız sütunlar
mutate(binom = list(broom::tidy(binom.test(n, n_total, proportion_pop)))) %>%
unnest(cols = c(binom)) %>% # important for expanding the binom.test data frame
mutate(proportion_pop = proportion_pop * 100) %>%
## Yanlış pozitifleri düzeltmek için p-değerlerini ayarla
## (çünkü birden fazla yaş grubunu test ediyor). Bu sadece yapacak
## birçok yaş kategoriniz varsa bir fark verir
mutate(p.value = p.adjust(p.value, method = "holm")) %>%
## Yalnızca 0,001'in üzerindeki p değerlerini göster (<0,001 olarak rapor edilenler)
mutate(p.value = ifelse(p.value < 0.001,
"<0.001",
as.character(round(p.value, 3)))) %>%
## sütunları uygun şekilde yeniden adlandır
select(
"Age group" = age_group,
"Study population (n)" = n,
"Study population (%)" = proportion,
"Source population (n)" = n_pop,
"Source population (%)" = proportion_pop,
"P-value" = p.value
)
# A tibble: 5 × 6
# Groups: Age group [5]
`Age group` `Study population (n)` `Study population (%)`
<chr> <int> <dbl>
1 0-2 12 0.0256
2 3-14 42 0.0896
3 15-29 64 0.136
4 30-44 52 0.111
5 45+ 299 0.638
# ℹ 3 more variables: `Source population (n)` <dbl>,
# `Source population (%)` <dbl>, `P-value` <chr>
26.7.2 Demografik piramitler
Demografik (veya yaş-cinsiyet) piramitler, anket popülasyonunuzdaki dağılımı görselleştirmenin kolay bir yoludur. Anket tabaklarına göre yaş ve cinsiyet için tanımlayıcı tabloları oluşturmayı da düşünmeye değer. Yukarıda oluşturulan anket tasarım nesnemizi kullanarak ağırlıklı orantılara izin verdiği için apyramid paketini kullanmayı göstereceğiz. Demografik piramitler oluşturmaya yönelik diğer seçenekler, el kitabının bu bölümünde kapsamlı bir şekilde ele alınmıştır. Ayrıca, orantıları olan bir grafik üretmek için birkaç satır kodlama kaydeden, age_pyramid()
adlı sitrep paketinden bir sarmalayıcı işlevi kullanacağız.
Yukarıda örnekleme yanlılığı bölümünde görülen resmi binom farklılık testinde olduğu gibi, burada örneklenen popülasyonumuzun kaynak popülasyondan önemli ölçüde farklı olup olmadığını ve ağırlıklandırmanın bu farkı düzeltip düzeltmediğini görselleştirmekle ilgileniyoruz. Bunu yapmak için ggplot görselleştirmelerimizi yan yana göstermek için patchwork paketini kullanacağız; ayrıntılar için el kitabının ggplot ipuçları bölümündeki grafikleri birleştirme bölümüne bakın. Kaynak popülasyonumuzu, ağırlıksız anket popülasyonumuzu ve ağırlıklı anket popülasyonumuzu görselleştireceğiz. Anketinizin her katmanına göre görselleştirmeyi de düşünebilirsiniz - buradaki örneğimizde bu, stack_by = "health_district"
argümanını kullanmak olacaktır (ayrıntılar için ?age_pyramid
komutuna bknz.).
NOT: x ve y eksenleri piramitlerde çevrilir.
## x ekseni sınırlarını ve etiketlerini tanımlayın -----------------------------
## (bu sayıları grafiğinizin değerleri olacak şekilde güncelle)
<- 35 # göstermek istediğiniz en yüksek orantıyı seç
max_prop <- 5 # etiketler arasında istediğiniz boşluğu seç
step
## bu kısım, vektörü yukarıdaki sayıları kullanarak eksen sonları ile tanımlar.
<- c(
breaks seq(max_prop/100 * -1, 0 - step/100, step/100),
0,
seq(0 + step / 100, max_prop/100, step/100)
)
## bu kısım vektörü yukarıdaki sayıları kullanarak eksen limitleri ile tanımlar.
<- c(max_prop/100 * -1, max_prop/100)
limits
## bu kısım, vektörü, eksen etiketleriyle birlikte yukarıdaki sayıları kullanarak tanımlar.
<- c(
labels seq(max_prop, step, -step),
0,
seq(step, max_prop, step)
)
## ayrı ayrı grafikler oluştur ------------------------------------------------
## kaynak popülasyonu grafiklendir
## not: bunun genel nüfus için daraltılması gerekiyor (yani sağlık bölgelerinin kaldırılması)
<- population %>%
source_population ## yaş ve cinsiyetin faktörler olduğundan emin ol
mutate(age_group = factor(age_group,
levels = c("0-2",
"3-14",
"15-29",
"30-44",
"45+")),
sex = factor(sex)) %>%
group_by(age_group, sex) %>%
## birlikte her sağlık bölgesi için sayıları ekle
summarise(population = sum(population)) %>%
## genel orantıyı hesaplayabilmek için gruplandırmayı kaldır
ungroup() %>%
mutate(proportion = population / sum(population)) %>%
## piramid grafiği
age_pyramid(
age_group = age_group,
split_by = sex,
count = proportion,
proportional = TRUE) +
## sadece y ekseni etiketini göster (aksi takdirde her üç çizimde de tekrarlanır)
labs(title = "Source population",
y = "",
x = "Age group (years)") +
## x eksenini tüm grafikler için aynı yap
scale_y_continuous(breaks = breaks,
limits = limits,
labels = labels)
## ağırlıksız örnek popülasyonunu grafiklendir
<- age_pyramid(survey_data,
sample_population age_group = "age_group",
split_by = "sex",
proportion = TRUE) +
## sadece x ekseni etiketini göster (aksi takdirde her üç grafikte de tekrarlanır)
labs(title = "Unweighted sample population",
y = "Proportion (%)",
x = "") +
## x eksenini tüm grafikler için aynı yap
scale_y_continuous(breaks = breaks,
limits = limits,
labels = labels)
## ağırlıklı örnek popülasyonunu grafiklendir
<- survey_design %>%
weighted_population ## değişkenlerin faktör olduğundan emin ol
mutate(age_group = factor(age_group),
sex = factor(sex)) %>%
age_pyramid(
age_group = "age_group",
split_by = "sex",
proportion = TRUE) +
## sadece x ekseni etiketini göster (aksi takdirde her üç grafikte de tekrarlanır)
labs(title = "Weighted sample population",
y = "",
x = "") +
## x eksenini tüm grafikler için aynı yap
scale_y_continuous(breaks = breaks,
limits = limits,
labels = labels)
## üç grafiğin tümünü birleştir ------------------------------------------------
## + kullanarak üç grafiği yan yana birleştir
+ sample_population + weighted_population +
source_population ## sadece bir legand göster ve temayı tanımla
## temayı plot_layout() ile birleştirmek için & kullanımına dikkat et
plot_layout(guides = "collect") &
theme(legend.position = "bottom", # açıklamayı aşağıya taşı
legend.title = element_blank(), # başlığı kaldır
text = element_text(size = 18), # metin boyutunu değiştir
axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1) # x ekseni metnini çevir
)
26.7.3 Alluvial/sankey diagramı
Bireyler için başlangıç noktalarını ve sonuçları görselleştirmek, genel bir bakış elde etmek için çok yardımcı olabilir. Mobil popülasyonlar için oldukça açık bir uygulama var, ancak kohortlar veya bireyler için durumlarda geçişlerin olduğu diğer durumlar gibi çok sayıda başka uygulama var. Bu diyagramların alüvyon, sankey ve paralel kümeler dahil olmak üzere birkaç farklı adı vardır - ayrıntılar el kitabının Diyagramlar ve çizelgeler bölümündedir.
## verileri özetle
<- survey_data %>%
flow_table count(startcause, endcause, sex) %>% # sayımları al
gather_set_data(x = c("startcause", "endcause")) # grafiklendirme için formatı değiştir
## veri kümesini çiz
## x ekseninde başlangıç ve bitiş nedenleri
## gather_set_data, her olası kombinasyon için bir kimlik oluşturur
## y ile bölme, olası başlangıç/bitiş kombinasyonlarını verir
## n'nin sayı olarak verdiği değer (orantı olarak da değiştirilebilir)
ggplot(flow_table, aes(x, id = id, split = y, value = n)) +
## cinsiyete göre renk çizgileri
geom_parallel_sets(aes(fill = sex), alpha = 0.5, axis.width = 0.2) +
## etiket kutularını gri doldur
geom_parallel_sets_axes(axis.width = 0.15, fill = "grey80", color = "grey80") +
## metin rengini ve açısını değiştir (ayarlanması gerekiyor)
geom_parallel_sets_labels(color = "black", angle = 0, size = 5) +
## ayarlanmış y ve x eksenleri (muhtemelen daha fazla dikey alana ihtiyaç duyar)
scale_x_discrete(name = NULL, expand = c(0, 0.2)) +
## eksen etiketlerini kaldır
theme(
title = element_text(size = 26),
text = element_text(size = 26),
axis.line = element_blank(),
axis.ticks = element_blank(),
axis.text.y = element_blank(),
panel.background = element_blank(),
legend.position = "bottom", # açıklamayı aşağıya taşı
legend.title = element_blank(), # başlığı kaldır
)
26.8 Ağırlıklı orantılar
Bu bölüm, ilişkili güven aralıkları ve tasarım etkisi ile birlikte ağırlıklı sayımlar ve oranlar için tabloların nasıl üretileceğini detaylandıracaktır. Aşağıdaki paketlerdeki işlevleri kullanan dört farklı seçenek vardır: survey, srvyr, sitrep ve gtsummary. Standart bir epidemiyoloji stili tablosu oluşturmak üzere minimum kodlama için, srvyr kodunun sarmalayıcısı olan sitrep fonksiyonunu öneriyoruz; Ancak bunun henüz CRAN’da olmadığını ve gelecekte değişebileceğini unutmayın. Aksi takdirde, survey kodu muhtemelen en istikrarlı ve uzun vadeli paket olacaktır, oysa srvyr paketi en iyi şekilde derli toplu iş akışlarına uymaktadır. gtsummary fonksiyonları çok fazla potansiyele sahip olsa da, bu kitap yazıldığı sırada deneysel ve eksiktirler.
26.8.1 Survey paketi
Ağırlıklı orantılar ve beraberindeki %95 güven aralıklarını elde etmek için survey paketinden svyciprop()
fonksiyonunu kullanabiliriz. Uygun bir tasarım efekti, svyprop()
fonksiyonu yerine svymean()
kullanılarak da çıkarılabilir. svyprop()
fonksiyonunun yalnızca 0 ile 1 (veya DOĞRU/YANLIŞ) arasındaki değişkenleri kabul ediyor gibi göründüğünü, dolayısıyla kategorik değişkenlerin çalışmayacağını belirtmekte fayda var.
NOT: survey paketinden gelen foksiyonlar ayrıca srvyr tasarım nesnelerini de kabul etmektedir, ancak burada anket survey nesnesini yalnızca tutarlılık için kullandık.
## ağırlıklı sayılar üretme
svytable(~died, base_survey_design)
died
FALSE TRUE
1406244.43 76213.01
## ağırlıklı orantılar üretme
svyciprop(~died, base_survey_design, na.rm = T)
2.5% 97.5%
died 0.0514 0.0208 0.12
## tasarım efektini al
svymean(~died, base_survey_design, na.rm = T, deff = T) %>%
deff()
diedFALSE diedTRUE
3.755508 3.755508
Yukarıda gösterilen survey fonksiyonları, aşağıda kendimizi tanımladığımız, svy_prop
adlı bir fonksiyonda birleştirebiliriz; ve daha sonra bu fonksiyonu purrr paketindeki map()
ile birlikte birkaç değişken üzerinde yineleme yapmak ve bir tablo oluşturmak için kullanabiliriz. purrr hakkında ayrıntılar için el kitabı yineleme bölümüne bakabilirsiniz.
# Ağırlıklı sayıları, oranlatıları, CI ve tasarım etkisini hesaplamak için fonksiyonu tanımla
# x tırnak içindeki değişkendir
# tasarım, sizin anket tasarım nesnenizdir
<- function(design, x) {
svy_prop
## ilgilenilen değişkeni bir formüle koy
<- as.formula(paste0( "~" , x))
form ## svytable'dan yalnızca DOĞRU sayım sütununu sakla
<- svytable(form, design)[[2]]
weighted_counts ## orantıları hesapla (yüzdeleri almak için 100 ile çarpın)
<- svyciprop(form, design, na.rm = TRUE) * 100
weighted_props ## güven aralıklarını çıkarın ve yüzdeleri elde etmek için çarp
<- confint(weighted_props) * 100
weighted_confint ## tasarım etkisini hesaplamak için svymean kullanın ve yalnızca DOĞRU sütununu koru
<- deff(svymean(form, design, na.rm = TRUE, deff = TRUE))[[TRUE]]
design_eff
## tek bir veri çerçevesinde birleştir
<- cbind(
full_table "Variable" = x,
"Count" = weighted_counts,
"Proportion" = weighted_props,
weighted_confint, "Design effect" = design_eff
)
## tabloyu veri çerçevesi olarak döndür
<- data.frame(full_table,
full_table ## remove the variable names from rows (is a separate column now)
row.names = NULL)
## sayısalları tekrar sayısal olarak değiştir
2:6] <- as.numeric(full_table[, 2:6])
full_table[ ,
## veri çerçevesini döndür
full_table
}
## bir tablo oluşturmak için birkaç değişken üzerinde yineleme yap
::map(
purrr## ilgilenilen değişkenleri tanımla
c("left", "died", "arrived"),
## durum fonksiyonu kullanımı ve bu fonksiyon için argümanlar (tasarım)
design = base_survey_design) %>%
svy_prop, ## listeyi tek bir veri çerçevesine daralt
bind_rows() %>%
## yuvarla
mutate(across(where(is.numeric), round, digits = 1))
Variable Count Proportion X2.5. X97.5. Design.effect
1 left 701199.1 47.3 39.2 55.5 2.4
2 died 76213.0 5.1 2.1 12.1 3.8
3 arrived 761799.0 51.4 40.9 61.7 3.9
26.8.2 Srvyr paketi
srvyr ile bir tablo oluşturmak için dplyr sözdizimini kullanabiliriz. survey_mean()
fonksiyonunun kullanıldığını ve orantı argümanının belirtildiğini ve ayrıca tasarım etkisini hesaplamak için aynı fonksiyonu kullanıldığını unutmayın. Bunun nedeni, srvyr paketinin yukarıdaki bölümde kullanılan svyciprop()
ve svymean()
survey paketi fonksiyonun her ikisinin de etrafını sarmasıdır.
NOT: Kategorik değişkenlerden orantıları srvyr paketini kullanarak da almak pek mümkün görünmüyor, buna ihtiyacınız varsa sitrep paketini kullanmanız gerekir. Detaylar için aşağıdaki bölüme göz atın.
## srvyr tasarım nesnesini kullan
%>%
survey_design summarise(
## ağırlıklı sayıları üret
counts = survey_total(died),
## ağırlıklı orantıları ve güven aralıkları üret
## yüzde almak için 100 ile çarp
props = survey_mean(died,
proportion = TRUE,
vartype = "ci") * 100,
## tasarım efekti üret
deff = survey_mean(died, deff = TRUE)) %>%
## sadece ilgi alanlarını tut
## (standart hataları bırakın ve orantı hesaplamasını tekrarla)
select(counts, props, props_low, props_upp, deff_deff)
# A tibble: 1 × 5
counts props props_low props_upp deff_deff
<dbl> <dbl> <dbl> <dbl> <dbl>
1 76213. 5.14 2.08 12.1 3.76
Burada da purrr paketini kullanarak birden çok değişken üzerinde yineleme yapacak bir fonksiyon yazabiliriz. purrr hakkında ayrıntılar için el kitabı yineleme bölümüne bakabilirsiniz.
# Ağırlıklı sayıları, orantıları, CI ve tasarım etkisini hesaplamak için işlevi tanımla
# tasarım, sizin anket tasarım nesnenizdir
# x tırnak içindeki değişkendir
<- function(design, x) {
srvyr_prop
summarise(
## anket tasarım nesnesini kullan
design, ## ağırlıklı sayıları üret
counts = survey_total(.data[[x]]),
## ağırlıklı orantıları ve güven aralıkları üret
## yüzde almak için 100 ile çarp
props = survey_mean(.data[[x]],
proportion = TRUE,
vartype = "ci") * 100,
## tasarım efekti üret
deff = survey_mean(.data[[x]], deff = TRUE)) %>%
## değişken adını ekle
mutate(variable = x) %>%
## sadece ilgi alanlarını tut
## (standart hataları bırak ve orantı hesaplamasını tekrarla)
select(variable, counts, props, props_low, props_upp, deff_deff)
}
## bir tablo oluşturmak için birkaç değişken üzerinde yineleme yap
::map(
purrr## ilgilenilen değişkenleri tanımla
c("left", "died", "arrived"),
## durum fonksiyonu kullanımı ve bu fonksiyon için argümanlar (tasarım)
~srvyr_prop(.x, design = survey_design)) %>%
## listeyi tek bir veri çerçevesine daralt
bind_rows()
# A tibble: 3 × 6
variable counts props props_low props_upp deff_deff
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 left 701199. 47.3 39.2 55.5 2.38
2 died 76213. 5.14 2.08 12.1 3.76
3 arrived 761799. 51.4 40.9 61.7 3.93
26.8.3 Sitrep paketi
sitrep paketinin tab_survey()
fonksiyonu, minimum kodlama ile ağırlıklı tablolar oluşturmanıza olanak tanıyan srvyr paketi için bir sarmalayıcıdır. Ayrıca kategorik değişkenler için ağırlıklı orantıları hesaplamanıza olanak tanır.
## anket tasarım nesnesini kullan
%>%
survey_design ## ilgilenilen değişkenlerin isimlerini alıntı yapılmadan ilet
tab_survey(arrived, left, died, education_level,
deff = TRUE, # tasarım etkisini hesapla
pretty = TRUE # oranı ve %95 CI'yi birleştir
)
Warning: removing 257 missing value(s) from `education_level`
# A tibble: 9 × 5
variable value n deff ci
<chr> <chr> <dbl> <dbl> <chr>
1 arrived TRUE 761799. 3.93 51.4% (40.9-61.7)
2 arrived FALSE 720658. 3.93 48.6% (38.3-59.1)
3 left TRUE 701199. 2.38 47.3% (39.2-55.5)
4 left FALSE 781258. 2.38 52.7% (44.5-60.8)
5 died TRUE 76213. 3.76 5.1% (2.1-12.1)
6 died FALSE 1406244. 3.76 94.9% (87.9-97.9)
7 education_level higher 171644. 4.70 42.4% (26.9-59.7)
8 education_level primary 102609. 2.37 25.4% (16.2-37.3)
9 education_level secondary 130201. 6.68 32.2% (16.5-53.3)
26.8.4 Gtsummary paketi
gtsummary paketinde henüz güven aralıklarını veya tasarım efektini eklemek için yerleşik fonksiyonlar yok gibi görünüyor. Burada, güven aralıkları eklemek için bir fonksiyonun nasıl tanımlanacağını ve ardından tbl_svysummary()
fonksiyonunu kullanılarak oluşturulan bir gtsummary tablosuna güven aralıklarının nasıl ekleneceğini gösteriyoruz.
<- function(data, variable, by, ...) {
confidence_intervals
## güven aralıklarını çıkarın ve yüzdeleri elde etmek için çarp
<- svyciprop(as.formula(paste0( "~" , variable)),
props na.rm = TRUE)
data,
## güven aralıklarını çıkar
as.numeric(confint(props) * 100) %>% ## sayısal yap ve yüzde için çarp
round(., digits = 1) %>% ## bir haneye yuvarla
c(.) %>% ## sayıları matristen çıkar
paste0(., collapse = "-") ## tek karakterle birleştir
}
## anket paketi tasarım nesnesini kullan
tbl_svysummary(base_survey_design,
include = c(arrived, left, died), ## dahil etmek istediğiniz değişkenleri tanımla
statistic = list(everything() ~ c("{n} ({p}%)"))) %>% ## ilgi istatistiklerini tanımla
add_n() %>% ## add the weighted total
add_stat(fns = everything() ~ confidence_intervals) %>% ## güven aralığını ekle
## sütun başlıklarını değiştir
modify_header(
list(
~ "**Weighted total (N)**",
n ~ "**Weighted Count**",
stat_0 ~ "**95%CI**"
add_stat_1
) )
Characteristic |
Weighted total (N) |
Weighted Count 1 |
95%CI |
---|---|---|---|
arrived | 1,482,457 | 761,799 (51%) | 40.9-61.7 |
left | 1,482,457 | 701,199 (47%) | 39.2-55.5 |
died | 1,482,457 | 76,213 (5.1%) | 2.1-12.1 |
1
n (%) |
26.9 Ağırlıklı hızlar
Benzer şekilde ağırlıklı hızlar için (ölüm hızları gibi) survey veya srvyr paketini kullanabilirsiniz. Birkaç değişken üzerinde yineleme yapmak için benzer şekilde (yukarıdakilere benzer) fonksiyonlar yazabilirsiniz. Ayrıca gtsummary için yukarıdaki gibi bir fonksiyon oluşturabilirsiniz, ancak şu anda dahili bir fonksiyonelliği bulunmamaktadır.
26.9.1 Survey paketi
<- svyratio(~died,
ratio denominator = ~obstime,
design = base_survey_design)
<- confint(ratio)
ci
cbind(
$ratio * 10000,
ratio* 10000
ci )
obstime 2.5 % 97.5 %
died 5.981922 1.194294 10.76955
26.9.2 Srvyr paketi
%>%
survey_design ## gözlem süresini hesaba katmak için kullanılan anket hızı
summarise(
mortality = survey_ratio(
as.numeric(died) * 10000,
obstime, vartype = "ci")
)
# A tibble: 1 × 3
mortality mortality_low mortality_upp
<dbl> <dbl> <dbl>
1 5.98 0.349 11.6