使用curve_fit()获得负r平方值



我读过一篇有关使用scipy.optimize.curve_fit()后手动计算r平方值的相关文章。然而,当他们的函数遵循幂律(f(x) = a*x^b)时,他们计算r平方值。我想做同样的事情,但得到负的r平方值。

下面是我的代码:
def powerlaw(x, a, b):
'''Generic power law function.'''
return a * x**b
X = s_lt[4:] # independent variable (Pandas series)
Y = s_lm[4:] # dependent variable (Pandas series)
popt, pcov = curve_fit(powerlaw, X, Y)
residuals = Y - powerlaw(X, *popt)
ss_res = np.sum(residuals**2)   # residual sum of squares
ss_tot = np.sum((Y-np.mean(Y))**2)  # total sum of squares
r_squared = 1 - (ss_res / ss_tot)   # r-squared value
print("R-squared of power-law fit = ", str(r_squared))

我得到r平方值为-0.057....

根据我的理解,对非线性函数使用r平方值是不好的,但由于过拟合,我期望得到比线性模型高得多的r平方值。还有什么地方出了问题吗?

参见r平方与非线性回归:一段艰难的婚姻?当R平方为负时

基本上我们有两个问题:

  1. 非线性模型没有截距项,至少不是通常意义上的;
  2. 等于SStot=SSreg+SSres可能不成立。

上面的第一个引用表示您的统计数据"伪r -平方"(在非线性模型的情况下),并注意它可能低于0.

为了进一步理解发生了什么,你可能想要将数据Y绘制为X的函数,将幂律的预测值绘制为X的函数,将残差绘制为X的函数。

对于非线性模型,我有时会计算从零的平方偏差之和,以检查模型解释了多少。像这样:

pred = powerlaw(X, *popt)
ss_total = np.sum(Y**2)  # Not deviation from mean.
ss_resid = np.sum((Y - pred)**2)
pseudo_r_squared = 1 - ss_resid/ss_total

通过这种方式计算,pseudo_r_squared可能是负的(如果模型真的很糟糕,比猜测数据都是0更糟糕),但如果pseudo_r_squared是正的,我将其解释为"从0"的变化量。由模型解释

最新更新