我已经阅读了使用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平方值。是不是还有什么地方出了问题?
发布于 2021-10-29 09:01:17
参见The R-squared and nonlinear regression: a difficult marriage?。还有When is R squared negative?。
基本上,我们有两个问题:
非线性模型没有截断项,至少在通常意义上没有;
上面的第一个引用表示您的统计量“伪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开始的变异量”。
https://stackoverflow.com/questions/69759738
复制相似问题