2016-09-25 26 views
1

數據的完整高斯擬合獲​​得位數我一直在努力爲R如何計算位數和數據的正常安裝。 我有截斷正態分佈後的數據(見圖)density plot of my data從R中

我有興趣從數據和擬合正態分佈曲線得到最低的第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擬合數據計算位數,特別是用於type = 9?我如何根據完整的正態分佈(包括較低的尾部)計算分位數?

我不知道如何爲這個重複的例子,但數據可以在https://dl.dropboxusercontent.com/u/26249349/data.csv

謝謝!確定位數的情況下,而不是假定任何特定分佈

回答

1

R的使用數據的經驗排序。

您的截斷數據的第10百分位和一個正態分佈適合你的數據恰好是八九不離十,雖然第一個百分位是有點不同。例如:

# 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 

您也可以通過數據的直接排名和由fitdist獲得均值和標準差等於擬合值的正態分佈的第1和第10百分位數看到:

# 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。​​分佈式刪除所有值小於 - 1和xtrunc.distfitdist的輸出​​:

set.seed(55) 
x = rnorm(6000) 
xtrunc = x[x > -1] 
xtrunc.dist = fitdist(xtrunc, "norm") 

round(cbind(sapply(list(x=x,xtrunc=xtrunc), function(x) c(mean=mean(x),sd=sd(x))), 
     xtrunc.dist=xtrunc.dist$estimate),3) 

      x xtrunc xtrunc.dist 
mean -0.007 0.275  0.275 
sd 1.009 0.806  0.806 

而且你可以在低於裝在截斷數據截斷數據和正常的分佈具有大致相同的第10百分位的ECDF情節看,雖然未截斷數據的第10百分位是(正如我們期望)向左移動。

enter image description here

+0

美麗而完整的解釋!作爲後續,我如何構建符合我的數據的完整正態分佈(相同的m和sd),但沒有提到您的右移? – ciskoh