frekventistické tvrzení má smysl, jen pokud lze experiment/událost opakovat!
literatura: Barlow, sec. 7.2
In [1]:
%pylab inline
from scipy import stats
vals=stats.binom(20,0.3).pmf(r_[0:15])
bar(r_[0:15]-0.4,vals)
title("binom. rozdeleni p=0.3")
vals[4],vals[:4].sum()
#stats.binom?
Out[1]:
In [2]:
stats.norm.cdf(2)
Out[2]:
přehledné znázornění trojdim. grafu závislosti pravděpodobnosti na hodnotě $p$ a pozorované hodnotě $i$
In [24]:
x=r_[0.01:0.5:0.01]
for i in range(0,10):
axhline(.1*i,color='gray',alpha=0.2)#,xmax=x[-1])
plot(x,i*0.1+stats.binom(20,x).pmf(i))
axvline(.3)
xlim(x[[0,-1]])
xlabel("p")
Out[24]:
pro (předpoklad) různé hodnoty $p$ lze spočítat pravděpodobnosti, že vyjde méně než daný počet (botlim
) nebo více než daný počet (uplim
) pozitivních výsledků...
In [11]:
botlim=lambda p,n:stats.binom(20,p).cdf(n-1)
uplim=lambda p,n:1-stats.binom(20,p).cdf(n)
x=r_[0.01:0.5:0.01]
plot(x,[uplim(a,4) for a in x],x,[botlim(a,4) for a in x])
legend(["uplim","botlim"])
xlabel("prst. uspechu")
ylabel("pravdep. obsah")
Out[11]:
Nyní zbývá najít řešení této tzv. Clopper-Pearson limity $$\sum_{r=m+1}^n P(r;p_+,n) = 0.975$$ $$\sum_{r=0}^{m-1} P(r;p_-,n) = 0.975$$ (tedy hodnoty $p_+, p_-$ jako horní a dolní mez konfidenčního intervalu)
In [12]:
from scipy import optimize
xbt=optimize.fsolve(lambda p:botlim(p,4)-0.975,0.1)[0]
xup=optimize.fsolve(lambda p:uplim(p,4)-0.975,0.4)[0]
xbt,xup
Out[12]:
In [14]:
#pozorovano 6 z 20
xbt6=optimize.fsolve(lambda p:botlim(p,6)-0.975,0.1)[0]
xup6=optimize.fsolve(lambda p:uplim(p,6)-0.975,0.4)[0]
xbt6,xup6
Out[14]:
Tahle interpretace je jediná smysluplná, pokud narazíme na fyzikální meze skutečných hodnot parametru (často jen kladné hodnoty, někdy omezené shora).
In [15]:
#pozorovano 6 z 20
xbt18=optimize.fsolve(lambda p:botlim(p,18)-0.975,0.6)[0]
xup18=optimize.fsolve(lambda p:uplim(p,18)-0.975,0.95)[0]
xbt18,xup18
Out[15]:
In [26]:
n=100
cont=0.05
p=0.1
i=30
ptrue=r_[.05:1:0.05]
xlo=[stats.binom(n,p).ppf(cont) for p in ptrue]
xhi=[stats.binom(n,p).ppf(1-cont) for p in ptrue]
plot(xlo,ptrue)
plot(xhi,ptrue)
axvline(20)
Out[26]:
Pro normální rozdělení je situace jednodušší díky symetrii integrálu (graf z obr. 2 dává ve směru obou os v řezu gaussovky).
Podmínka $$\int_x^{\infty}{\frac{1}{\sigma\sqrt{2\pi}} e^{(x'-p_-)^2/2\sigma^2} dx'} =0.025$$ je ekvivalentní přímému výpočtu $$\int_{-\infty}^{p_-}{\frac{1}{\sigma\sqrt{2\pi}} e^{(x'-x)^2/2\sigma^2} dx'} = \int_{-\infty}^{p_-+x}{\frac{1}{\sigma\sqrt{2\pi}} e^{x''^2/2\sigma^2} dx''} = 0.025$$
In [32]:
xf=r_[:16:0.2]
qfun=stats.norm(20*0.3,sqrt(0.3*(1-0.3)*20))
bar(r_[0:15]-0.4,vals)
plot(xf,qfun.pdf(xf),'r')
Out[32]:
aproximace úvodního problému rozdělením $N(\mu=n p,\sigma^2=n p(1-p))$
In [43]:
#qfun2=stats.norm(8*0.5,sqrt(0.8*(1-0.5)*8))
qfun2=stats.norm(4,sqrt(4*(1-4./20)))
qfun2.ppf(0.05)/20,qfun2.isf(0.05)/20
Out[43]:
In [40]:
# varianta prikladu 90% konfid. interval pri 4 uspesnych pokusech z 8
botlimq=lambda p,n,nn:stats.binom(nn,p).cdf(n-1)
uplimq=lambda p,n,nn:1-stats.binom(nn,p).cdf(n)
xbtq=optimize.fsolve(lambda p:botlimq(p,4,8)-0.95,0.1)[0]
xupq=optimize.fsolve(lambda p:uplimq(p,4,8)-0.95,0.4)[0]
xbtq,xupq
Out[40]:
In [42]:
qfun3=stats.norm(8*0.5,sqrt(0.8*(1-0.5)*8))
qfun3.ppf(0.1)/8,qfun3.isf(0.1)/8
Out[42]: