Estimação dos parametro
wellington36 opened this issue · 7 comments
No meu trabalho chego no seguinte modelo:
Onde c, s e a são parametros a serem estimados, t é o tempo e x(t) é a porcentagem de falantes de um certo idioma numa certa população. A partir de alguns dados gostaria de estimar os parametros c, s, a e x(0), porêm estou com problemas nessa parte. Tentei usar a ferramenta que o senhor indicou no jupyter do curso: Aula 14 - Estimando Parâmetros.ipynb, mas estou com erro na seguinte parte do notebook:
Retornando o seguinte erro:
TypeError Traceback (most recent call last)
/tmp/ipykernel_9029/2811120966.py in
----> 1 sir_model = DifferentialEquation(
2 func=SIR,
3 times=np.arange(Integer(1951), Integer(2040), Integer(10)),
4 n_states=Integer(1),
5 n_theta=Integer(3),~/.sage/local/lib/python3.9/site-packages/pymc3/ode/ode.py in init(self, func, times, n_states, n_theta, t0)
96 # Private
97 self._augmented_times = np.insert(times, 0, t0).astype(floatX)
---> 98 self._augmented_func = utils.augment_system(func, self.n_states, self.n_theta)
99 self._sens_ic = utils.make_sens_ic(self.n_states, self.n_theta, floatX)
100~/.sage/local/lib/python3.9/site-packages/pymc3/ode/utils.py in augment_system(ode_func, n_states, n_theta)
103
104 # Get symbolic representation of the ODEs by passing tensors for y, t and theta
--> 105 yhat = ode_func(t_y, t_t, t_p[n_states:])
106 # Stack the results of the ode_func into a single tensor variable
107 if not isinstance(yhat, (list, tuple)):TypeError: SIR() missing 1 required positional argument: 'p'
Estou cometendo algum equivoco? ou seria uma limitação da ferramenta? dado que o senhor falou em aula que alguns sistemas de EDOs (mais "compricados") a ferramenta tem problema.
@wellington36 , tira o self
da função SIR. vai ficar:
def SIR(y,t,p):
...
@fccoelho, uma outra questão que estou com dúvida é que no jupyter do curso: Aula 14 - Estimando Parâmetros.ipynb, mais expecificamente no seguinte ponto:
o senhor faz o log do que seria uma curva não entendi como essa curva pode retornar um número (no meu caso isso da um erro)
Qualquer coisa esté é meu jupyter com as imprementações até o momento: https://github.com/wellington36/Modelling-the-dynamics-of-language-death/blob/main/implementa%C3%A7%C3%A3o.ipynb
@wellington36, este log retorna um vetor, ou seja, temos um mu
para cada ponto da curva.
Acho que o seu erro é que vc está usando dados definidos como uma lista:
yobs = [0.15, 0.10, 0.04, 0.009, 0.001]
Quando a saida do odeint retorna um vetor coluna:
# Gerando curvas simuladas
y = odeint(SIR, t=times, y0=[0.99, 0.01], args=((beta, gamma),), rtol=1e-8)
# Simulando dados Assumindo uma distribuição log-normal com média igual às séries simuladas
yobs = np.random.lognormal(mean=np.log(y[1::]), sigma=[0.2, 0.3])
acho que o erro vem disso, o shape da série não bate com o esperado.
De fato, resolveu o bug.
@fccoelho, sem querer encher o saco do senhor acho que agora sim achei algo problematico, na celula, do mesmo jupyter mencionado acima temos:
Gerando este erro, que me parece uma questão de precisão da maquina:
vc não deve usar distribuição normal par parâmetros que são estritamente positivos (neste caso o a
). Joga um pm.Bound
, como foi feito nos outros, para truncar a distribuição.