【问题标题】:drawing a stratified sample in R在 R 中绘制分层样本
【发布时间】:2011-10-31 07:13:58
【问题描述】:

设计我的分层样本

library(survey)
design <- svydesign(id=~1,strata=~Category,  data=billa, fpc=~fpc)

到目前为止一切顺利,但我现在如何以与简单采样相同的方式绘制样本?

set.seed(67359)  
samplerows <- sort(sample(x=1:N, size=n.pre$n))

【问题讨论】:

    标签: r survey sampling


    【解决方案1】:

    如果您有分层设计,那么我相信您可以在每个层中随机抽样。这是一个在每个层中进行比例抽样的简短算法,使用ddply:

    library(plyr)
    set.seed(1)
    dat <- data.frame(
        id = 1:100,
        Category = sample(LETTERS[1:3], 100, replace=TRUE, prob=c(0.2, 0.3, 0.5))
    )
    
    sampleOne <- function(id, fraction=0.1){
      sort(sample(id, round(length(id)*fraction)))
    }
    
    ddply(dat, .(Category), summarize, sampleID=sampleOne(id, fraction=0.2))
    
       Category sampleID
    1         A       21
    2         A       29
    3         A       72
    4         B       13
    5         B       20
    6         B       42
    7         B       58
    8         B       82
    9         B      100
    10        C        1
    11        C       11
    12        C       14
    13        C       33
    14        C       38
    15        C       40
    16        C       63
    17        C       64
    18        C       71
    19        C       92
    

    【讨论】:

    • 谢谢,我希望 R 能提供这样的功能。令人沮丧的是,我总是必须发现我需要为自己修复什么以及 R 很容易提供什么。我不是统计学家,所以我总是害怕犯错误
    • 不错的一个! sampleOne 是我正在寻找的功能。 tapply(dat$id, dat$Category, sampleOne, fraction = 0.1) 也适用于小样本。
    【解决方案2】:

    看看 CRAN (pdf here) 上的 sampling 包,尤其是 strata 函数。

    这是一个了解您是否正在进行调查的好工具; its page on CRAN 提供了几个小插曲。

    task view on "Official Statistics" 包含几个与调查设计和抽样问题密切相关的主题 - 浏览它,推荐的软件包还可能介绍您可以在工作中使用的其他工具。

    【讨论】:

      【解决方案3】:

      您可以使用dplyr 绘制分层样本。首先,我们按我们感兴趣的一个或多个列进行分组。在我们的示例中,每个 Species 有 3 条记录。

      library(dplyr)
      set.seed(1)
      iris %>%
        group_by (Species) %>%
        sample_n(., 3)
      

      输出:

      Source: local data frame [9 x 5]
      Groups: Species
      
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
      1          4.3         3.0          1.1         0.1     setosa
      2          5.7         3.8          1.7         0.3     setosa
      3          5.2         3.5          1.5         0.2     setosa
      4          5.7         3.0          4.2         1.2 versicolor
      5          5.2         2.7          3.9         1.4 versicolor
      6          5.0         2.3          3.3         1.0 versicolor
      7          6.5         3.0          5.2         2.0  virginica
      8          6.4         2.8          5.6         2.2  virginica
      9          7.4         2.8          6.1         1.9  virginica
      

      【讨论】:

        【解决方案4】:

        这是一种快速的方法,可以从 mtcars 数据帧中对每个不同的 'carb' 值采样三个记录而无需替换

        # choose how many records to sample per unique 'carb' value
        records.per.carb.value <- 3
        
        # draw the sample
        your.sample <- 
            mtcars[ 
                unlist( 
                    tapply( 
                        1:nrow( mtcars ) , 
                        mtcars$carb , 
                        sample , 
                        records.per.carb.value 
                    ) 
                ) , ]
        
        # print the results to the screen
        your.sample
        

        请注意,survey 包主要用于分析复杂的样本调查数据,而不是创建它。 @Iterator 是正确的,您应该查看 sampling 包以了解更高级的方法来创建复杂的样本调查数据。 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多