在 R 中使用精确均值和标准差从截断正态分布生成数据

Lio*_*ens 3 r truncated

我正在努力完成以下任务:我需要从截断的正态分布生成数据。样本均值和标准差应与总体中指定的值完全匹配。这是我到目前为止所拥有的:

    mean <- 100
    sd <- 5
    lower <- 40
    upper <- 120
    n <- 100   

    library(msm)    
    data <- as.numeric(mean+sd*scale(rtnorm(n, lower=40, upper=120)))
Run Code Online (Sandbox Code Playgroud)

创建的样本完全采用总体中指定的平均值和标准差。但有些值超出了预期范围。知道如何解决这个问题吗?我正在考虑切断这些界限之外的所有值,但平均值和标准差不再类似于总体的值。

Ori*_*osa 5

您可以使用迭代答案。在这里,我将样本一一添加到向量中,但前提是生成的缩放数据集保持在您设置的边界内。虽然需要更长的时间,但它有效:

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
Run Code Online (Sandbox Code Playgroud)

在我的旧答案下面,这不太有效

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,即使使用 1000000 个样本,您也可以获得准确的平均值和标准差,并且最大值和最小值仍保持在您的边界内。