BLP 是Berry, Levinson和Pakes三个作者名字的缩写,这个模型是由他们在1995年的AER论文提取出来的(Berry(1994)算是奠定了基础)。我来试着讲讲好了。

模型结构

BLP又叫Random coefficient logit model,其中有两个部分:random coefficient和logit。假设消费者选择产品j的效用函数是


其中

是产品的特征(比如在汽车市场就是性能,大小,品牌等等),

是价格,

是对应这两个变量的系数。和普通的logit model区别在于,

在不同消费者之间可以不同(比如张三更在乎性能,而李四不太在乎性能)。为了加入这种偏好差异同时不加入过强的假设,我们假设他们的形式是


其中

是两个常数,而

是期望为0的随机变量,所以这个模型是random coefficient。对于

的分布假设,一般会直接取正态分布然后估计他们的standard deviation;对于价格系数这种肯定为负的系数,可以把它的随机部分假设为log normal来保证符号不会变化。

至于叫logit model的原因在于效用函数里的

一般假设为GEV分布。

适用范围

首先,消费者的效用偏好要有明显的不同,像汽车的例子里面不同的人对于性能,大小这些指标明显有不同的偏好。如果这个假设不成立,比如在超跑市场里大家普遍关注速度,马力这些指标,偏好会差不多,那你大可使用logit model来简化计算。

第二,数据为市场份额。比如说还是汽车市场,如果你能拿到丰田凯美瑞,本田雅阁这种车型在某一年的销售份额这种数据,那你就可以用BLP。但是如果你拿到的是个人销售记录,比如张三买了丰田凯美瑞,李四买了本田雅阁,那么你当然还是可以求每辆车型的市场份额然后去用BLP,但是这样就太暴殄天物了……对于个人层面的数据可以更直接的计算random coefficient。

第三,模型尽量是非动态模型。BLP已经有两层iteration,在计算上很耗时间,如果再加上动态模型,比如耐用品,或者serially correlated cost这种情况,就相当于又加上了一到两层iteration,跑起来简直遥遥无期。

Computation

假设你的效用模型已经搭建好了,数据处理完了而且也符合使用范围,那么该如何估算参数呢?

首先,从效用函数出发,给定一组参数值

,就可以计算出每一个商品的市场销售份额

。那么聪明如你一定会想到,只要找到让

和实际市场销售份额

接近的参数不就完了么?也就是


厉害!这样做在原理上的确行得通,但是实际操作上会有一些问题。在一般的例子里面,需要估计的参数会有很多,比如对于每一个产品特征的偏好,价格偏好,还有可能的品牌效应等等。而不管使用哪一种搜索算法,多一个参数就会多一个搜索维度,时间也会相应的延长很多很多,所以除非参数数量很少,否则这个算法是不推荐的。

那么该怎么估测这些参数呢?BLP把它分解成了两步:通过拟合市场份额来估计非线性参数

通过GMM来估计线性参数

什么是线性和非线性参数?简单的来讲就是在估计的目标函数里,参数是否为线性。在这里,一般只有上面提到的

是线性的。之所以要区别开是因为线性函数的估计更简单。通过拟合市场份额来估计非线性参数

消费者i选择产品j的概率为


产品j的市场份额就可以通过加总个人选择概率来得到


假设

是固定的,BLP定义了一个market share inversion contraction mapping,


其中

是消费者效用中的非随机部分,

是非线性参数。对于每一个

,不断更新迭代

直到迭代前后的差别很小,这样就找到了一个

和对应的simulated market share

2. 通过GMM来估计线性参数

在获得

之后,

,也就是unobservable就可以表示成

。那么只需要找到跟

垂直的工具变量就可以把

估算出来。因为

一般代表的是消费者对于品牌和其他产品特征的偏好,所以可以用地理位置这种跟品牌偏好无关,但是会影响价格这类变量来做工具变量。用

来表示工具变量,那么

,GMM的估计方程就是

(其中

是Variance-covariance matrix, 可以先估算

,然后用参数的Hessian矩阵来替代)。

在获得

的估计值后,GMM的方程值也能求出来,这也就是第一步中非线性参数对应的目标方程值。回到第一步里用不同的

再试,然后不断重复整个过程,直到这一目标方程值无法再减小为止

虽然两步迭代看起来很复杂,其实整个计算里面最耗时的是求mean utility

时的迭代。一般而言这个迭代速度不会很快,可能100次迭代之后

才下降了0.01不到。Nevo (2000)在附录里面介绍了一个办法:在最开始的时候把

的threshhold定为10^-10,然后在迭代100次以后每迭代50次就把这个threshold放宽10倍(比如到150次的时候变成10^-9)。这样一来每次迭代之后要么保证得到的

足够准确,要么已经迭代了相当次数,没必要继续在当前的参数值下面浪费时间。

其他

这里说的还是太简略了。如果只是想了解BLP是怎么做的,可以看看Nevo在2000年写的A Practitioner’s Guide to Estimation of Random-Coefficients Logit Models of Demand。如果想更系统的了解的话可以看看各个学校的lecture notes。