【问题标题】:How can I create a normal distributed set of data in R?如何在 R 中创建正态分布的数据集?
【发布时间】:2021-10-31 05:01:18
【问题描述】:

我是统计学的新手,我正在学习 R。 我决定做这个练习来练习使用原始数据集进行一些分析。

这就是问题所在:我想创建一个包含 100 个科目的数据集,并且对于每个科目我都有一个测试分数。 这个测试分数的范围是从 0 到 70,平均分数是 48(而且不太可能有人得 0)。

首先我尝试使用 x <- round(runif(100, min=0, max=70)) 创建集合,但后来我发现使用 plot(x) 不是正态分布的。 所以我搜索了另一个 Rcommand 并找到了这个,但我无法确定 min\max:

ex1 <- round(rnorm(100, mean=48 , sd=5))    

我真的不明白我要做什么!

我想编写一个函数,为我提供一组正态分布的数据,范围为 0-70,平均值为 48,标准差不大,以便稍后进行一些 T 检验。 .. 有什么帮助吗?

非常感谢各位

【问题讨论】:

  • 如果您需要正态分布的最小值和最大值,也许您应该研究一个截断-正态分布?我认为你在随意使用它之前应该了解它背后的概念,但如果你认为它是正确的方法,请查看truncnorm包。
  • (为了记录,许多“正态性”的说法有点牵强:例如,如果人类身高是正态分布的,那表明有些人会有一个 高度。我们在大多数统计数据中仍然使用“正态分布”,但很少有事情真正如此。)
  • 我会尝试以不同的方式编写它。如果我画一个高斯并开始添加值,例如:我有 100 个科目,10 个做了 48 分,最常见的分数,然后 9 个做了 45,其他 9 个做了 52,依此类推,直到我得到 1 个做低分1分高分不好吗?
  • 我认为你错过了我关于数学的观点。确保rnorm(.) 始终在两个范围内的一种方法是使用pmax(0, pmin(70, rnorm(100, mean=38, sd=5))) 之类的东西。 但是,在两个极端情况下,您将获得高于正常(非单调)的上涨幅度。作为一个更受限制的例子,试试hist(pmax(28, pmin(48, rnorm(10000, mean=38, sd=5)))) 看看两个极端。 不是“正常”。我不是在谈论实际考虑,我是在谈论技术想法。
  • 使用truncnorm 并非不可能完成的任务。 (坦率地说,许多人可能会争辩说x&lt;110e-14 可能性足以接受,耸耸肩,并使用pmax/pmin。)

标签: r statistics normal-distribution


【解决方案1】:

根据定义,正态分布没有最小值或最大值。如果您与平均值相差几个标准差,则概率密度非常小,但不是 0。您可以截断正态分布,剪掉尾巴。在这里,我使用pminpmax 将任何低于 0 的值设置为 0,以及将任何高于 70 的值设置为 70:

ex1 <- round(rnorm(100, mean=48 , sd=5))   
ex1 <- pmin(ex1, 70)
ex1 <- pmax(ex1, 0)

您可以使用pnorm 计算单个观察值低于或高于某个点的概率。对于 48 的平均值和 5 的 SD,单个观察值小于 0 的概率非常很小:

pnorm(0, mean = 48, sd = 5)
# [1] 3.997221e-22

这个概率非常小,以至于在大多数应用程序中都不需要截断步骤。但是,如果您开始尝试更大的标准偏差,或者更接近边界的平均值,则可能会变得有必要。

这种截断方法很简单,但有点小技巧。如果您使用此方法将分布截断到均值的 1 SD 以内,您最终会得到比均值密度更高的上限和下限!但它对于不太极端的应用程序应该足够好。一种更稳健的方法可能是抽取比您需要的更多的样本,并保持第一个 n 样本在您的范围内。如果你真的想把事情做对,有一些包可以实现截断的正态分布。

(因为正态分布是对称的,并且 100 比 0 离你的均值更远,所以观察值 > 100 的概率更小。)

【讨论】:

  • 老实说,我并没有完全从你的解释中得到这一切……只是我试图做的事情有点过于牵强,无法成为“真正的世界问题”。也许我会更多地研究这种“截断正态分布”,但在我看来,任务比这更简单……我会尝试用不同的方式来写它。如果我画一个高斯并开始添加值,例如:我有 100 个科目,10 个做了 48 分,最常见的分数,然后 9 个做了 45,其他 9 个做了 52,依此类推,直到我得到 1 个做低分1分高分不好吗?
  • 这个过程没有任何随机性,这使得它与任何现实世界的例子都非常脱节。让我们回到概念更简单的均匀分布......
  • 假设您希望分数均匀分布在 1 和 10 之间。如果您有 10 个分数,您可以在 1、2、3、...、10 处各放一个。但这看起来不像现实世界的例子。要使用该分布模拟随机过程,您可以执行sample(1:10, size = 10, replace = TRUE),您将获得每个分数的随机计数。但是,如果你这样做多次并取平均值,你将在大约 10% 的时间内获得每个分数,使用其中具有随机性的过程。
  • 好的,现在我明白了,我试图强迫它做一些不那么做的事情。谢谢解释
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2017-11-02
  • 2021-04-16
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多