2012-03-14 8 views
4

「サンプリング」パッケージを使用して階層化サンプルをRで作成するにはどうすればよいですか?データセットには355,000件の観測データがあります。コードは最終行まで正常に動作します。以下は私が書いたコードですが、私はいつも以下のメッセージを受け取ります: "sort.list(y)のエラー: 'x'は 'sort.list'のアトミックでなければなりません。状態別に層別サンプルを作成する方法R

私は古いメッセージを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")} 
+0

stratanames = "STATE"でstratanames = sort.lpdata $ STATEを置き換えてみてください。 – dickoa

答えて

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です!

+0

素晴らしい解決策...しかし、サンプリングパッケージと地層関数の利点の1つは、他のサンプリングアルゴリズムavalaibleです。 – dickoa

+1

あなたのデータセットを使用して、1つのことができます:size < - table(d $ stratum)* p; strat < - strata(d、stratanames = "stratum"、size = size、method = "srswor"); dsample < - getdata(d、strat); テーブル(dsample $ stratum) – dickoa

+0

ソリューションをありがとう。私はそれと一緒に行くだろう。 – vatodorov

5

私は昨年同様のことをしなければなりませんでした。これが大変なことであれば、以下のような関数を使いたいかもしれません。この関数を使用すると、サンプリングするデータフレームの名前を指定できます。変数は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)) 
} 
+0

こんにちはmrdwab、私はあなたのコードに問題があると思います:私は(または他の誰か、もちろん)サイズ> = 1を指定すると、エラーがスローされます。問題はもちろん、 'p'はコードのどこにも定義されていないということです。 – nanounanue

+0

@nanounanue、それを指摘してくれてありがとう。私はちょうど 'p'がワークスペースにある別の答えに積み上げていると思うし、この関数のコピーでもそれを修正するのを忘れてしまった。今修正されました(私は願っています!)。 – A5C1D2H2I1M1N2O1R2T1

関連する問題