2012-03-14 3 views
4

"샘플링"패키지를 사용하여 계층화 된 샘플을 R로 만들려면 어떻게해야합니까? 데이터 세트에는 355,000 회의 관측이 있습니다. 코드는 마지막 줄까지 잘 작동합니다. 아래 코드는 내가 작성한 코드이지만 항상 다음과 같은 메시지가 나타납니다. "sort.list (y)의 오류 : 'x'는 'sort.list'에 대해 원자 적이어야합니다. 'sort'를 목록에 호출 했습니까?상태 별 층화 샘플을 만드는 방법 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

이 = "STATE"stratanames에 의해 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, 케이

추신 : 내 잔존하는 노트북에 CPU 시간이 0.09입니다!

+0

위대한 솔루션 ...하지만 샘플링 패키지 및 지층 함수의 장점 중 하나는 다른 샘플링 알고리즘입니다. – dickoa

+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

관련 문제