Я пытался закончить упражнение в книге Йона Стачурски (учебник, посвященный обучению экономистов использованию Python). Один из них - о том, как рассчитать и построить кумулятивное эмпирическое распределение. Они обеспечивают класс, называемый ecdf
для вычисления эмпирической функции распределенияУпражнение по вычислению и построению кумулятивного эмпирического распределения
# Filename: ecdf.py
# Author: John Stachurski
# Date: December 2008
# Corresponds to: Listing 6.3
class ECDF:
def __init__(self, observations):
self.observations = observations
def __call__(self, x):
counter = 0.0
for obs in self.observations:
if obs <= x:
counter += 1
return counter/len(self.observations)
И Excercise читает
【Exercise 6.1.12】 Add a method to the ECDF class that uses Matplotlib to plot the em-
pirical distribution over a specified interval. Replicate the four graphs in figure 6.3
(modulo randomness).
цифра должна быть воспроизведена в
и иллюзия алгоритма
Следующая моя первая попытка
from ecdf import ECDF
import numpy as np
import matplotlib.pyplot as plt
from srs import SRS
from math import sqrt
from random import lognormvariate
# =========================
# parameters and arguments
# =========================
alpha, sigma2, s, delta = 0.3, 0.2, 0.5, 0.1
# numbers of draws
n = 1000
# length of each markov chain
t = 20
num_simu = [4,25,100,5000]
# Define F(k, z) = s k^alpha z + (1 - delta) k
F = lambda k, z: s * (k**alpha) * z + (1 - delta) * k
lognorm = lambda: lognormvariate(0, sqrt(sigma2))
# =====================
# create empirical distribution
# =====================
# different draw numbers
k = np.linspace(0,25,500)
for n in num_simu:
for x in range(n):
# list used to store capital stock (kt) in the last periods (t=20)
kt = []
solow_srs = SRS(F=F, phi=lognorm, X=1.0)
px = solow_srs.sample_path(t)
kt.append(px[-1])
# generate the empirical distribution function
F = ECDF(kt)
prob_kt_n = [F(i) for i in k] # need to determine range
# n refers to the n-th draw
# ==================================
# use for-loop to create subplots
# ==================================
#k = np.linspace(0,25,500)
#num_rows,num_cols = 2,2
трудности для меня являются 1) Как я могу хранить список/массив эмпирических результатов распределения для различных чисел вытяжке в данной графе. 2) Как создать подзаголовки, используя for-loop. Я также столкнулся с некоторыми другими крошечными ошибками. Спасибо за ваши предложения.