首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用curve_fit()获得负的R平方值

使用curve_fit()获得负的R平方值
EN

Stack Overflow用户
提问于 2021-10-28 19:19:57
回答 1查看 49关注 0票数 0

我已经阅读了使用scipy.optimize.curve_fit()后手动计算R平方值的相关post。然而,当他们的函数遵循幂律(f(x) = a*x^b)时,他们计算的是R平方值。我试着做同样的事情,但得到的是负的R平方值。

下面是我的代码:

代码语言:javascript
复制
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平方值。是不是还有什么地方出了问题?

EN

回答 1

Stack Overflow用户

发布于 2021-10-29 09:01:17

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

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

非线性模型没有截断项,至少在通常意义上没有;

  • SStot=SSreg+SSres可能不成立。

上面的第一个引用表示您的统计量“伪R方”(在非线性模型的情况下),并注意到它的可能低于0

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

对于非线性模型,我有时会计算偏离零的平方和,以检查模型解释了多少。如下所示:

代码语言:javascript
复制
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开始的变异量”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69759738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档