首页 > 解决方案 > stats.linregress 中的 r 与 statsmodels 中的 r-squared 相比

问题描述

我正在开发一个程序来研究某些类星体的大小和红移之间的相关性,并且我正在使用statsmodelsscipy.stats.linregress计算数据的统计数据;statsmodels计算r-squared(在其他参数中)和stats.linregress计算r(在其他中)。

一些示例输出是:

W1 r-squared: 0.855715
W1 r-value  : 0.414026
W2 r-squared: 0.861169
W2 r-value  : 0.517381
W3 r-squared: 0.874051
W3 r-value  : 0.418523
W4 r-squared: 0.856747
W4 r-value  : 0.294094
Visual minus WISE r-squared: 0.87366
Visual minus WISE r-value  : -0.521463

我的问题是,为什么rr-squared值不匹配

(即对于 W1 波段,0.414026**2 != 0.855715)?

我的计算函数的代码如下:

def computeStats(x, y, yName):
    from scipy import stats
    import statsmodels.api as sm

    #   Compute model parameters
    model = sm.OLS(y, x, missing= 'drop')
    results = model.fit()
    #   Mask NaN values in both axes
    mask = ~np.isnan(y) & ~np.isnan(x)
    #   Compute fit parameters
    params = stats.linregress(x[mask], y[mask])
    fit = params[0]*x + params[1]
    fitEquation = '$(%s)=(%.4g \pm %.4g) \\times redshift+%.4g$'%(yName,
                params[0],  #   slope
                params[4],  #   stderr in slope
                params[1])  #   y-intercept

    print('%s r-squared: %g'%(name, arrayresults.rsquared))
    print('%s r-value  : %g'%(name, arrayparams[2]))

    return results, params, fit, fitEquation

我是否错误地解释了统计数据?还是这两个模块使用不同的方法计算回归?

标签: python-3.xscipystatsmodels

解决方案


默认情况下,OLSinstatsmodels不包括线性方程中的常数项(即截距)。(常数项对应于设计矩阵中的一列。)

要匹配linregress,请model像这样创建:

    model = sm.OLS(y, sm.add_constant(x), missing= 'drop')

推荐阅读