図書館内のさまざまな本の数の信頼区間を作成するコードを作成しようとしています (また、有益なプロットを作成します)。
私のいとこは小学校に通っており、毎週彼の先生から本が渡されます。それから彼はそれを読み、次の週に別のものを手に入れるのに間に合うようにそれを返します. しばらくすると、彼が以前に読んだ本を入手していることに気付き始め、これは時間の経過とともに徐々に一般的になりました.
図書館にある実際の本の数が N で、教師が一様に無作為に (置き換えて) 1 冊を選び、毎週あなたに渡すとします。週 t に、読んだ本を受け取った回数が x である場合、 https://math.stackexchange.com/questions/に従って図書館の本の数の最尤推定値を作成できます。 615464/how-many-books-are-in-a-library .
例: A、B、C、D、および E の 5 冊の本がある図書館を考えてみましょう。7 週間連続して [A、B、A、C、B、B、D] の本を受け取った場合、x の値 (重複の数) は、それらの各週の後に [0, 0, 1, 1, 2, 3, 3] になります。つまり、7 週間後に、既に 3 回読んだ本を受け取ったことを意味します。
尤度関数を視覚化するために (何が正しいかを理解していると仮定して)、尤度関数をプロットすると思われる次のコードを作成しました。最大値は約 135 です。これは、上記の MSE リンクによると、実際には最尤推定値です。
from __future__ import division
import random
import matplotlib.pyplot as plt
import numpy as np
#N is the true number of books. t is the number of weeks.unk is the true number of repeats found
t = 30
unk = 3
def numberrepeats(N, t):
return t - len(set([random.randint(0,N) for i in xrange(t)]))
iters = 1000
ydata = []
for N in xrange(10,500):
sampledunk = [numberrepeats(N,t) for i in xrange(iters)].count(unk)
ydata.append(sampledunk/iters)
print "MLE is", np.argmax(ydata)
xdata = range(10, 500)
print len(xdata), len(ydata)
plt.plot(xdata,ydata)
plt.show()
出力は次のようになります
私の質問は次のとおりです。
- 95% 信頼区間を取得して図にプロットする簡単な方法はありますか?
- 平滑化された曲線をプロットに重ねるにはどうすればよいですか?
- 私のコードを書くべきだったより良い方法はありますか? あまりエレガントではなく、かなり遅いです。
95% 信頼区間を見つけるということは、サンプリングによって得られる経験的最尤推定値 (この例では理論的には 135 になるはずです) が 95% の確率でその範囲内に収まるように、x 軸の範囲を見つけることを意味します。@mbatchkarov が与えた答えは、現在これを正しく行っていません。
https://math.stackexchange.com/questions/656101/how-to-find-a-confidence-interval-for-a-maximum-likelihood-estimateに数学的な答えがあります。