Многоступенчатая выборка с R с указанием только конечного размера выборки - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь реализовать алгоритм выборки в несколько этапов, когда известен только конечный размер выборки.

Вот пример структуры моего кадра выборки. Где:

  • кластер - это блок домохозяйств.
  • total_households - количество домохозяйств в каждом блоке
  • группа - это группировка блоков в зависимости от количества домохозяйств в блоках.
  • Вероятность - это вероятность выбора одной группы.

Затем алгоритм имеет следующие шаги: Учитывая размер выборки $ n $

  1. Выберите одну группу с неравными вероятностями с простой случайной выборкой с заменой.
  2. Выберите с помощью простой случайной выборки без замены одного кластера в группе, выбранной на предыдущем шаге, и удалите его из кадра выборки.
  3. в ранее выбранном кластере выберите только 25% домохозяйств.
  4. Повторяйте, пока не будет достигнут точный размер выборки

Потому что

        cluster   total_households group            Probability
 1       173494              13     2            4.055410e-01
 2       173495              19     5            4.176953e-02
 3       173496              22     5            4.176953e-02
 4       173497              21     5            4.176953e-02
 5       173498              18     5            4.176953e-02
 6       173499              27     7            6.775638e-05
 7       173500              15     4            5.020529e-01
8       173501              19     5            4.176953e-02

Я хочу реализовать этот алгоритм с R. Я знаю, что есть пакет для этого, называемый sampling с функцией multistage , но он не работает. Потому что я должен указать количество кластеров и групп перед реализацией алгоритма. Мои навыки программирования ограничены. Я пытался что-то сделать с помощью цикла while, но думаю, что далек от правильного результата.

    require(dplyr) # to use pipes in the code 

    n_sample = 844
    group = NULL
    total = NULL
    cluster = NULL
    total_households = NULL
    total = 0
    i = 1
    while(total < n_sample){
    group[i] = groups[sample(nrow(groups),size = 1,prob = groups$P),c("group")]
    total_households = data[data$group==group[i],] %>% 
                          sample_n(size=1) %>% 
                                select(total_households)
    cluster[i] = data[data$group==group[i],] %>%
                        sample_n(size=1) %>% 
                        select(cluster) %>% as.numeric() 
    data = data[data$cluster!=cluster[i],] 
    total = total+total_households
    i = i+1
    }

1 Ответ

0 голосов
/ 16 мая 2018

Вы довольно близки к тому, чего хотите достичь (оставив в стороне аккуратность кода и сосредоточившись на числах):

Во-первых, давайте исправим цикл while: (2 модификации)

while(total < n_sample){
group[i] = groups[sample(nrow(groups),size = 1,prob = groups$P),c("group")]
total_households = data[data$group==group[i],] %>% 
                      sample_n(size=1) %>% 
                      select(total_households) %>% as.numeric()          # Mod_1

cluster[i] = data[data$group==group[i],] %>%
                    sample_n(size=1) %>% 
                    select(cluster) %>% as.numeric() 
data = data[data$cluster!=cluster[i],] 
total = total+ (total_households*0.25)                                   # Mod_2
i = i+1
}

Обратите внимание, что в итоге вы получите итоговое значение> n, но вы всегда можете установить его равным n, изменив число домохозяйств из последнего кластера в списке.

Во-вторых, важная вещь, которая вам нужнапринять во внимание то, что сумма вероятностей для групп должна добавляться к 1 на протяжении всего алгоритма.

...