从R中的完全高斯拟合数据获得分位数

时间:2016-09-25 18:14:08

标签: r normal-distribution quantile

我一直在努力研究R如何计算分位数和数据的正常拟合。 我的数据(NDVI值)遵循截断的正态分布(见图)density plot of my data

我有兴趣从数据和拟合正态分布曲线中获得最低的第10百分位值(p = 0.1)。

根据我的理解,因为数据被截断,两者应该是完全不同的:我期望数据中的分位数高于从正态分布计算的分位数,但事实并非如此。对于我对分位数函数的理解,帮助数据中的分位数应该是默认的分位数函数:

q=quantile(y, p=0.1)

而来自正态分布的分位数是:

qx=quantile(y, p=0.1, type=9)

然而,这两个结果在所有情况下都非常接近,这让我想知道哪种类型的分布R适合数据来计算分位数(截断正态分布?)

我还试图根据拟合法线计算分位数:

fitted=fitdist(as.numeric(y), "norm", discrete = T)
fit.q=as.numeric(quantile(fitted, p=0.1)[[1]][1])

但没有区别。

所以我的问题是: R是什么曲线拟合分位数的数据,特别是对于类型= 9?如何根据完整的正态分布(包括下尾)计算分位数?

我不知道如何为此生成可重现的示例,但数据可在https://dl.dropboxusercontent.com/u/26249349/data.csv

获取

谢谢!

1 个答案:

答案 0 :(得分:1)

R在确定分位数时使用数据的经验排序,而不是假定任何特定分布。

截断数据的第10个百分位数和适合您数据的正态分布恰好相当接近,尽管第1个百分位数有点不同。例如:

# Load data
df = read.csv("data.csv", header=TRUE, stringsAsFactors=FALSE)

# Fit a normal distribution to the data
df.dist = fitdist(df$x, "norm", discrete = T)

现在让我们得到拟合分布和原始数据的分位数。除了第10百分位数之外,我还包括了第1个百分位数。您可以看到拟合的正态分布的第10个百分位数略低于数据的分布。然而,拟合正态分布的第1个百分位数 更低。

quantile(df.dist, p=c(0.01, 0.1))
Estimated quantiles for each specified probability (non-censored data)
           p=0.01    p=0.1
estimate 1632.829 2459.039
quantile(df$x, p=c(0.01, 0.1))
       1%     10% 
  2064.79 2469.90
quantile(df$x, p=c(0.01, 0.1), type=9)
        1%      10% 
  2064.177 2469.400

您还可以通过直接排名数据并获得正态分布的第1和第10个百分位来看到这一点,其中均值和sd等于来自fitdist的拟合值:

# 1st and 10th percentiles of data by direct ranking
df$x[order(df$x)][round(c(0.01,0.1)*5780)]
[1] 2064 2469

# 1st and 10th percentiles of fitted distribution 
qnorm(c(0.01,0.1), df.dist$estimate[1], df.dist$estimate[2])
[1] 1632.829 2459.039

让我们绘制原始数据(蓝色)和拟合正态分布(红色)生成的假数据的直方图。重叠区域是紫色。

# Histogram of data (blue)
hist(df$x, xlim=c(0,8000), ylim=c(0,1600), col="#0000FF80")

# Overlay histogram of random draws from fitted normal distribution (red)
set.seed(685)
set.seed(685)
x.fit = rnorm(length(df$x), df.dist$estimate[1], df.dist$estimate[2])
hist(x.fit, add=TRUE, col="#FF000080")

enter image description here

或者我们可以绘制数据(蓝色)的经验累积分布函数(ecdf)和拟合正态分布(红色)的随机抽取。水平灰线表示第10个百分位数:

plot(ecdf(df$x), xlim=c(0,8000), col="blue")
lines(ecdf(x.fit), col="red")
abline(0.1,0, col="grey40", lwd=2, lty="11")

enter image description here

现在我已经完成了这个,我想知道你是否期望fitdist返回正常分布的参数,如果你的数据真的来自正态分布并且没有被截断,我们会得到这些参数。相反,fitdist返回正态分布,其中包含(截断的)数据的均值和sd,因此fitdist返回的分布向右移动,与我们可能“期望”它的位置相比是。

c(mean=mean(df$x), sd=sd(df$x))
     mean        sd 
3472.4708  790.8538
df.dist$estimate
     mean        sd 
3472.4708  790.7853

或者,另一个快速示例:x通常分布为均值〜0和sd~1。xtrunc删除小于-1的所有值,xtrunc.dist是{的输出{1}}上的{1}}:

fitdist

你可以在下面的ecdf图中看到,截断数据和拟合截断数据的正态分布大约相同的第10个百分位数,而未截断数据的第10个百分位数(正如我们所期望的那样)转移到左

enter image description here