【问题标题】:Getting a negative R-squared value with curve_fit()使用 curve_fit() 获得负 R 平方值
【发布时间】:2021-12-13 23:44:32
【问题描述】:

我已经阅读了有关使用 scipy.optimize.curve_fit() 后手动计算 R 平方值的相关 post。但是,当他们的函数遵循幂律 (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 平方值。还有什么问题吗?

【问题讨论】:

    标签: python statistics regression non-linear-regression scikit-optimize


    【解决方案1】:

    The R-squared and nonlinear regression: a difficult marriage?。还有When is R squared negative?

    基本上,我们有两个问题:

    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”由模型解释。

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2017-06-06
      • 2023-04-04
      • 2021-04-26
      • 2021-06-23
      • 2013-11-03
      相关资源
      最近更新 更多