45

是否可以在 R 中生成均值、SD、偏斜和峰度已知的分布?到目前为止,最好的方法似乎是创建随机数并相应地转换它们。如果有专门用于生成可以调整的特定发行版的软件包,我还没有找到它。谢谢

4

8 回答 8

34

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")

最终的情节如下所示:

在此处输入图像描述

您可以看到其他人指出的一些问题,即 4 个矩不能完全捕获分布。

祝你好运!

编辑 正如哈德利在评论中指出的那样,约翰逊的身材看起来不太好。我做了一个快速测试并moment="quant"使用 5 个分位数而不是 4 个矩来拟合 Johnson 分布的 Johnson 分布。结果看起来好多了:

parms<-JohnsonFit(babyGotKurtosis, moment="quant")
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")

产生以下内容:

在此处输入图像描述

任何人都知道为什么约翰逊在适合使用时刻时似乎有偏见?

于 2011-01-26T20:35:37.790 回答
14

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

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

  1. 假设一个潜在的分布和匹配时刻。有许多标准的 R 包可以做到这一点。一个缺点是多元泛化可能不清楚。

  2. 鞍点近似。在本文中:

    Gillespie, CS 和 Renshaw, E.改进的鞍点近似。 数学生物科学,2007。

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

  3. 拉盖尔扩展:

    Mustapha, H. 和 Dimitrakopoulosa, R.具有矩的多元概率密度的广义拉盖尔展开计算机与数学与应用,2010 年。

    本文中的结果似乎更有希望,但我没有将它们编码。

于 2011-01-26T21:35:46.930 回答
10

这个问题是3年前提出的,所以我希望我的回答不会太晚。

当知道一些时刻时,有一种方法可以唯一地识别分布。那就是最大熵的方法。这种方法产生的分布是最大化你对分布结构的无知的分布,给定你所知道的。任何其他也具有您指定的矩但不是 MaxEnt 分布的分布都隐含地假设比您输入的结构更多。最大化的泛函是香农的信息熵,$S[p(x)] = - \int p(x)log p(x) dx$。知道均值、sd、偏度和峰度,分别转化为对分布的第一、第二、第三和第四矩的约束。

然后问题是在约束条件下最大化S :1) $\int xp(x) dx = "first moment"$, 2) $\int x^2 p(x) dx = "second moment"$, 3 ) ... 等等

我推荐《Harte, J., Maximum Entropy and Ecology: A Theory of Abundance, Distribution, and Energetics (Oxford University Press, New York, 2011)》一书。

这是一个尝试在 R 中实现此功能的链接: https ://stats.stackexchange.com/questions/21173/max-entropy-solver-in-r

于 2014-10-23T16:25:32.250 回答
10

一种解决方案可能是 PearsonDS 库。它允许您使用前四个矩的组合,并具有峰度 > 偏度^2 + 1 的限制。

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

library("PearsonDS")
moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
rpearson(10, moments = moments)
于 2018-10-16T19:52:26.147 回答
4

我同意您需要密度估计来复制任何分布。但是,如果您有数百个变量,这在 Monte Carlo 模拟中很典型,您就需要做出妥协。

一种建议的方法如下:

  1. 使用 Fleishman 变换获取给定偏斜和峰度的系数。Fleishman 采用偏斜和峰度并为您提供系数
  2. 生成 N 个正态变量(mean = 0,std = 1)
  3. 使用 Fleishman 系数变换 (2) 中的数据,将正常数据变换为给定的偏斜和峰度
  4. 在此步骤中,使用来自步骤 (3) 的数据并将其转换为所需的均值和标准差 (std),使用 new_data = desired mean + (data from step 3)* desired std

第 4 步得到的数据将具有所需的均值、标准差、偏度和峰度。

注意事项:

  1. Fleishman 不适用于偏度和峰度的所有组合
  2. 上述步骤假设不相关的变量。如果要生成相关数据,则需要在 Fleishman 变换之前执行一个步骤
于 2013-01-22T01:40:53.483 回答
2

这些参数实际上并没有完全定义分布。为此,您需要一个密度或等效的分布函数。

于 2011-01-26T17:08:41.957 回答
1

熵方法是一个好主意,但是如果您有数据样本,则与仅使用矩相比,您将使用更多信息!因此,力矩拟合通常不太稳定。如果您没有关于分布的更多信息,那么熵是一个很好的概念,但是如果您有更多信息,例如关于支持的信息,那么就使用它!如果您的数据偏斜且为正,那么使用对数正态模型是一个好主意。如果您也知道上尾是有限的,那么不要使用对数正态分布,而可能使用 4 参数 Beta 分布。如果对支持或尾部特征一无所知,那么缩放和移位的对数正态模型可能很好。如果您需要更多关于峰度的灵活性,那么例如带有缩放 + 移位的 logT 通常就可以了。如果您知道合身应该接近正常,它也会有所帮助,如果是这种情况,则使用包含正态分布的模型(通常无论如何),否则您可以例如使用广义割线双曲线分布。如果你想做这一切,那么在某些时候模型会有一些不同的情况,你应该确保没有间隙或不良的过渡效果。

于 2019-01-11T11:38:28.487 回答
0

正如@David 和@Carl 上面所写,有几个包专门用于生成不同的分布,请参见例如CRAN 上的概率分布任务视图

如果您对理论感兴趣(如何使用给定参数绘制适合特定分布的数字样本),那么只需寻找适当的公式,例如查看Wiki 上的 gamma 分布,并使用提供了计算比例和形状的参数。

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

于 2011-01-26T17:46:03.557 回答