是否可以在 R 中生成均值、SD、偏斜和峰度已知的分布?到目前为止,最好的方法似乎是创建随机数并相应地转换它们。如果有专门用于生成可以调整的特定发行版的软件包,我还没有找到它。谢谢
8 回答
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")
产生以下内容:
任何人都知道为什么约翰逊在适合使用时刻时似乎有偏见?
这是一个有趣的问题,实际上并没有很好的解决方案。我认为即使你不知道其他时刻,你也知道分布应该是什么样子。例如,它是单峰的。
有几种不同的方法可以解决这个问题:
假设一个潜在的分布和匹配时刻。有许多标准的 R 包可以做到这一点。一个缺点是多元泛化可能不清楚。
鞍点近似。在本文中:
Gillespie, CS 和 Renshaw, E.改进的鞍点近似。 数学生物科学,2007。
我们着眼于仅在最初的几分钟内恢复 pdf/pmf。我们发现这种方法在偏度不太大的情况下有效。
拉盖尔扩展:
Mustapha, H. 和 Dimitrakopoulosa, R.具有矩的多元概率密度的广义拉盖尔展开。计算机与数学与应用,2010 年。
本文中的结果似乎更有希望,但我没有将它们编码。
这个问题是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
一种解决方案可能是 PearsonDS 库。它允许您使用前四个矩的组合,并具有峰度 > 偏度^2 + 1 的限制。
要从该分布中生成 10 个随机值,请尝试:
library("PearsonDS")
moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
rpearson(10, moments = moments)
我同意您需要密度估计来复制任何分布。但是,如果您有数百个变量,这在 Monte Carlo 模拟中很典型,您就需要做出妥协。
一种建议的方法如下:
- 使用 Fleishman 变换获取给定偏斜和峰度的系数。Fleishman 采用偏斜和峰度并为您提供系数
- 生成 N 个正态变量(mean = 0,std = 1)
- 使用 Fleishman 系数变换 (2) 中的数据,将正常数据变换为给定的偏斜和峰度
- 在此步骤中,使用来自步骤 (3) 的数据并将其转换为所需的均值和标准差 (std),使用 new_data = desired mean + (data from step 3)* desired std
第 4 步得到的数据将具有所需的均值、标准差、偏度和峰度。
注意事项:
- Fleishman 不适用于偏度和峰度的所有组合
- 上述步骤假设不相关的变量。如果要生成相关数据,则需要在 Fleishman 变换之前执行一个步骤
这些参数实际上并没有完全定义分布。为此,您需要一个密度或等效的分布函数。
熵方法是一个好主意,但是如果您有数据样本,则与仅使用矩相比,您将使用更多信息!因此,力矩拟合通常不太稳定。如果您没有关于分布的更多信息,那么熵是一个很好的概念,但是如果您有更多信息,例如关于支持的信息,那么就使用它!如果您的数据偏斜且为正,那么使用对数正态模型是一个好主意。如果您也知道上尾是有限的,那么不要使用对数正态分布,而可能使用 4 参数 Beta 分布。如果对支持或尾部特征一无所知,那么缩放和移位的对数正态模型可能很好。如果您需要更多关于峰度的灵活性,那么例如带有缩放 + 移位的 logT 通常就可以了。如果您知道合身应该接近正常,它也会有所帮助,如果是这种情况,则使用包含正态分布的模型(通常无论如何),否则您可以例如使用广义割线双曲线分布。如果你想做这一切,那么在某些时候模型会有一些不同的情况,你应该确保没有间隙或不良的过渡效果。
正如@David 和@Carl 上面所写,有几个包专门用于生成不同的分布,请参见例如CRAN 上的概率分布任务视图。
如果您对理论感兴趣(如何使用给定参数绘制适合特定分布的数字样本),那么只需寻找适当的公式,例如查看Wiki 上的 gamma 分布,并使用提供了计算比例和形状的参数。
请参阅此处的具体示例,其中我根据均值和标准差计算了所需 beta 分布的 alpha 和 beta 参数。