这可能是一个愚蠢的问题,但我在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)
我在 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 的计算会针对回归不包含截距的情况进行调整,并且它们会考虑加权最小二乘的权重。