使用统计包对数百个协变量进行最大似然估计的方法
Approaches for using statistics packages for maximum likelihood estimation for hundreds of covariates
我正在尝试研究最大似然估计的分布,特别是针对大量协变量 p 和高维状态(意味着 p/n,样本量为 n,约为 1/5 ).我正在生成数据,然后使用 statsmodels.api.Logit
使参数适合我的模型。
问题是,这似乎只适用于低维状态(比如 300 个协变量和 40000 个观测值)。具体来说,我知道已经达到最大迭代次数,对数似然是 inf 即已经发散,并且出现 'singular matrix' 错误。
我不知道如何解决这个问题。最初,当我仍在使用较小的值(比如 80 个协变量,4000 个观察值)时,偶尔会遇到此错误,我将最大迭代次数设置为 70 次而不是 35 次。这似乎有所帮助。
但是现在显然无济于事,因为我的对数似然函数发散了。不仅仅是最大迭代次数不收敛的问题
很容易回答这些包根本不是用来处理这些数字的,但是已经有专门研究这种高维体系的论文,比如 here 其中 p=800
协变量和 n=4000
使用观察值。
当然,本文使用了 R 而不是 python。不幸的是我不知道 R。但是我认为 python 优化应该与 'quality'?
相当
我的问题:
可能是 R 比 python statsmodels 更适合处理这种高 p/n 机制中的数据?如果是这样,为什么可以使用 R 的技术来修改 python statsmodels 代码?
我如何修改我的代码以适用于 p=800 和 n=4000 左右的数字?
在您当前使用的代码中(来自其他几个问题),您隐式使用了 Newton-Raphson 方法。这是 sm.Logit
模型的默认值。它计算 Hessian 矩阵并将其反转为 speed-up 估计,但这对于大型矩阵来说 难以置信地 昂贵 - 更不用说当矩阵接近奇异时经常导致数值不稳定,因为你已经见证了。这在相关维基百科上有简要解释 entry.
您可以使用不同的求解器来解决这个问题,例如bfgs
(或lbfgs
),像这样,
model = sm.Logit(y, X)
result = model.fit(method='bfgs')
即使使用 n = 10000, p = 2000
,这对我来说也运行良好。
除了估计之外,更成问题的是,您生成样本的代码会导致数据受到很大程度的影响 quasi-separability,在这种情况下,整个 MLE 方法充其量是有问题的。您应该紧急调查一下,因为它表明您的数据可能不像您希望的那样 well-behaved。 Quasi-separability 解释得很好 here.
我正在尝试研究最大似然估计的分布,特别是针对大量协变量 p 和高维状态(意味着 p/n,样本量为 n,约为 1/5 ).我正在生成数据,然后使用 statsmodels.api.Logit
使参数适合我的模型。
问题是,这似乎只适用于低维状态(比如 300 个协变量和 40000 个观测值)。具体来说,我知道已经达到最大迭代次数,对数似然是 inf 即已经发散,并且出现 'singular matrix' 错误。
我不知道如何解决这个问题。最初,当我仍在使用较小的值(比如 80 个协变量,4000 个观察值)时,偶尔会遇到此错误,我将最大迭代次数设置为 70 次而不是 35 次。这似乎有所帮助。
但是现在显然无济于事,因为我的对数似然函数发散了。不仅仅是最大迭代次数不收敛的问题
很容易回答这些包根本不是用来处理这些数字的,但是已经有专门研究这种高维体系的论文,比如 here 其中 p=800
协变量和 n=4000
使用观察值。
当然,本文使用了 R 而不是 python。不幸的是我不知道 R。但是我认为 python 优化应该与 'quality'?
相当我的问题:
可能是 R 比 python statsmodels 更适合处理这种高 p/n 机制中的数据?如果是这样,为什么可以使用 R 的技术来修改 python statsmodels 代码?
我如何修改我的代码以适用于 p=800 和 n=4000 左右的数字?
在您当前使用的代码中(来自其他几个问题),您隐式使用了 Newton-Raphson 方法。这是 sm.Logit
模型的默认值。它计算 Hessian 矩阵并将其反转为 speed-up 估计,但这对于大型矩阵来说 难以置信地 昂贵 - 更不用说当矩阵接近奇异时经常导致数值不稳定,因为你已经见证了。这在相关维基百科上有简要解释 entry.
您可以使用不同的求解器来解决这个问题,例如bfgs
(或lbfgs
),像这样,
model = sm.Logit(y, X)
result = model.fit(method='bfgs')
即使使用 n = 10000, p = 2000
,这对我来说也运行良好。
除了估计之外,更成问题的是,您生成样本的代码会导致数据受到很大程度的影响 quasi-separability,在这种情况下,整个 MLE 方法充其量是有问题的。您应该紧急调查一下,因为它表明您的数据可能不像您希望的那样 well-behaved。 Quasi-separability 解释得很好 here.