R Взвешенные процедуры отбора проб - PullRequest
1 голос
/ 03 апреля 2020
data1=data.frame("School"=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5),
"Group"=c(1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2),
"Class"=c('A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C'),
"Size"=c(459,441,410,201,327,156,129,427,249,331,477,458,288,472,275,449,424,469,386,387,103,320,284,277,481,167,348,247,115,193))

data2=data.frame("ID"=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30),
"Group"=c(2,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,2,1,1,2,2,2,2,2,1,1,1,1,1),
"Class"=c('A','B','C','B','C','C','A','A','A','B','B','A','B','A','C','C','B','A','B','A','B','C','B','A','C','B','B','C','C','B'),
"Funds"=c(5,8,9,4,6,3,5,7,6,7,6,7,6,7,6,7,4,9,5,7,5,5,5,7,9,7,6,9,4,7),
"Ratio"=c(2,2,3,1,1,2,3,3,1,3,3,3,3,1,1,3,2,1,1,1,3,1,3,3,1,2,1,3,1,3),
"WEIGHT"=c(162,65,104,118,105,49,107,93,25,24,103,115,64,186,57,123,86,181,70,111,154,135,37,73,127,148,188,169,73,52))

У меня есть данные1 и данные2, и я надеюсь привести простой пример.

В данных1 вы видите число «Школа» и «Размер» комбинаций «Группа» X «Класс». В data2 у вас есть информация о «фондах» и «соотношении» для каждой из комбинаций «группа» и «класс». В data2 у вас также есть «ВЕС», который равен кадру выборки, то есть разные «идентификаторы имеют разный« вес »или важность.

I sh для создания данных3, которые будут выглядеть следующим образом :

enter image description here

В целом, я sh для данных3 будет иметь sum(data1$Size) строк. sh чтобы скопировать строки «Размер» для каждой комбинации «Школа», «Группа», «Х», «Класс» из данных1. Затем я выберу sh для выборки с заменой на 'Group' X 'Class' 'Funds' and 'Ratio' from data2, используя WEIGHTS для информирования о вероятности выбора каждой строки для заполнения data3.

1 Ответ

1 голос
/ 03 апреля 2020

Вот вариант с data.table, где мы расширяем data1 на основе столбца «Размер», затем разделяем оба набора данных по «Группе», «Классу» и используем Map для создания столбцов в первом наборе данных на основе вероятности. созданный с помощью WEIGHT/sum(WEIGHT) для использования в sample для выборки значений столбцов 'Funds', 'Ratio', назначьте (:=) его для создания новых столбцов в list и, наконец, rbind в list elements with rbindlist`

library(data.table)
dt1 <- setDT(data1)[rep(seq_len(nrow(data1)), Size)]
lst1 <- split(dt1, dt1[, .(Group, Class)])
lst2 <- split(data2, data2[c('Group', 'Class')], drop = TRUE)

out <- rbindlist(Map(function(x, y) {
            prb = y$WEIGHT/sum(y$WEIGHT)
            x[, c('Funds', 'Ratio') := 
           .(sample(y$Funds,  size = .N, replace = TRUE, prob=prb), 
            sample(y$Ratio,  size = .N, replace = TRUE, prob=prb) )]}, 
            lst1, lst2[names(lst1)]))

out[, Size := NULL]
sum(data1$Size)
#[1] 9750
nrow(out)
#[1] 9750
...