python-3.x - stats.linregress 中的 r 与 statsmodels 中的 r-squared 相比
问题描述
我正在开发一个程序来研究某些类星体的大小和红移之间的相关性,并且我正在使用statsmodels
并scipy.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
我的问题是,为什么r
和r-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
我是否错误地解释了统计数据?还是这两个模块使用不同的方法计算回归?
解决方案
默认情况下,OLS
instatsmodels
不包括线性方程中的常数项(即截距)。(常数项对应于设计矩阵中的一列。)
要匹配linregress
,请model
像这样创建:
model = sm.OLS(y, sm.add_constant(x), missing= 'drop')
推荐阅读
- python - python中的SVM(支持向量机)总是给出相同的预测
- r - 使用 na.locf 为特定国家/变量对扩展最后观察到的值
- php - 使用 GET 方法为集合创建自定义路由
- java - Java:如何在“常规” TCP Socket 和 SSLSocket 之间进行抽象
- php - Mysql+PHP中的2步过滤
- android - Ionic4 构建安卓
- html - 我可以做些什么来阻止从输入单选更改值属性?
- scala - 我如何理解 Spark 中使用了缓存?
- c# - 如何创建 .net 标准和 .net 框架自包含构建?
- elasticsearch - 弹性搜索 - 索引企业列表的正确方式