我正在解决一个带有参数界限的线性模型。简单的statsmodels OLS方法不允许对拟合参数进行限制,因此,为此,我使用scipy.optimize.minimize最大化似然函数。从这里,我有一组线性模型的参数。到目前为止都很好。
现在我需要实现的是能够访问我的模型的统计数据,例如R ^ 2,F-Stat等。对于OLS,这些东西都带有model.fit()返回的对象。以及其他不错的功能。
我想知道是否可以创建此对象,手动从有界拟合中分配我的参数,并让它计算拟合结果对象上的数据字段?显然,我可以手动计算这些东西,但我想要它,无论我是要求有界还是无界适合,我得到相同的对象类型返回,生活很容易下游。
bounded_params = fitBoundedLinear(x, y) # solution to bounded problem - a list of floats
model = statsmodels.api.OLS(y, x)
unbounded_fitResult = model.fit() # solution to unbounded problem - a regression results object
想要做类似的事情:
aFitResult.params = bounded_params # manually set the parameters
aFitResult.calculate() # force it to compute data fields based on these params
rsq = aFitResult.rsquared # etc...
答案 0 :(得分:0)
我有一些有用的东西 - 但它可能不是一个理想的解决方案:
aFitResult = statsmodels.regression.linear_model.RegressionResultsWrapper(statsmodels.regression.linear_model.OLSResults(model,bounded_params))
答案 1 :(得分:0)
你可以将elastic_net.py中的upper_bound和lower_bound添加到fit_elasticnet:
def fit_elasticnet(model, method="coord_descent", maxiter=100,
alpha=0., L1_wt=1., start_params=None, cnvrg_tol=1e-7,
zero_tol=1e-8, refit=False, check_step=True,
loglike_kwds=None, score_kwds=None, hess_kwds=None, upper_bound=None, lower_bound=None):
然后在以下行之后的该函数内:
params[k] = _opt_1d(func, grad, hess, model_1var, params[k], alpha[k]*L1_wt,
tol=btol, check_step=check_step)
添加:
if upper_bound is not None:
params[k] = min(params[k], upper_bound[k])
if lower_bound is not None:
params[k] = max(params[k], lower_bound[k])
然后调用类似的函数:
model = lm.OLS(y, x)
results_fu = model.fit()
#results_fu.summary()
results_fr = model.fit_regularized(alpha=0.001
,start_params=results_fu.params
,upper_bound=(.60,0,0,1,1,1,1,1)
,lower_bound=(-1, 0,0,0,-1,1,1,1,-10) )
答案 2 :(得分:0)
通过 start_params=
将模型的初始参数设置为所需的值,然后使用 maxiter=0
进行拟合,以 0 步进行拟合(即不拟合,但仍运行所有初始化和度量计算)。
result = model.fit(start_params=your_parameters_here, maxiter=0)
result.rsquared # or any other fit index