¿Alguien entiende cómo hacer funcionar este código?
Estoy tratando de estimar un modelo lineal (killer_apps es la variable dependiente limitada) usando el enfoque de probabilidad máxima. Por lo tanto, en este código, estoy tratando de estimar los regresores y los errores estándar respectivos. ¿Puede alguien decirme por qué recibo este error y qué, en general, estoy haciendo mal? Estaba tratando de ampliar el código de una muestra usada para un modelo lineal
def probitlik(beta,y,x1,x2,x3):
beta1 = beta[0]
beta2 = beta[1]
beta3 = beta[2]
beta4 = beta[3]
prob = stats.norm.cdf(beta1 + beta2*x1 + beta3*x2 + beta4*x3)
vlog=y*np.log(prob)+(1-y)*np.log(1-prob)
loglik=-1*sum(vlog)
return(loglik)
probitmodel = minimize(probitlik, x0 = np.asarray([0.5,0.55,0.6,1]),args = (killer_app,size,price,score),method='BFGS')
def hessian(x0,*args):
epsilon=1.e-3
f1 = approx_fprime(x0,probitlik,*args)
n = x0.shape[0]
hessian = np.zeros ([n,n])
xx = x0
for j in range(0,n):
xx0 = xx[j]
xx[j] = xx0 + epsilon
f2 = approx_fprime(x0,probitlik,*args)
hessian[:,j] = (f2 - f1)/epsilon
xx[j] = xx0
return hessian
eps = 1e-07
hess = hessian(probitmodel.x,[eps, np.sqrt(200) * eps],[killer_app,size, price, score])
inv_hess = np.linalg.inv(hess)
std_beta = np.sqrt(np.diag(inv_hess))
print(std_beta)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
26
27 eps = 1e-07
---> 28 hess = hessian(probitmodel.x,[eps, np.sqrt(200) * eps],[killer_app,size, price, score])
29 inv_hess = np.linalg.inv(hess)
30 std_beta = np.sqrt(np.diag(inv_hess))
2 frames
/usr/local/lib/python3.6/dist-packages/scipy/optimize/optimize.py in _approx_fprime_helper(xk, f, epsilon, args, f0)
689 """
690 if f0 is None:
--> 691 f0 = f(*((xk,) + args))
692 grad = numpy.zeros((len(xk),), float)
693 ei = numpy.zeros((len(xk),), float)
TypeError: probitlik() missing 3 required positional arguments: 'x1', 'x2', and 'x3'
Pregunta hecha hace 3 años, 4 meses, 28 días - Por syntaxsniper
3 Respuestas:
-
Tough, porque el error está en la línea 691. Además no hay comentarios en absoluto y el paso de argumentos parece muy convocado. Empieza a depurar y cuando falla en la línea 691, compruebe los valores reales de
*((xk,) + args)
. Aparentemente, sólo dos valores se pasan aprobitlik()
mientras que cinco son requeridos - eso se explica en la última línea que publicó en la pregunta.Respondida el Dec 17, 2020 a las 11:39 - por coderconqueror
Votos positivos: 0 | Votos negativos: 0 -
El error que estás recibiendo se debe a que al llamar a la función
approx_fprime
en la funciónhessian
, estás pasando los argumentos de forma incorrecta. La funciónapprox_fprime
espera que la función objetivo y los argumentos adicionales se pasen como argumentos separados, pero en tu llamada los estás pasando como un solo argumento.Para corregir esto, debes separar los argumentos de la función
probitlik
al llamar aapprox_fprime
. Aquí te dejo el código corregido:python def hessian(x0, *args): epsilon=1.e-3 f1 = approx_fprime(x0, probitlik, args) n = x0.shape[0] hessian = np.zeros([n, n]) xx = x0.copy() for j in range(0, n): xx0 = xx[j] xx[j] = xx0 + epsilon f2 = approx_fprime(x0, probitlik, args) hessian[:, j] = (f2 - f1) / epsilon xx[j] = xx0 return hessian eps = 1e-07 hess = hessian(probitmodel.x, killer_app, size, price, score) inv_hess = np.linalg.inv(hess) std_beta = np.sqrt(np.diag(inv_hess)) print(std_beta)
Con estas correcciones en la función
hessian
y en la llamada a la funciónhessian
, el código debería ejecutarse correctamente.Respondida el Dec 18, 2020 a las 11:39 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error radica en la forma en que se llama a la función
hessian
en la línea 28 del código proporcionado:hess = hessian(probitmodel.x,[eps, np.sqrt(200) eps],[killer_app,size, price, score])
La función
hessian
espera cinco argumentos, pero solo se le están pasando cuatro. Esto se debe a que la funciónprobitlik
requiere cuatro argumentos (y, x1, x2, x3), pero el código solo le está pasando tres ([killer_app,size, price, score]).Para solucionar el error, debes pasar el cuarto argumento (x3) a la función
probitlik
cuando llames ahessian
. Aquí tienes el código corregido:def probitlik(beta,y,x1,x2,x3): beta1 = beta[0] beta2 = beta[1] beta3 = beta[2] beta4 = beta[3] prob = stats.norm.cdf(beta1 + beta2x1 + beta3x2 + beta4x3) vlog=ynp.log(prob)+(1-y)np.log(1-prob) loglik=-1sum(vlog) return(loglik) probitmodel = minimize(probitlik, x0 = np.asarray([0.5,0.55,0.6,1]),args = (killer_app,size,price,score),method='BFGS') def hessian(x0,args): epsilon=1.e-3 f1 = approx_fprime(x0,probitlik,args) n = x0.shape[0] hessian = np.zeros ([n,n]) xx = x0 for j in range(0,n): xx0 = xx[j] xx[j] = xx0 + epsilon f2 = approx_fprime(x0,probitlik,args) hessian[:,j] = (f2 - f1)/epsilon xx[j] = xx0 return hessian eps = 1e-07 hess = hessian(probitmodel.x,[eps, np.sqrt(200) * eps],[killer_app,size, price, score, 0]) inv_hess = np.linalg.inv(hess) std_beta = np.sqrt(np.diag(inv_hess)) print(std_beta)
Ten en cuenta que he añadido un valor cero como cuarto argumento a la llamada de
hessian
. Esto se debe a que la funciónprobitlik
espera cuatro argumentos, y el cuarto argumento debe ser un valor constante (ya que no afecta al cálculo del log-verosimilitud).Respondida el Dec 18, 2020 a las 11:49 - por Gemini
Votos positivos: 0 | Votos negativos: 0