这可能是一个愚蠢的问题,但我在lmfit的文档中没有找到答案。我的问题很简单:如何检索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
4条答案
按热度按时间nzrxty8p1#
在lmfit中没有包含rsquared,但是我们可以重用残差或
redchi
我使用了一个类似的例子,其中y包含额外的噪声
lmfit结果(假设平均残差等于零,这对于线性回归始终成立)
与OLS结果相比:
这是当我们与只有截距而没有权重的模型进行比较时,rsquared的定义。
统计模型中的rsquared的计算针对回归不包括截距的情况进行调整,并且它们考虑了加权最小二乘法的权重。
voase2hg2#
好的,原因是因为我选择了随机y,所以拟合很差。使用不同的随机生成器,谁产生更好的拟合,给出了相同的R平方。修改是:
顺便说一句,调整后的R平方计算为:
zbsbpyhn3#
你可以很容易地从残差值中计算出来:
snz8szmq4#
最初的问题(“如何检索R-squared?”)是在大约9年前提出的,目前还不清楚lmfit自那时以来发生了什么变化。截至2023年4月,r-squared值是 lmfit ModelResult对象的属性。因此,给定ModelResult对象 MyModelResult,R-squared值可以简单地使用以下命令检索: