这可能是一个愚蠢的问题,但我在lmfit's documentation的任何地方都找不到答案。我的问题很简单:如何检索R平方? (我知道我可以使用1 - SS_res / SS_tot
)手动计算
更新:
我尝试自己计算R平方并将其与statsmodels
的R平方进行比较。
两个估计中的参数相同,但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
答案 0 :(得分:3)
我没有在lmfit中看到包含的rsquared,但我们可以重复使用残差或redchi
我使用的是一个类似的例子,其中y包含额外的噪音
lmfit结果
>>> 1 - result.residual.var() / np.var(y)
0.98132815639800652
>>> 1 - result.redchi / np.var(y, ddof=2)
0.9813281563980063
与OLS结果相比:
>>> results.rsquared
0.98132815639800663
当我们比较一个只有截距且没有权重的模型时,这就是rsquared的定义。
在回归不包含截距的情况下,对statsmodel中rsquared的计算进行了调整,并且它们将权重考虑在加权最小二乘中。
答案 1 :(得分:1)
y = np.linspace(0, 15, 50) + [random.randint(0,15) for r in xrange(50)]
btw,调整后的R平方计算为:
n = len(x)
p = len(params) - 1
r2_adj = r2 - (1-r2) * p / (n-p-1)
答案 2 :(得分:0)
你可以很容易地从残差值中计算出来:
rss = (result.residual**2).sum() # same as result.chisqr
print(f"RSS/absolute sum of squares (Chi-square) = {rss:3.1f}")
tss = sum(np.power(y - np.mean(y), 2))
print(f"TSS = {tss:.1f}")
print(f"R² = {1 - rss/tss:.3f}")