可以在线性模型中手动设置参数并获得R Squared等?

时间:2016-10-26 18:31:11

标签: python statsmodels

我正在解决一个带有参数界限的线性模型。简单的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... 

3 个答案:

答案 0 :(得分:0)

我有一些有用的东西 - 但它可能不是一个理想的解决方案:

aFitResult = statsmodels.regression.linear_model.RegressionResultsWrapper(statsmodels.regression.linear_model.OLSResults(model,bounded_pa​​rams))

答案 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