簡體   English   中英

R - 具有預定義的min,max,mean和sd值的隨機分布

[英]R - random distribution with predefined min, max, mean, and sd values

我想生成具有預定義的min,max,mean和sd值的10,000個數字的隨機分布。 我已按照此鏈接設置rnorm中的上限和下限,以獲得具有固定最小值和最大值的隨機分布。 但是,在這樣做時,平均值會發生變化。

例如,

#Function to generate values between a lower limit and an upper limit.
mysamp <- function(n, m, s, lwr, upr, nnorm) {
set.seed(1)
samp <- rnorm(nnorm, m, s)
samp <- samp[samp >= lwr & samp <= upr]
if (length(samp) >= n) {
return(sample(samp, n))
}  
stop(simpleError("Not enough values to sample from. Try increasing nnorm."))
} 
Account_Value <- mysamp(n=10000, m=1250000, s=4500000, lwr=50000, upr=5000000, nnorm=1000000)
summary(Account_Value)

# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 50060 1231000 2334000 2410000 3582000 5000000
#Note - though min and max values are good, mean value is very skewed for an obvious reason.
# sd(Account_Value) # 1397349

我不確定我們是否可以生成滿足所有條件的隨機正態分布。 如果有任何其他類型的隨機分布可以滿足所有條件,請分享。

期待您的投入。

-謝謝。

討論:

你好。 這是非常有趣的問題。 需要付出相當大的努力才能正確解決,並不總能找到解決方案。

首先,當您截斷分布(為其設置最小值和最大值)時,標准偏差是有限的(具有最大值取決於最小值和最大值)。 如果你想要它太大的價值 - 你無法得到它。

第二個限制限制意味着 很明顯,如果你想要低於最低值和高於最大值的平均值,它將無法工作,但你可能想要一些太接近極限的東西,但仍然無法滿足。

第三種限制限制了這些參數的組合 我不確定它是如何工作的,但我很確定並非所有的組合都可以滿足。

但是有一些組合可能有用,可能會找到。

解:

問題是:參數是什么:具有定義的極限ab的截斷(切割)分布的meansd ,因此最后平均值將等於desired_mean ,標准偏差將等於desired_sd

重要的是參數值: meansd 截斷之前使用。 所以這就是為什么最終的意思和偏差是不同的。

下面是使用函數optim()解決問題的代碼。 它可能不是解決此問題的最佳解決方案,但它通常有效:

require(truncnorm)

eval_function <- function(mean_sd){
    mean <- mean_sd[1]
    sd <- mean_sd[2]
    sample <- rtruncnorm(n = n, a = a, b = b, mean = mean, sd = sd)
    mean_diff <-abs((desired_mean - mean(sample))/desired_mean)
    sd_diff <- abs((desired_sd - sd(sample))/desired_sd)
    mean_diff + sd_diff
}

n = 1000
a <- 1
b <- 6
desired_mean <- 3
desired_sd <- 1

set.seed(1)
o <- optim(c(desired_mean, desired_sd), eval_function)

new_n <- 10000
your_sample <- rtruncnorm(n = new_n, a = a, b = b, mean = o$par[1], sd = o$par[2])
mean(your_sample)
sd(your_sample)
min(your_sample)
max(your_sample)
eval_function(c(o$par[1], o$par[2]))

如果對此問題有其他解決方案我很感興趣,所以如果您找到其他答案,請發布它們。

編輯:

@Mikko Marttila:感謝您的評論和鏈接: Wikipedia我實施了公式來計算截斷分布的均值和sd。 現在解決方案更加優雅,如果存在,它應該非常准確地計算所需分布的均值和sd。 它的工作速度也快得多。

我實現了eval_function2 ,它應該在optim()函數中使用而不是之前的函數:

eval_function2 <- function(mean_sd){
    mean <- mean_sd[1]
    sd <- mean_sd[2]

    alpha <- (a - mean)/sd
    betta <- (b - mean)/sd

    trunc_mean <- mean + sd * (dnorm(alpha, 0, 1) - dnorm(betta, 0, 1)) / 
                  (pnorm(betta, 0, 1) - pnorm(alpha, 0, 1))

    trunc_var <- (sd ^ 2) * 
                 (1 + 
                  (alpha * dnorm(alpha, 0, 1) - betta * dnorm(betta, 0, 1))/
                  (pnorm(betta, 0, 1) - pnorm(alpha, 0, 1)) -
                 (dnorm(alpha, 0, 1) - dnorm(betta, 0, 1))/
                 (pnorm(betta, 0, 1) - pnorm(alpha, 0, 1)))

    trunc_sd <- trunc_var ^ 0.5

    mean_diff <-abs((desired_mean - trunc_mean)/desired_mean)
    sd_diff <- abs((desired_sd - trunc_sd)/desired_sd)
}

您可以使用beta分布的通用形式,稱為Pearson I類分布 標准β分布是在區間(0,1)上定義的,但您可以對標准β分布式變量進行線性變換,以獲得任意(最小,最大)之間的值。 CrossValidated這個問題的答案解釋了如何使用其均值和方差,以及某些約束來參數化β分布。

雖然可以用期望的min,max,mean和sd來表示截斷的法線和廣義β分布,但是兩個分布的形狀將是非常不同的。 這是因為截斷的正態分布在其支持區間的端點處具有正概率密度,而在廣義β分布中,密度將總是在端點處平滑地降至零。 哪種形狀更優選取決於您的預期應用。

這是R中的一個實現,用於生成具有均值,方差,最小和最大參數化的廣義β分布式觀測。

rgbeta <- function(n, mean, var, min = 0, max = 1)
{
  dmin <- mean - min
  dmax <- max - mean

  if (dmin <= 0 || dmax <= 0)
  {
    stop(paste("mean must be between min =", min, "and max =", max)) 
  }

  if (var >= dmin * dmax)
  {
    stop(paste("var must be less than (mean - min) * (max - mean) =", dmin * dmax))
  }

  # mean and variance of the standard beta distributed variable
  mx <- (mean - min) / (max - min)
  vx <- var / (max - min)^2

  # find the corresponding alpha-beta parameterization
  a <- ((1 - mx) / vx - 1 / mx) * mx^2
  b <- a * (1 / mx - 1)

  # generate standard beta observations and transform
  x <- rbeta(n, a, b)
  y <- (max - min) * x + min

  return(y)
}

set.seed(1)

n <- 10000
y <- rgbeta(n, mean = 1, var = 4, min = -4, max = 5)

sapply(list(mean, sd, min, max), function(f) f(y))
#    [1]  0.9921269  2.0154131 -3.8653859  4.9838290

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM