基于预定义的比例在R中采样数据

mrwjdhj3  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(82)

我有样本数据:

test <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q",
          "r","s","t","u","v","w","x","y","z")

我想创建1000个样本,每个样本包含5个元素,这样所有5个元素都是唯一的,并且每个元素在1000个样本中的出现率是根据以下比例:

我已经尝试使用下面的代码,但当我检查元素的百分比,例如“a”,它不是预期的

sample_function <- function(){sample(test,5,replace = FALSE, prob = c('0.9',
'0.8','0.45','0.6','0.3','0.05','0.08','0.12','0.79','0.33','0.24','0.1','0.1',
'0.76','0.22','0.2','0.7','0.67','0.35','0.45','0.07','0.11','0.14','0.03','0.02',
'0.05')) }

sample_data <- replicate(1000,sample_function())
sum(sample_data=="a")

我期望的输出接近0.9。如何在R中实现这一点?
样本应该有1000行,两行可以有相同的值集,但所有五个元素应该是唯一的,并满足给定的比例(例如,“a”应该出现约900次,在整个数据集的1000。我得到的数字不接近0.9,比如字母表“a”的0.45)

9njqaruj

9njqaruj1#

测试这个,似乎是工作?

set.seed(42)
# for reproducibility

test <- letters[1:26] # easier than typing them out
freqs <- as.numeric(c('0.9','0.8','0.45','0.6','0.3','0.05','0.08','0.12','0.79','0.33','0.24','0.1','0.1','0.76','0.22','0.2','0.7','0.67','0.35','0.45','0.07','0.11','0.14','0.03','0.02',
                      '0.05')) 
# these should be numbers so don't need quoting - I just copied your typed vector and applied as.numeric()

sample_function <- function(){sample(test,5,replace = FALSE, prob = freqs) }

expectedFreqs = freqs/sum(freqs)
# normalised frequencies

sample_data <- replicate(1000,sample_function())

df <- data.frame(x = (table(sample_data)/length(sample_data)),
       y = expectedFreqs)
# summarising results

library(ggplot2)

ggplot(df, aes(x=x.Freq, y=y)) + geom_point() +
  geom_abline(intercept = 0, slope = 1)
#plot

值得注意的是,你的draw-5-without-replacement子句会扭曲结果-如果有非常常见的选项,情况会很糟糕-想象一下,如果“c”打算有50%的代表性,但它永远不会高于20%
您将看到最常见选项的频率低于预期,而中间选项的频率高于预期。这是同样的种子,有100万次重复:

期望值不正确

在评论中有关于期望的讨论,即如果我们对每个试验的匹配进行计数,则字母“应该”的频率会导致相同的频率(10%的概率字母“应该”在10%的集合中出现)
解释为什么预期是错误的:
考虑允许替换的简化情况。我们想测试一个字母“a”,期望抽取率为10%。
画一个字母有0.1的概率画“a”,因此有1-0.1 = 0.9的概率画非a。
在5次抽奖中抽到你的物品的几率是:

0.1 (first draw)
+ 0.9*0.1 (second draw)
+ 0.9*0.9*0.1 (third draw)
+ 0.9*0.9*0.9*0.1 (fourth draw)
+ 0.9*0.9*0.9*0.9*0.1 (fifth draw).

或者更简单地说,1 - 0.9^5 = 0.40951
现在,如果我们包括5个集合中没有重复的规则,情况会变得更糟:如果我们不先画a,那么我们接下来画它的机会就增加了(因为其中一个选项被从池中删除了):每次我们抽签时,它变得不那么容易预测,因为下一次抽签的概率取决于所有以前的抽签:

0.1 (first draw)
+ 0.9*[>0.1]
+ 0.9*(1-[>0.1])*[>>0.1] etc...

查看更多:https://en.wikipedia.org/wiki/Wallenius%27_noncentral_hypergeometric_distribution

相关问题