5

「サンプリング」パッケージを使用してRで層化サンプルを作成するにはどうすればよいですか? 私のデータセットには 355,000 の観測があります。コードは最後の行まで正常に機能します。以下は私が書いたコードですが、常に次のメッセージが表示されます。

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")}
4

2 に答える 2

6

昨年も似たようなことをしなければなりませんでした。これを頻繁に行う場合は、以下のような関数を使用することをお勧めします。この関数を使用すると、サンプリング元のデータ フレームの名前、どの変数が ID 変数であるか、どの変数が層であるか、および「set.seed」を使用するかどうかを指定できます。関数を「stratified.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))
}
于 2012-03-15T04:56:18.147 に答える
0

階層関数を知らなくても、少しコーディングするだけで、次のことが可能になります。

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、ケイ

ps: 私の遺品のラップトップの CPU 時間は 0.09 です!

于 2012-03-14T15:21:50.173 に答える