来自每个因子水平的随机分层样本

时间:2013-11-16 00:15:20

标签: r sample r-factor multisampling

我的数据集包含两个因素:Environments(4个级别),Individuals(每个环境中500个)和响应变量YD。作为我分析的一部分,我必须以下列方式从每个环境中随机抽取100个人:

  1. 在所有四个环境中共有100个人(100个人)
  2. 每个环境不同的100个人(100 * 4 = 400个人)
  3. 2个环境中相同的100个,其他2个环境中的100个(2 * 100 = 200个人)
  4. 我已经使用几行代码解决了这个问题,但是我希望有人会帮我生成一个R函数来做到这一点,这在其他情况下非常有用。

    以下是具有类似结构的示例数据集:

      library(BLR)
      data (wheat)
      Data <- melt(Y)
      colnames(Data) <- c('Individuals','Environments','YD')
    

1 个答案:

答案 0 :(得分:1)

更新回答

我把答案包裹在一个函数中。请注意,这仅适用于4个级别。

colnames(Data)<-c("Individuals","Environments","YD") #removed spaces from names

myfun <- function(DF, samplefrom, samplelevels, sampletype, samplesize)
{
 if(sampletype == "per1")
  {
   Env1 = sample(unique(DF[[samplefrom]]), samplesize)
   Env2 <- Env3 <- Env4 <- Env1
  }
 if(sampletype == "per4")
  {
   Env1 = sample(unique(DF[[samplefrom]]), samplesize)
   Env2 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% Env1], samplesize)
   Env3 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% c(Env1, Env2)], samplesize)
   Env4 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% c(Env1, Env2, Env3)], samplesize)
  }
 if(sampletype == "per2")
  {
   Env1 = sample(unique(DF[[samplefrom]]), samplesize)
   Env2 <- Env1
   Env3 = sample(unique(DF[[samplefrom]])[!unique(DF[[samplefrom]]) %in% Env1], samplesize)
   Env4 <- Env3
  } 

  ret = do.call(rbind, mapply(function(ind, env) {df <- Data[DF[[samplelevels]] == env,]; 
                                                 df[df[[samplefrom]] %in% ind,]},
       env = as.list(sample(unique(DF[[samplelevels]]))), ind = list(Env1, Env2, Env3, Env4), 
            SIMPLIFY = F))    #in `env = ` added `sample` to select the environments 
                               #in random order and assign them the individuals

  return(ret)
}
myfun(Data, "Individuals", "Environments", "per1", 2)
#     Individuals Environments         YD
#21         13954            1  0.6658681
#345       457982            1 -1.1022770
#620        13954            2 -0.4888968
#944       457982            2  0.6026167
#1219       13954            4 -0.7183965
#1543      457982            4  0.4881141
#1818       13954            5  0.2660623
#2142      457982            5 -2.0626073
myfun(Data, "Individuals", "Environments", "per2", 2)
#     Individuals Environments         YD
#25         15292            1 -1.1272386
#248       373045            1 -0.6659416
#624        15292            2 -0.2362053
#847       373045            2  0.5778210
#1260       62150            4  1.2077921
#1654     1541043            4  1.1406084
#1859       62150            5 -0.3358584
#2253     1541043            5  0.3897426
myfun(Data, "Individuals", "Environments", "per4", 2)
#     Individuals Environments         YD
#106        85786            1  1.4480500
#567      3830162            1 -1.8052577
#1029     1301802            2  0.2737786
#1043     1410845            2  1.0617118
#1630     1302304            4  0.6673241
#1678     1766332            4 -0.0451913
#1871       65315            5 -0.0597450
#2336     2621166            5  2.5590801

更新2 一些评论

mapply将函数顺序应用于多个参数。这里,该函数有两个参数:indenv。函数1)将数据帧设置为env,并将子集化数据的子集设置为indenv是一个环境,ind是先前在Env1中计算的个人(myfun,...)的样本。函数mapplied的多个参数是env:[1,2,3,4]和ind:[Env1,Env2,Env3,Env4]。 mapply按顺序env = 1ind = Env1env = 2ind = Env2等,并在列表中提供结果(必要的子集)。 do.call(rbind,)在数据框输出中加入列表。

P.S。请注意,因为使用sample env可以是[1,2,3,4]或[2,4,3,1]或其他什么,所以函数的顺序组合(将{ {1}})参数不仅是mappliedenv = 1,还有ind = Env1env = 1 or 2 or 3 or 4,依此类推。

使用不同的无级别更新3和4 功能

ind = Env1是您希望采用的不同样本的数量;我将其默认为No_different_samples的数量(即每个级别的不同样本)。如果samplelevels不适合无级别(即如果你想要4个级别的人口中的3个不同样本(作为你的No_different_samples),我的函数会给出一个错误,它会抛出一个错误;您必须选择1或2或4.

Data