从 R 中具有精确均值和 sd 的截断正态分布生成数据
Generate data from truncated normal distribution with exact mean and sd in R
我正在努力完成以下任务:我需要从截断的正态分布生成数据。样本均值和标准差应 完全匹配 总体中指定的值。这是我目前所拥有的:
mean <- 100
sd <- 5
lower <- 40
upper <- 120
n <- 100
library(msm)
data <- as.numeric(mean+sd*scale(rtnorm(n, lower=40, upper=120)))
创建的样本完全符合总体中指定的均值和标准差。但是有些值超出了预期的范围。知道如何解决这个问题吗?我正在考虑切断这些范围之外的所有值,但是 mean 和 sd 不再类似于人口中的值。
您可以使用迭代答案。在这里,我将样本一个一个地添加到向量中,但前提是生成的缩放数据集保持在您设置的边界内。它需要更长的时间,但它有效:
n <- 10000
mean <- 100
sd <- 15
lower <- 40
upper <- 120
data <- rtnorm(1, lower=((lower - mean)/sd), upper=((upper - mean)/sd))
while (length(data) < n) {
sample <- rtnorm(1, lower=((lower - mean)/sd), upper=((upper - mean)/sd))
data_copy = c(data, sample)
data_copy_scaled = mean + sd * scale(data_copy)
if (min(data_copy_scaled) >= lower & max(data_copy_scaled) <= upper) {
data = c(data, sample)
}
}
scaled_data = as.numeric(mean + sd * scale(data))
summary(scaled_data)
Min. 1st Qu. Median Mean 3rd Qu. Max.
40.38 91.61 104.35 100.00 111.28 120.00
sd(scaled_data)
15
低于我的旧答案,它不太有效
用你想要的均值和 sd 缩放 rtnorm
的下限和上限怎么样?
n <- 1000000
mean <- 100
sd <- 5
library(msm)
data <- as.numeric(mean+sd*scale(rtnorm(n, lower=((40 - mean)/sd), upper=((120 - mean)/sd))))
summary(data)
Min. 1st Qu. Median Mean 3rd Qu. Max.
76.91 96.63 100.00 100.00 103.37 120.00
sd(data)
5
在这种情况下,即使样本为 1000000,您也可以获得准确的均值和标准差,并且最大值和最小值仍在您的范围内。
我正在努力完成以下任务:我需要从截断的正态分布生成数据。样本均值和标准差应 完全匹配 总体中指定的值。这是我目前所拥有的:
mean <- 100
sd <- 5
lower <- 40
upper <- 120
n <- 100
library(msm)
data <- as.numeric(mean+sd*scale(rtnorm(n, lower=40, upper=120)))
创建的样本完全符合总体中指定的均值和标准差。但是有些值超出了预期的范围。知道如何解决这个问题吗?我正在考虑切断这些范围之外的所有值,但是 mean 和 sd 不再类似于人口中的值。
您可以使用迭代答案。在这里,我将样本一个一个地添加到向量中,但前提是生成的缩放数据集保持在您设置的边界内。它需要更长的时间,但它有效:
n <- 10000
mean <- 100
sd <- 15
lower <- 40
upper <- 120
data <- rtnorm(1, lower=((lower - mean)/sd), upper=((upper - mean)/sd))
while (length(data) < n) {
sample <- rtnorm(1, lower=((lower - mean)/sd), upper=((upper - mean)/sd))
data_copy = c(data, sample)
data_copy_scaled = mean + sd * scale(data_copy)
if (min(data_copy_scaled) >= lower & max(data_copy_scaled) <= upper) {
data = c(data, sample)
}
}
scaled_data = as.numeric(mean + sd * scale(data))
summary(scaled_data)
Min. 1st Qu. Median Mean 3rd Qu. Max.
40.38 91.61 104.35 100.00 111.28 120.00
sd(scaled_data)
15
低于我的旧答案,它不太有效
用你想要的均值和 sd 缩放 rtnorm
的下限和上限怎么样?
n <- 1000000
mean <- 100
sd <- 5
library(msm)
data <- as.numeric(mean+sd*scale(rtnorm(n, lower=((40 - mean)/sd), upper=((120 - mean)/sd))))
summary(data)
Min. 1st Qu. Median Mean 3rd Qu. Max.
76.91 96.63 100.00 100.00 103.37 120.00
sd(data)
5
在这种情况下,即使样本为 1000000,您也可以获得准确的均值和标准差,并且最大值和最小值仍在您的范围内。