我已经坚持了一段时间,所以我决定写一个问题。
问题:如何使用 lower / upper 绑定生成一个随机样本(长度为n)并且使用特定的意味着。< / p>
观察:分布不需要具体(可能是正常的,测试版等)。
Aproaches考虑:
rtnorm
函数(package msm)生成一个在指定范围内具有正态分布的随机数,但它不会保持您想要的平均值。我试过的第二个问题就是我在一个我找不到的问题中找到的这个功能
rBootstrap <- function(n, mean, sd, lowerBound, upperBound){
range <- upperBound - lowerBound
m <- (mean-lowerBound) / range #mapping mean to 0-1 range
s <- sd / range #mapping sd to 0-1 range
a <- (m^2 - m^3 - m*s^2)/s^2 #calculating alpha for rbeta
b <- (m-2*m^2+m^3-s^2+m*s^2)/s^2 #calculating beta for rbeta
data <- rbeta(n,a,b) #generating data
data <- lowerBound + data * range #remaping to given bounds
return(data)
}
这个函数实际上给出了很好的结果,除非: upperBound&gt; lowerBound +(2 * mean - lowerBound)(上限超过从lowerBound到mean的距离的两倍)。
特别是,我希望生成一个长度为1,800的随机样本,其值介于50,000和250,000之间,平均值= 70,000。
答案 0 :(得分:2)
您应该使用截断的正态分布,但应重新校准mean
。如果您查看mean
中的rtnorm
,则会明确说明:mean
是截断前原始正态分布的平均值。
如果您希望OBSERVABLE均值等于所需值,请使用Truncated Normal中的公式:
mu = E + sigma*(f(b) - f(a))/(F(b) - F(a))
此处E
是您想要的平均值(在您的情况下是70,000),f(x)
是高斯密度,F(x)
是累积函数,a
和{{ 1}}是间隔边界(居中和缩放)。
b
计算a = (LB - mu)/sigma
b = (RB - mu)/sigma
后,将其作为mu
参数传递给rtnorm。
注意:您可能希望与mean
进行类似的练习 - 进入rtnorm的内容不是您在采样中要注意的内容,请再次参阅维基参考
更新
好的,我自己得到了代码,虽然现在首先用Python完成(查看 R )。问题是,对于给定的可观察的平均值sigma
位于mu
,f(a)
,f(b)
和F(a)
中,它将问题转换为搜索根非线性方程。但它是可以解决的,请查看code。请注意,它遵循wiki表示法。
例如,对于你的参数和sigma = 12,000,我得到了
F(b)
对于你的参数和sigma = 24,000,我得到了
Found mu = 68430.372119287 for the desired mean 70000.0 and sigma 12000.0
Sampled 100000 truncated gaussians and got observed mean = 70023.15990337673
所以Found mu = 52275.475000378945 for the desired mean 70000.0 and sigma 24000.0
Sampled 100000 truncated gaussians and got observed mean = 69922.16000288539
非常接近大边mu
的左边界,这是预期的行为,但观察到的平均值接近70,000,这就是你想要的。
更新II
这是 R 代码,在github repo中也是
sigma