29-197002 経済学研究科D1
奥村恭平
Below, we derive Pr(di=j)=exp(δj)∑k∈Jexp(δk)
Let f be the pdf of Extreme Value Type I random variable: f(x):=F′(x)=e−x⋅exp(−exp(−x)).
Pr(di=j)=Pr(∀k≠j; uij≥uik)=Pr(∀k≠j; ϵij+δj−δk≥ϵik)=∏k≠jPr(ϵij+δj−δk≥ϵik)(∵ indep.)=∫∞−∞F(ϵij+δj−δk)f(ϵij)dϵij=∫∞−∞exp(∑k≠j−exp(−ϵij−δj+δk))e−ϵij⋅exp(−exp(−ϵij))dϵij=∫∞−∞exp(∑k−exp(−x−δj+δk))e−xdx(x:=ϵij)=∫∞−∞exp(−e−x∑kexp(δk−δj))e−xdx=∫∞0exp(−t∑kexp(δk−δj))dt(t:=e−x)=[−(∑kexp(δk−δj))−1exp(−t∑kexp(δk−δj))]∞0=(∑kexp(δk−δj))−1=exp(δj)∑kexp(δk)The log-likelihood is: ∑i∑jyij⋅log(exp(Xijβ)1+∑kexp(Xikβ))
In order to use scipy.optimize.minimize
, we define a loss function that is the likelihood multiplied by −1.
The estimated value is β∗≈(−1.88673942,0.09717683,−1.02683967).
Below is the code I used:
# import
import pandas as pd
import numpy as np
from scipy.optimize import minimize
# read csv
df = pd.read_csv('../data/DataPS201901.csv', header=None)
data = df.values
# pre-processing
x = [{'hp': 1.0, 'fe': 5.0}, {'hp': 1.2, 'fe': 3.5}, {'hp': 1.4, 'fe': 2.0}]
y = data[:,0]
age = data[:, 1]
gender = data[:, 2]
N = data.shape[0] # the number of agents
J = data.shape[1] # the number of goods
age = age[:, np.newaxis]/100 # rescaling
gender = gender[:, np.newaxis]
X = []
for j in range(data.shape[1]):
temp = np.hstack([np.ones((N,1)), age * x[j]['hp'], gender * x[j]['fe']])
X.append(temp)
# loss function
## use numpy to speed up
def loss(beta):
# exp_Xij_beta(i,j) = exp(X_ij @ beta)
for j in range(J):
if j == 0:
exp_Xij_beta = np.exp(X[j] @ beta)[:, np.newaxis]
else:
exp_Xij_beta = np.hstack([exp_Xij_beta, np.exp(X[j] @ beta)[:, np.newaxis]])
exp_sum = np.sum(exp_Xij_beta, axis=1) + 1
# z_ij は,(i,j)に対応するlogの中身
z0 = np.ones((N,1)) / exp_sum[:, np.newaxis] # outside option
z1 = exp_Xij_beta / exp_sum[:, np.newaxis]
z = np.hstack([z0, z1])
w = np.log(z)
# Y_ij = 1 iff agent i chooses option j
Y = np.zeros((N, J+1))
for i in range(N):
Y[i][y[i]] = 1
return - (Y * w).sum()
res = minimize(loss, x0=[1, 1, 1])
beta = res.x
beta[1] = beta[1] / 100 # rescaling
print('The estimated beta is {}'.format(beta))
The estimated beta is [-1.88673942 0.09717683 -1.02683967]