通过分布函数估计矩

时间:2018-06-30 12:16:22

标签: r distribution variance skew kurtosis

我有一个非正态分布函数,我想计算它的矩(均值,方差,偏度和峰度)。 我知道的包是e1071moments,它们计算离散值向量的矩。是否有一个程序包可以估算连续分布函数的矩? 作为示例,假设我具有以下分布:

tmp <- runif(100,-10,10)
PDFdata <- density(tmp , kernel = "gaussian")
PDF <- splinefun(PDFdata$x , PDFdata$y)

现在我要计算:

enter image description here

2 个答案:

答案 0 :(得分:3)

您可以使用函数integrate来计算力矩。
您所需要做的就是定义一个整数,我在下面的代码中将其称为int

首先,我将通过设置RNG种子使结果可重现。

set.seed(6126)    # Make the results reproducible

tmp <- runif(100,-10,10)
PDFdata <- density(tmp , kernel = "gaussian")
PDF <- splinefun(PDFdata$x , PDFdata$y)

int <- function(x, c = 0, g = PDF, n = 1) (x - c)^n * g(x)

integrate(int, lower = -15, upper = 15, n = 1)
#-0.3971095 with absolute error < 7.8e-06

integrate(int, lower = -15, upper = 15, n = 2)
#35.76295 with absolute error < 0.0012

plot(PDFdata)
curve(PDF, -15, 15, add = TRUE, col = "blue", lty = "dashed")

density plot

答案 1 :(得分:2)

如果要根据数据估算密度,则最好使用来自数据的经验矩来估算分布矩。如果仅以此为函数示例,则可以使用integrate包中的stats函数。例如,

set.seed(123)
tmp <- runif(100,-10,10)
PDFdata <- density(tmp , kernel = "gaussian")
PDF <- splinefun(PDFdata$x , PDFdata$y)

mean(tmp)
[1] -0.02882012
integrate(function(x) x*PDF(x), -Inf, Inf)
Error in integrate(function(x) x * PDF(x), -Inf, Inf) : 
  the integral is probably divergent

,实际上,对于此数据集,PDF函数不是密度:

plot(PDF, from = -100, to = 100)

enter image description here

因此我们在密度估计范围之外将其强制为零:

PDF2 <- function(x) ifelse(x < min(PDFdata$x) | x > max(PDFdata$x), 0, 
                           PDF(x))

integrate(function(x) x*PDF2(x), -Inf, Inf)
-0.02900585 with absolute error < 8.2e-05