我一直在努力研究R如何计算分位数和数据的正常拟合。 我的数据(NDVI值)遵循截断的正态分布(见图)
我有兴趣从数据和拟合正态分布曲线中获得最低的第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
获取谢谢!
答案 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")
或者我们可以绘制数据(蓝色)的经验累积分布函数(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")
现在我已经完成了这个,我想知道你是否期望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个百分位数(正如我们所期望的那样)转移到左