我是 R 的重度用户,最近正在学习 python。
我有一个关于 statsmodels.api 如何处理重复功能的问题。
据我了解,这个函数是R包中glm的python版本。所以我期望该函数返回最大似然估计(MLE)。
我的问题是 statsmodels 使用哪种算法来获得 MLE?
特别是算法如何处理重复特征的情况?
为了澄清我的问题,我从伯努利分布中生成了一个大小为 50 的样本,其中包含单个协变量 x1。
import statsmodels.api as sm
import pandas as pd
import numpy as np
def ilogit(eta):
return 1.0 - 1.0/(np.exp(eta)+1)
## generate samples
Nsample = 50
cov = {}
cov["x1"] = np.random.normal(0,1,Nsample)
cov = pd.DataFrame(cov)
true_value = 0.5
resp = {}
resp["FAIL"] = np.random.binomial(1, ilogit(true_value*cov["x1"]))
resp = pd.DataFrame(resp)
resp["NOFAIL"] = 1 - resp["FAIL"]
然后将逻辑回归拟合为:
## fit logistic regrssion
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()
这将返回:
估计系数或多或少与真实值相似(=0.5)。
然后我创建一个重复列,即 x2,并再次拟合逻辑回归模型。 (R 包中的 glm 将为 x2 返回 NA)
cov["x2"] = cov["x1"]
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()
这输出:
令人惊讶的是,这个工作原理以及 x1 和 x2 的系数估计完全相同 (=0.1182)。由于之前的拟合返回 x1 = 0.2364 的系数估计值,因此估计值减半。
然后我将重复特征的数量增加到 9 并拟合模型:
cov = cov
for icol in range(3,10):
cov["x"+str(icol)] = cov["x1"]
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()
正如预期的那样,每个重复变量的估计值相同 (0.0263),并且它们似乎比 x1 的原始估计值 (0.2364) 小 9 倍。
我对最大似然估计的这种意外行为感到惊讶。您能否解释一下为什么会发生这种情况以及 statsmodels.api 背后采用了哪些算法?