【问题标题】:Control frequency over random generation随机生成的控制频率
【发布时间】:2017-03-15 12:24:47
【问题描述】:

我应该制作一个包含 2 个特征的随机数据框

gender <- sample(c("Male","Female"), 10000, replace = TRUE, prob = c( 0.5, 0.5))
handed <- sample(c("left_Handed","right_Handed"), 10000, replace = TRUE, prob = c( 0.1, 0.9))

data <- data.frame(gender = gender, handed = handed)
table(data$gender, data$handed)

它工作正常,但我需要让它只有一个表格单元格的值在 50 到 90 之间。

我不知道该怎么做?

当前表给我

             left_Handed   right_Handed
  Female          59         4922
  Male            55         4964

如你所见,它给了我 2 个值低于 100 的单元格。

【问题讨论】:

  • 为什么?这似乎与您的潜在概率模型不一致。如果您想对性别和惯用手之间的依赖关系进行建模,那么您必须首先确定这种依赖关系是什么,然后以反映它的方式进行采样。
  • 您从边际分布中独立采样,但您希望联合分布具有不同的结构? (在那里,你有一些关键词要研究!)另见stackoverflow.com/questions/2281561/…
  • @JohnColeman 这是一个问题的要求,找到控制每个单元格频率的解决方案

标签: r statistics


【解决方案1】:

您可以使用命中注定的方法:

f <- function(){
    gender <- sample( c("Male","Female"), 10000, replace=TRUE, prob=c( 0.5, 0.5) )
    handed <- sample( c("left_Handed","right_Handed"), 10000, replace=TRUE, prob=c( 0.01, 0.9) )
    data<-data.frame(gender=gender,handed=handed)
    tb <- table(data$gender,data$handed)
    if (min(tb[,1]) < 50 && max(tb[,1])>=50) tb else f()
}

这个函数递归地运行你的代码,直到得到它喜欢的输出。

典型运行:

> f()

         left_Handed right_Handed
  Female          59         4970
  Male            48         4923

当然,修改函数使其使用循环而不是递归很容易,但是上面的代码稍微简洁一些,并且第一列中单元格的预期值为 50,有只需要少量的递归调用,因此堆栈空间不是问题。

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 2015-02-05
    • 2021-04-14
    • 2011-01-10
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多