有没有办法随机生成一组正数,使它们具有所需的均值和标准差?
我有一个算法来生成具有高斯分布的数字,但我不知道如何以保留均值和标准差的方式处理负数.
看起来泊松分布可能是一个很好的近似值,但它只需要一个均值.
编辑:回复中有一些混乱,所以我会试着澄清一下.
我有一组数字给出了平均值和标准差.我想生成一组大小相同的数字,具有相等的均值和标准差.通常情况下,我会使用高斯分布来执行此操作,但在这种情况下,我有一个额外的约束,所有值必须大于零.
我正在寻找的算法不需要是基于高斯的(从评论到目前为止判断,它可能不应该是)并且不需要是完美的.如果得到的数字集的平均值/标准偏差略有不同并不重要 - 我只想要一些通常会在球场上的东西.
我正在尝试使用R和ggplot2绘制分发CDF.但是,在我转换Y轴以获得直线后,我发现在绘制CDF函数时遇到困难.这种情节经常在Gumbel纸质图中使用,但在这里我将使用正态分布作为例子.
我生成数据,并绘制数据的累积密度函数和函数.他们很合适.但是,当我应用Y轴变换时,它们不再适合.
sim <- rnorm(100) #Simulate some data
sim <- sort(sim) #Sort it
cdf <- seq(0,1,length.out=length(sim)) #Compute data CDF
df <- data.frame(x=sim, y=cdf) #Build data.frame
library(scales)
library(ggplot2)
#Now plot!
gg <- ggplot(df, aes(x=x, y=y)) +
geom_point() +
stat_function(fun = pnorm, colour="red")
gg
Run Code Online (Sandbox Code Playgroud)
现在我尝试根据使用的分布变换Y轴.
#Apply transformation
gg + scale_y_continuous(trans=probability_trans("norm"))
Run Code Online (Sandbox Code Playgroud)
点被正确转换(它们位于一条直线上),但功能不是!
但是,如果我这样做,一切似乎都能正常工作,用ggplot计算CDF:
ggplot(data.frame(x=sim), aes(x=x)) +
stat_ecdf(geom = "point") +
stat_function(fun="pnorm", colour="red") +
scale_y_continuous(trans=probability_trans("norm"))
Run Code Online (Sandbox Code Playgroud)
为什么会这样?为什么不手动计算CDF使用比例变换?
我们大多数人可能都知道正态分布曲线,然而那些不熟悉前载和后载正态分布的人,我想提供背景,然后继续陈述我的问题.
前端分布:如下所示,它具有快速启动.例如,在项目中假设在项目早期消耗更多资源的项目中,成本/小时在项目开始时积极分配.

背负荷分布:与前端分布相反,它从较低的坡度开始,并在项目结束时越来越陡峭.例如,当假设大多数资源在项目后期消耗时.

在上图中,绿线是S曲线,表示累计分布(资源在建议时间内的利用率),蓝色列表示该时期内资源的孤立分布(成本/小时).
作为参考,我提供贝尔曲线/标准正态分布(当平均值=中位数时)图表(下面)和相关的公式开头.

问题陈述:我能够生成正态分布曲线(参见下面的公式)但是我无法找到Front loaded或Back Loaded曲线的解决方案.
如何在正态分布中使偏斜向右(正面加载/正向偏斜分布,这意味着平均值大于中位数)和左偏斜(背负/负偏斜分布,这意味着平均值小于中位数)?
公式解释:
单元格B8表示任意选择的标准偏差.它影响正常分布的峰度.在上面的截图中,我选择的正态分布范围是-3SD到3SD.
细胞B9至B18使用以下公式表示Z-Score的均匀分布:
=B8-((2*$B$8)/Period)
Run Code Online (Sandbox Code Playgroud)
单元格C9至C18表示基于Z分数和金额的正态分布,使用以下公式:
=(NORMSDIST(B9)-NORMSDIST(B8))*Amount/(1-2*NORMSDIST($B$8))
Run Code Online (Sandbox Code Playgroud)
更新:根据评论中的一个链接,我最接近下面的情况.问题以黄色模式突出显示,因为使用了不稳定的Rand()函数,图表不应该是平滑的.由于我上面给出的公式没有创建ZigZag模式,我相信我们可以扭曲正态分布并且平滑!

注意:
我正在使用Excel 2016,所以如果任何新推出的公式可以解决我的问题,我欢迎.另外,我对使用UDF并不犹豫.
前负荷和后负荷分布的数量是名义上的.他们可以变化.我只对结果图表的形状感兴趣.
请帮忙!
我有一些数据,我从雷达卫星图像中采样,想要进行一些统计测试.在此之前,我想进行常态测试,以确保我的数据是正常分布的.我的数据似乎是正常分布的,但是当我执行测试时,得到Pvalue为0,表明我的数据不是正常分布的.
我已经附加了我的代码以及分布的输出和直方图(我对python相对较新,所以如果我的代码以任何方式笨拙而道歉).谁能告诉我,如果我做错了什么 - 我发现我的直方图很难相信我的数据不是正常分布的?
values = 'inputfile.h5'
f = h5py.File(values,'r')
dset = f['/DATA/DATA']
array = dset[...,0]
print('normality =', scipy.stats.normaltest(array))
max = np.amax(array)
min = np.amin(array)
histo = np.histogram(array, bins=100, range=(min, max))
freqs = histo[0]
rangebins = (max - min)
numberbins = (len(histo[1])-1)
interval = (rangebins/numberbins)
newbins = np.arange((min), (max), interval)
histogram = bar(newbins, freqs, width=0.2, color='gray')
plt.show()
Run Code Online (Sandbox Code Playgroud)
这打印出:(41099.095955202931,0.0).第一个元素是卡方值,第二个元素是p值.
我已经附上了我所附数据的图表.我认为可能因为我正在处理负值而导致问题因此我将值标准化但问题仍然存在.

为了计算多元法线的CDF,我按照这个例子(对于单变量情况)但不能解释scipy产生的输出:
from scipy.stats import norm
import numpy as np
mean = np.array([1,5])
covariance = np.matrix([[1, 0.3 ],[0.3, 1]])
distribution = norm(loc=mean,scale = covariance)
print distribution.cdf(np.array([2,4]))
Run Code Online (Sandbox Code Playgroud)
产生的输出是:
[[ 8.41344746e-01 4.29060333e-04]
[ 9.99570940e-01 1.58655254e-01]]
Run Code Online (Sandbox Code Playgroud)
如果联合CDF定义为:
P (X1 ? x1, . . . ,Xn ? xn)
Run Code Online (Sandbox Code Playgroud)
那么预期的输出应该是0到1之间的实数.
给定整数范围的开始和结束,如何计算此范围之间的正态分布随机整数?
我意识到正态分布进入 - +无穷大.我猜尾巴可以被截断,所以当一个随机数被计算到范围之外时,重新计算.这提高了范围内整数的概率,但只要这种效果可以容忍(<5%),就可以了.
public class Gaussian
{
private static bool uselast = true;
private static double next_gaussian = 0.0;
private static Random random = new Random();
public static double BoxMuller()
{
if (uselast)
{
uselast = false;
return next_gaussian;
}
else
{
double v1, v2, s;
do
{
v1 = 2.0 * random.NextDouble() - 1.0;
v2 = 2.0 * random.NextDouble() - 1.0;
s = v1 * v1 + v2 * v2;
} while (s >= 1.0 || s == …Run Code Online (Sandbox Code Playgroud) 首先,我应该说明我的统计知识相当有限,所以如果我的问题看似微不足道或者甚至没有意义,请原谅我.
我的数据似乎没有正常分布.通常情况下,当我绘制置信区间时,我会使用平均值+ - 2标准偏差,但我不认为这对于非均匀分布是可以接受的.我的样本量目前设置为1000个样本,这似乎足以确定它是否是正态分布.
我使用Matlab进行所有处理,因此Matlab中是否有任何函数可以轻松计算置信区间(比如说95%)?
我知道有'分位数'和'prctile'功能,但我不确定这是否是我需要使用的.函数'mle'也返回正态分布数据的置信区间,尽管您也可以提供自己的pdf.
我可以使用ksdensity为我的数据创建一个pdf,然后将该pdf输入到mle函数中以给我置信区间吗?
另外,我将如何确定我的数据是否正常分布.我的意思是我现在可以通过查看ksdensity的直方图或pdf来判断,但有没有办法对其进行定量测量?
谢谢!
有一些物理实验的结果,可以表示为直方图[i, amount_of(i)].我想结果可以通过4-6个高斯函数的混合来估计.
Python中是否有一个包,它以直方图作为输入,并返回混合分布中每个高斯分布的均值和方差?
原始数据,例如:

我想用numpy.random.normal创建一个只包含正值的普通分布式数组.例如,以下说明它有时会给出负值,有时会给出正值.如何修改它以便只返回正值?
>>> import numpy
>>> numpy.random.normal(10,8,3)
array([ -4.98781629, 20.12995344, 4.7284051 ])
>>> numpy.random.normal(10,8,3)
array([ 17.71918829, 15.97617052, 1.2328115 ])
>>>
Run Code Online (Sandbox Code Playgroud)
我想我可以这样解决它:
myList = numpy.random.normal(10,8,3)
while item in myList <0:
# run again until all items are positive values
myList = numpy.random.normal(10,8,3)
Run Code Online (Sandbox Code Playgroud) 我在 R 中有一个向量,有 1521298 个点,必须对其进行正态性测试。我选择了 Shapiro-Wilk 测试,但 R 函数shapiro.test()说:
shapiro.test(z_scores) 中的错误:样本大小必须在 3 到 5000 之间
你知道任何其他功能来测试它或如何规避这个问题吗?