2016-02-05 123 views
3

我對seaborn完全陌生,所以如果這是一個簡單的問題,我很抱歉,但我無法在文檔中的任何位置找到如何在kdeplot中控制由n_levels繪製的級別的描述。這是一個例子:在seaborn kdeplot中設置置信度

import seaborn as sns 
import numpy as np 
import matplotlib.pyplot as plt 

x,y=np.random.randn(2,10000) 

fig,ax=plt.subplots() 
sns.kdeplot(x,y, shade=True,shade_lowest=False, ax=ax,n_levels=3,cmap="Reds") 
plt.show() 

這是導致情節:Image

我希望能夠知道顯示什麼樣的信心水平,這樣我可以標註我的情節「陰影區域顯示( a,b,c)百分比置信區間。「我會天真地認爲n_levels在某種程度上與高斯等價的「sigma」有關,但從看起來並非如此的例子。

理想情況下,我想可以指定傳遞一個元組kdeplot,如顯示的時間間隔:

levels=[68,95,99] 

並繪製這些置信區域。

編輯:感謝@Goyo和@tom我想我可以澄清我的問題,並來到我正在尋找的答案的中途。正如指出的那樣,n_levels作爲levels傳遞給plt.cotourf,所以的列表可以通過。但sns.kdeplot繪製PDF,並且PDF中的值與我正在查找的置信區間不符(因爲這些對應於PDF的集成)。

我需要做的是通過sns.kdeplotx,y值的集成(和規範化)的PDF,然後我將能夠進入例如n_levels=[0.68,0.95,0.99,1]

編輯2:我現在已經解決了這個問題。見下文。我使用2d規範直方圖來定義置信區間,然後將其作爲水平傳遞給規範的kde圖。對於重複的道歉,我可以做一個函數來返回關卡,但是我明確地輸入了它。

import numpy as np 
import scipy.optimize 
import matplotlib.pyplot as plt 
import seaborn as sns 

# Generate some random data 
x,y=np.random.randn(2,100000) 

# Make a 2d normed histogram 
H,xedges,yedges=np.histogram2d(x,y,bins=40,normed=True) 

norm=H.sum() # Find the norm of the sum 
# Set contour levels 
contour1=0.99 
contour2=0.95 
contour3=0.68 

# Set target levels as percentage of norm 
target1 = norm*contour1 
target2 = norm*contour2 
target3 = norm*contour3 

# Take histogram bin membership as proportional to Likelihood 
# This is true when data comes from a Markovian process 
def objective(limit, target): 
    w = np.where(H>limit) 
    count = H[w] 
    return count.sum() - target 

# Find levels by summing histogram to objective 
level1= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target1,)) 
level2= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target2,)) 
level3= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target3,)) 

# For nice contour shading with seaborn, define top level 
level4=H.max() 
levels=[level1,level2,level3,level4] 

# Pass levels to normed kde plot 
fig,ax=plt.subplots() 
sns.kdeplot(x,y, shade=True,ax=ax,n_levels=levels,cmap="Reds_d",normed=True) 
ax.set_aspect('equal') 
plt.show() 

所得的情節現在是以下幾點:kde with confidence levels

的水平稍寬比我預期的,但我認爲這是正確的。

+1

我認爲* n_levels簡單地將最小/最大值之間的範圍劃分爲「n」個相同大小的步驟。 – kazemakase

+1

它似乎應該能夠刪除'n_levels'並傳入'levels = [X,Y,Z]'(因爲關卡會傳遞給'plt.contourf')。但我不確定X,Y,Z應該是什麼水平,因爲等值線圖的值不會等於您的百分比置信水平。 – tom

+0

@大衛我認爲你應該澄清你的問題。這是關於「設置seaborn kdeplot的置信水平」,現在我認爲我的答案不會增加它,但我無法弄清楚這可能意味着什麼。你想計算哪個參數的置信區間?它是如何與kde相關的,這是一個非參數估計? – Goyo

回答

1

這些級別不是confidente區間或sigma,而是估計的pdf值。你能夠將級別作爲列表而不是n_levels傳遞。

編輯

Seaborn剛剛繪製的東西。它不會給你估計的PDF,只是一個matplotlib軸。所以如果你想用kde pdf做計算,你必須自己估算一下。

Seaborn在引擎蓋下使用statsmodels或scipy,所以你可以做同樣的事情。 Statsmodels可以給你cdf,如果這是你正在尋找的(也許scipy,但我不知道)。你可以計算你感興趣的級別,在網格中評估pdf並將所有內容傳遞給contourf,這或多或少是seaborn所做的。

不幸的是我沒有足夠的技巧喲給你更多的建議(我只是使用statsmodels OLS迴歸時不時),但你可以看看代碼kdeplot並找出。

+0

順便說一句,'n_levels'是沒有記錄的AFAICT。看看這個代碼,它看起來像是將'N'傳遞給'contour(X,Y,Z,N)'(或'contourf')。 Goyo

+0

是的,'N'與'contourf'的'levels'不一樣,所以我不用不認爲你可以這樣使用它? – tom

+0

@tom和Goyo,謝謝你的幫助。我想我已經澄清了我的問題。 –

-1

我只是面臨同樣的問題。我不明白的是,爲什麼當箱子數量發生變化時,信心水平和情節發生了變化。你在直方圖中選擇了bin = 40,但如果你改變它,你會得到一個不同的圖。