0

在使用 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 平方值。还有什么问题吗?

4

1 回答 1

0

请参阅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 变化”的量。

于 2021-10-29T09:01:17.397 回答