Las funciones del paquete foretell son llamadas bastante sencillas al paquete R optim
con una gestión de datos intermedia. Así que en R si se ejecuta library(foretell);BdW
puede ver la definición de la función.
En python, sólo habría que reescribir la llamada a R optim usando scipy minimizar . Aquí hay un breve ejemplo de minimización del mismo ejemplo en los docs de foretell para el BdW
modelo:
from scipy.optimize import minimize
from scipy.special import beta
import numpy as np
surv = np.array([100,86.9,74.3,65.3,59.3])
h = 6
t = len(surv)
die = np.diff(-surv)
i = np.arange(0,t)
def dbw_ll(x):
a,b,c = x
s = beta(a,b + i**c)/beta(a,b)
p = np.diff(-s)
ll_ = die * np.log(p)
ll = ll_.sum() + surv[-1]*np.log(s[-1])
return -ll
bnds = [(0.001,10000)]*3
res = minimize(dbw_ll, x0=[1,1,1],
method='L-BFGS-B',
bounds=bnds)
print(res.x)
# R results 0.2593549 1.7226948 1.5842688
# agrees for 3 decimals
# projecting out
a, b, c = res.x
k = np.arange(0,t+h)
dbw = (beta(a,b+k**c)/beta(a,b))*100
fitted = dbw[0:t]
projected = dbw[t:]
Es casi el mismo ejercicio para las otras funciones (mapeo de funciones R a python). Sólo tienes que hacer un día de trabajo para envolver estos en buenas funciones en python para replicar la misma funcionalidad en la biblioteca de R foretell. (¡Hice este ejemplo mientras esperaba que terminaran unas consultas!)