代码之家  ›  专栏  ›  技术社区  ›  Jim421616

stats.lingress中的r与stats模型中的r平方的比较

  •  1
  • Jim421616  · 技术社区  · 7 年前

    我正在研究一个程序来研究某些类星体的星等和红移之间的关系,我正在使用 statsmodels scipy.stats.linregress 计算数据统计; 状态模型 计算 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
    

    我的问题是,为什么 R R方 值不匹配

    (即,对于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
    

    我对统计数据的解释有误吗?还是两个模块使用不同的方法计算回归?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Warren Weckesser    7 年前

    默认情况下, OLS 在里面 statsmodels 不包括线性方程中的常数项(即截距)。(常数项对应于 design matrix )

    相配 linregress 创造 model 这样地:

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