Как создать стратифицированную выборку по состоянию в R - PullRequest
4 голосов
/ 14 марта 2012

Как я могу создать стратифицированную выборку в R, используя пакет "выборка"?В моем наборе данных 355 000 наблюдений.Код отлично работает до последней строки.Ниже приведен код, который я написал, но я всегда получаю следующее сообщение: «Ошибка в sort.list (y):« x »должен быть атомарным для« sort.list »Вы вызывали« sort »в списке?»

Пожалуйста, не указывайте мне старые сообщения на Stackoverflow.Я исследовал их, но не смог их использовать.Спасибо.

## lpdata file has 355,000 observations
# Exclude Puerto Rico, Virgin Islands and Guam
sub.lpdata<-subset(lpdata,"STATE" != 'PR' | "STATE" != 'VI' | "STATE" != 'GU')

## Create a 10% sample, stratified by STATE
sort.lpdata<-sub.lpdata[order(sub.lpdata$STATE),]
tab.state<-data.frame(table(sort.lpdata$STATE))
size.strata<-as.vector(round(ceiling(tab.state$Freq)*0.1))

s<-strata(sort.lpdata,stratanames=sort.lpdata$STATE,size=size.strata,method="srswor")}

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Мне пришлось сделать что-то подобное в прошлом году. Если вы часто этим занимаетесь, вы можете использовать функцию, подобную приведенной ниже. Эта функция позволяет вам указать имя фрейма данных, из которого вы берете выборку, какая переменная является переменной ID, какие страты, и если вы хотите использовать "set.seed" Вы можете сохранить функцию как что-то вроде «straified.R» и загрузить ее, когда вам нужно. Смотри http://news.mrdwab.com/2011/05/20/stratified-random-sampling-in-r-from-a-data-frame/

stratified = function(df, group, size) {
  #  USE: * Specify your data frame and grouping variable (as column 
  #         number) as the first two arguments.
  #       * Decide on your sample size. For a sample proportional to the
  #         population, enter "size" as a decimal. For an equal number 
  #         of samples from each group, enter "size" as a whole number.
  #
  #  Example 1: Sample 10% of each group from a data frame named "z",
  #             where the grouping variable is the fourth variable, use:
  # 
  #                 > stratified(z, 4, .1)
  #
  #  Example 2: Sample 5 observations from each group from a data frame
  #             named "z"; grouping variable is the third variable:
  #
  #                 > stratified(z, 3, 5)
  #
  require(sampling)
  temp = df[order(df[group]),]
  if (size < 1) {
    size = ceiling(table(temp[group]) * size)
  } else if (size >= 1) {
    size = rep(size, times=length(table(temp[group])))
  }  
  strat = strata(temp, stratanames = names(temp[group]), 
                 size = size, method = "srswor")
  (dsample = getdata(temp, strat))
}
0 голосов
/ 14 марта 2012

Не зная функции страты - немного кода может делать то, что нужно:

d <- expand.grid(id = 1:35000, stratum = letters[1:10])

p = 0.1

dsample <- data.frame()

system.time(
for(i in levels(d$stratum)) {
  dsub <- subset(d, d$stratum == i)
  B = ceiling(nrow(dsub) * p)
  dsub <- dsub[sample(1:nrow(dsub), B), ]
  dsample <- rbind(dsample, dsub) 
  }
)

# size per stratum in resulting df is 10 % of original size:
table(dsample$stratum)

HTH, Кей

пс: время процессора на моем реликтовом ноутбуке составляет 0,09!

...