Python lmfit - 如何计算 R 平方?

era*_*tdo 6 python scipy

这可能是一个愚蠢的问题,但我在lmfit 文档中没有找到答案。我的问题很简单:如何检索 R 平方?(我知道我可以用 手动计算1 - SS_res / SS_tot

更新:我尝试自己计算 R 平方,并将其与 中的 R 平方进行比较statsmodels。两种估计中的参数相同,但 R 平方不同。

代码:

from lmfit import minimize, Parameters
import numpy as np
import statsmodels.api as sm
import random


x = np.linspace(0, 15, 10)
x_ols = sm.add_constant(x)
y = [random.randint(0,15) for r in xrange(10)]

model = sm.OLS(y,x_ols)
results = model.fit()
print "OLS: ", format(results.params[0], '.5f'), format(results.params[1], '.5f'), "R^2: ", results.rsquared


# define objective function: returns the array to be minimized
def fcn2min(params, x, data):
    a = params['a'].value
    b = params['b'].value

    model = a + b * x
    return model - data

for i in range(0,1):
    # create a set of Parameters
    params = Parameters()
    params.add('a', value= i)
    params.add('b', value= 20)

    # do fit, here with leastsq model
    result = minimize(fcn2min, params, args=(x, y))

    yhat = params['a'].value + params['b'].value * x
    ybar = np.sum(y)/len(y)
    ssreg = np.sum((yhat-ybar)**2)   # or sum([ (yihat - ybar)**2 for yihat in yhat])
    sstot = np.sum((y - ybar)**2)    # or sum([ (yi - ybar)**2 for yi in y])
    r2 = ssreg / sstot

    print "lmfit: ", format(params['a'].value, '.5f'), format(params['b'].value, '.5f'), "R^2: ", r2
Run Code Online (Sandbox Code Playgroud)

Jos*_*sef 5

我在 lmfit 中没有看到包含的 rsquared,但我们可以重用残差或redchi

我正在使用一个类似的例子,其中 y 包含额外的噪声

lmfit 结果(假设平均残差等于零,这对于线性回归始终成立)

>>> 1 - result.residual.var() / np.var(y)
0.98132815639800652
>>> 1 - result.redchi / np.var(y, ddof=2)
0.9813281563980063
Run Code Online (Sandbox Code Playgroud)

与 OLS 结果比较:

>>> results.rsquared
0.98132815639800663
Run Code Online (Sandbox Code Playgroud)

当我们与只有截距且没有权重的模型进行比较时,这就是 rsquared 的定义。

statsmodels 中 rsquared 的计算会针对回归不包含截距的情况进行调整,并且它们会考虑加权最小二乘的权重。