【问题标题】:Generate samples from data following normal distribution but with new mean从遵循正态分布但具有新均值的数据生成样本
【发布时间】:2019-10-30 08:17:45
【问题描述】:

我有一个数字向量

set.seed(1)
x <- rnorm(8334, 1.456977, 0.3552899)
mean(x)
[1] 1.454307

本质上,我想从x 中随机抽取 2000 个数字,以使该样本的平均值更低。

关键是我不想生成新的随机数,而只是从x 中采样,没有替换,这样我就得到了一个具有不同平均值的子集。

谁能帮帮我?

谢谢!

【问题讨论】:

  • rnorm 中使用sample 并选择一个小于您要查找的值的平均值。 TestVector = rnorm(8334, 1.456977, 0.3552899) rnorm(sample(TestVector, 8000), 0.5,0.3552899)
  • @JasonMathews 如何从现有向量中采样?以下代码返回FALSE。 - set.seed(1);x &lt;- rnorm(8334, 1.456977, 0.3552899);y &lt;- rnorm(sample(x, 2000), 0.5,0.3552899);all(y %in% x) # [1] FALSE
  • 我认为它仍然会随机生成数字。 &gt; table(TestVector %in% SampledVector) FALSE 8334 有没有办法从现有向量中采样,所以我得到完全相同的数字?
  • 我的错。应该更加小心。
  • @naeum 你真的想要原始向量的随机子集还是任何子集都可以?

标签: r random normal-distribution


【解决方案1】:

对示例进行随机正态分布

x= rnorm(8334,1.45,0.355)

选择 2000 个数字的样本

y= sample(x,2000)

将 y 平均值降低 0.5

y=y-05

将 y 的 sd 增加 1.5

y= y*1.5

现在 Y 的标准差和平均值约为

mean(y)# ~0.9325603
sd(y)# ~0.5348885

希望这是您正在寻找的答案

【讨论】:

  • 谢谢谢伊。我将在我的原始查询中扩展为什么我需要保留原始数字。你的方法最后仍然给了我不同的数字。
【解决方案2】:

这种方法并不是真正的“随机”,因为它只从小于mean(x) 的值中挑选。让我知道这对你来说是否足够好 -

set.seed(1)

x <- rnorm(8334, 1.456977, 0.3552899)

mean(x)
[1] 1.454307

y <- sample(x, 2000, prob = x <= mean(x)) # x > mean(x) has 0 chance of getting sampled

all(y %in% x)
[1] TRUE

mean(y)
[1] 1.170856

这实际上与 -

z <- sample(x[x <= mean(x)], 2000)

all(z %in% x)
[1] TRUE

mean(z)
[1] 1.172033

另外,对于 2000 个值,可能的最低值 mean 是这个 -

mean(sort(x)[1:2000])
[1] 0.9847526

更新 -

这是从mean(x) 两侧获取随机样本的一种方法,尽管它是任意的,我不知道这是否能保证样本均值小于mean(x)。 -

z <- sample(x, 2000, prob = (x <= mean(x)) + 0.1)

mean(z)
[1] 1.225991

table(z <= mean(x))

FALSE  TRUE 
  202  1798

【讨论】:

  • 使用combn 函数生成多个组合并检查它们的均值是否小于原始均值是否有更好的选择?
  • 我猜combn 你基本上是在进行蛮力搜索。它不会很好地扩展。
  • 对我来说更像是nsum 问题。 cs.stackexchange.com/questions/2973/…
  • 谢谢@Shree!我认为这是迄今为止最接近我想做的事情。
  • @naeum 查看更新的答案。我仍然认为可能有更好的方法。希望其他人可以回答这个问题。
【解决方案3】:

如何进行拒绝采样,即从向量中采样 2000 个数字,直到找到一个满足所需属性的样本?

set.seed(1)
x <- rnorm(8334, 1.456977, 0.3552899)
m_x <-mean(x)

y <- sample(x, 2000)
while(mean(y) >= m_x)
    y <- sample(x, 2000)

mean(y)
#> [1] 1.4477

reprex package (v0.3.0) 于 2019 年 6 月 18 日创建

这应该相当快,因为​​新平均值大于或小于旧平均值的(大致)机会均等。

【讨论】:

  • 谢谢@Ralf!到目前为止,这似乎与我正在寻找的最接近!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多