如何在R中生成给定分布、均值、SD、偏斜和峰度?

如何在R中生成给定分布、均值、SD、偏斜和峰度?,r,statistics,skew,frequency-distribution,R,Statistics,Skew,Frequency Distribution,是否有可能在R中生成均值、SD、偏斜和峰度已知的分布?到目前为止,最好的方法似乎是创建随机数并相应地进行变换。 如果有一个包专门用来生成可以修改的特定发行版,我还没有找到它。 谢谢,这些参数实际上并没有完全定义一个分布。为此,您需要一个密度或等效的分布函数。正如@David和@Carl在上面所写的,有几个包专门用于生成不同的分布,例如 如果您对该理论感兴趣(如何使用给定参数绘制适合特定分布的数字样本),则只需寻找适当的公式,例如,参见,并使用提供的参数组成一个简单的质量体系,以计算比例和形状 请

是否有可能在R中生成均值、SD、偏斜和峰度已知的分布?到目前为止,最好的方法似乎是创建随机数并相应地进行变换。 如果有一个包专门用来生成可以修改的特定发行版,我还没有找到它。
谢谢,这些参数实际上并没有完全定义一个分布。为此,您需要一个密度或等效的分布函数。

正如@David和@Carl在上面所写的,有几个包专门用于生成不同的分布,例如

如果您对该理论感兴趣(如何使用给定参数绘制适合特定分布的数字样本),则只需寻找适当的公式,例如,参见,并使用提供的参数组成一个简单的质量体系,以计算比例和形状


请参阅一个具体示例,其中我根据平均值和标准偏差计算了所需beta分布的alpha和beta参数。

SuppDists包中有一个Johnson分布。Johnson会给你一个匹配矩或分位数的分布。其他人的评论是正确的,4分钟并不是一个分配。但约翰逊肯定会尝试

下面是一个将Johnson拟合到某些样本数据的示例:

require(SuppDists)

## make a weird dist with Kurtosis and Skew
a <- rnorm( 5000, 0, 2 )
b <- rnorm( 1000, -2, 4 )
c <- rnorm( 3000,  4, 4 )
babyGotKurtosis <- c( a, b, c )
hist( babyGotKurtosis , freq=FALSE)

## Fit a Johnson distribution to the data
## TODO: Insert Johnson joke here
parms<-JohnsonFit(babyGotKurtosis, moment="find")

## Print out the parameters 
sJohnson(parms)

## add the Johnson function to the histogram
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")
这将产生以下结果:


有人知道为什么约翰逊在使用瞬间健身时似乎有偏见吗

这是一个有趣的问题,并没有很好的解决方案。我认为,即使你不知道其他时刻,你也知道分布应该是什么样子。例如,它是单峰的

解决这个问题有几种不同的方法:

  • 假设基础分布和匹配时刻。有许多标准的R包可以实现这一点。一个缺点是,多元概括可能不清楚

  • 鞍点近似。在本文中:

    Gillespie,C.S.和Renshaw,E.数学生物科学,2007年

    我们只考虑在最初几分钟内恢复pdf/pmf。我们发现这种方法在偏度不太大的情况下有效

  • 拉盖尔展开:

    穆斯塔法,H.和迪米特拉科普洛萨,R。计算机与数学与应用,2010年

    本文中的结果似乎更有希望,但我还没有对它们进行编码


  • 我同意你需要密度估计来复制任何分布。然而,如果你有数百个变量,就像蒙特卡罗模拟中的典型情况一样,你需要一个折衷方案

    一种建议的方法如下:

  • 使用Fleishman变换获得给定倾斜和峰度的系数。Fleishman得到了倾斜和峰度,并给出了系数
  • 生成N个正态变量(平均值=0,标准值=1)
  • 使用Fleishman系数变换(2)中的数据,以将法线数据变换为给定的倾斜和峰度
  • 在该步骤中,使用步骤(3)中的数据,并使用新的_数据=所需平均值+(步骤3中的数据)*所需标准,将其转换为所需平均值和标准偏差(std)
  • 步骤4的结果数据将具有所需的平均值、标准差、偏度和峰度

    注意事项:

  • Fleishman不会为歪斜和kurtois的所有组合工作
  • 以上步骤假设非相关变量。如果要生成相关数据,则需要在Fleishman变换之前执行一个步骤

  • 这个问题是三年多前提出来的,所以我希望我的回答不会太晚

    当知道某些时刻时,有一种方法可以唯一地识别分布。这就是最大熵法。这种方法产生的分布是一种分布,在已知的情况下,它最大限度地提高了您对分布结构的无知。任何其他也具有您指定的矩但不是MaxEnt分布的分布都会隐式地假定比您输入的结构更多的结构。最大化的函数是香农的信息熵,$s[p(x)]=-\int p(x)log p(x)dx$。知道平均值、sd、偏度和峰度,分别转化为分布的第一、第二、第三和第四矩上的约束

    然后,问题是根据约束条件最大化S: 1) $\int x p(x)dx=“第一时刻”$, 2) $\int x^2 p(x)dx=“第二时刻”$, 3) ... 等等

    我推荐《Harte,J.,最大熵和生态学:丰度、分布和能量学理论》(牛津大学出版社,纽约,2011年)一书

    以下是试图在R中实现此功能的链接:
    一个解决方案可能是PearsonDS库。它允许您结合使用前四个矩和峰度>偏度^2+1的限制

    要从该分布生成10个随机值,请尝试:

    library("PearsonDS")
    moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
    rpearson(10, moments = moments)
    
    库(“PearsonDS”)
    
    矩熵方法是一个好主意,但是如果你有数据样本,与仅使用矩相比,你使用了更多的信息!因此,瞬间拟合通常不太稳定。如果你没有关于分布的更多信息,那么熵是一个好概念,但是如果你有更多信息,例如关于支持,那么就使用它!如果您的数据是倾斜的和正的,那么使用对数正态模型是一个好主意。如果你也知道上尾翼是有限的,那么不要使用对数正态分布,但可能使用4参数贝塔分布。如果对支撑或尾部特征一无所知,那么可能可以使用缩放和移位对数正态模型。如果您需要更多关于峰度的灵活性,例如,带有缩放+移位的logT通常是好的。如果您知道拟合应接近正常值,这也会有所帮助,如果是这种情况,请使用包含nor的模型
    library("PearsonDS")
    moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
    rpearson(10, moments = moments)