【问题标题】:How to sample discrete distribution conditional on factor within for if loop如何在for if循环中根据因子对离散分布进行采样
【发布时间】:2019-04-04 12:48:21
【问题描述】:

我正在尝试通过从特定的离散分布中采样来生成虚拟数据 - 以因子的水平为条件(因此每个因子水平的分布不同),然后希望将每个随机结果插入到新的数据框列中对应于因子水平的行。如果您运行下面的代码,您将看到“data$last”为空。我不确定我做错了什么,我也尝试过没有循环,将每个级别的复制设置为 100 - 但是分布不正确。

#Create data frame with factor 
set.seed(1)
ID<-(1:200)
gender<-sample(x = c("Male","Female"), 200, replace = T, prob = c(0.5, 0.5))
data<-data.frame(ID,gender)

#Generate random response based on discrete distribution conditional on gender
data$last <- for (i in 1:nrow(data)) {if(data$gender=="Male") {
sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
} else {
sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
}
}

【问题讨论】:

    标签: r for-loop sample


    【解决方案1】:

    你应该重写你的 for 循环来分配循环内的每个 data$last 值:

    for (i in 1:nrow(data)) {
      if(data$gender[i]=="Male") {
        data$last[i] = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
      } else {
        data$last[i] = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
      }
    }
    

    或者没有for循环:

    data$last = ifelse(data$gender=="Male", 
                   sample(x = c("Today","Yesterday"), length(data$gender[(data$gender=="Male")==TRUE]), replace = T, prob = c(0.8, 0.2)), 
                   sample(x = c("Today","Yesterday"), length(data$gender[(data$gender!="Male")==TRUE]), replace = T, prob = c(0.3, 0.7)))
    

    【讨论】:

    • 这非常令人困惑,因为上面的第一个版本为两种性别生成几乎相同的分布,而第二个“没有 for-loop”根据性别在今天或昨天产生 100%。以下是作为表格查看的后续代码: #Requirements library(expss) library(magrittr) #Label and order data$gender% tab_cells(last) %>% tab_cols(banner) %>% tab_stat_cpct() %>% tab_pivot()
    • 我错误地将样本大小固定为 1,现在已修改。
    • 使用上面的第一个版本和循环,它在第一次运行时工作,男性大约为 0.8、0.2,女性大约为 0.3、0.7。奇怪的是,如果再次重新运行,它会恢复到大约 0.3,0.7 分布。男女皆宜。
    • 谢谢,我接受第一个示例作为答案,但前提是 'data$gender
    【解决方案2】:
    #Generate random response based on discrete distribution conditional on gender
    data$last <- sapply(1:nrow(data),function(i){if(data$gender[i]=="Male") {
      s =sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.8, 0.2))
    } else {
      s = sample(x = c("Today","Yesterday"), 1, replace = T, prob = c(0.3, 0.7))
    }
      return(s)
    })
    

    检查您不是如何寻找特定的data$gender,而是寻找整个向量。另外,使用return(s)返回结果

    【讨论】:

    • 我发现它为男性和女性生成了一个大约为 80:20(今天:昨天)的分布,其中样本函数中指定的概率对于两种性别都完全不同。
    • 抱歉,function(i)data$gender[x] 使用了不同的字母。现在应该可以工作了!
    • 谢谢,但由于某种原因,它第一次工作,然后如果你重复你的代码,它会恢复到同样的问题。使用这段代码你可以看到:#Requirements library(expss) library(magrittr) #Label and order data$gender% tab_cells(last) %>% tab_cols(banner) %>% tab_stat_cpct() %>% tab_pivot()
    猜你喜欢
    • 2019-02-23
    • 2016-04-22
    • 1970-01-01
    • 2021-03-04
    • 2016-01-10
    • 2011-09-02
    • 2020-06-03
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多