如何在 R 中创建正态分布的数据集?

问题描述 投票:0回答:1

我是统计学新手,正在学习 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 检验... 有什么帮助吗?

提前非常感谢大家

r statistics normal-distribution
1个回答
5
投票

根据定义,正态分布没有最小值或最大值。如果偏离均值几个标准差,则概率密度非常小,但不是 0。您可以截断正态分布,即砍掉尾部。在这里,我使用

pmin
pmax
设置任何低于 0 到 0 的值,以及高于 70 到 70 的任何值:

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

您可以使用

pnorm
计算单个观测值低于或高于某个点的概率。对于平均值为 48 且标准差为 5 的情况,单个观察值小于 0 的概率非常小:

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

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

这种截断方法虽然简单,但是有点hack。如果您使用此方法将分布截断到均值的 1 SD 以内,则最终会得到上限和下限的尖峰,甚至高于平均值的密度!但对于不太极端的应用来说,它应该工作得足够好。更可靠的方法可能是抽取比您需要的更多的样本,并保留落在您的范围内的第一个

n
样本。如果你真的想把事情做好,有一些包可以实现截断的正态分布。

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

更好的方法

更好的方法可能是选择具有最小值和最大值的不同分布,并且可以配置为您喜欢的形状。例如,β 分布 的范围是 0 到 1。如果将其乘以 70,它将介于 0 到 70 之间,然后您可以四舍五入到最接近的整数。参数 alpha (

shape1
) = 4 和 beta (
shape2
) = 2 的 beta 分布会给你一个相对不太可能为 0 且平均值为 2/3(或 47,在你之后)的分布。乘以 70 并舍入).

{rbeta(1000, shape1 = 4, shape2 = 2) * 70} |>
  round() |>
  hist(main = "Beta version", xlab = "")

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.