首页 > 解决方案 > Linregress 输出似乎不正确

问题描述

我在我的数据框上绘制了一个散点图,如下所示:

在此处输入图像描述

带代码

from scipy import stats   
import pandas as pd
import seaborn as sns
df = pd.read_csv('/content/drive/My Drive/df.csv', sep=',') 
subset = df[:,1:10080]   
df['mean'] = subset.mean(axis=1)

df.plot(x='mean', y='Result', kind = 'scatter')
sns.lmplot('mean', 'Result', df, order=1)

我想使用代码在图中找到回归的斜率

scipy.stats.mstats.linregress(Result,average)        

但从输出来看,斜率幅度似乎太小了:

LinregressResult(slope=-0.0001320534706614152, intercept=27.887336813241845, rvalue=-0.16776138446214162, pvalue=3.0450456899520655e-07, stderr=2.55977061451773e-05)

如果我切换Resultaverage位置,

scipy.stats.mstats.linregress(average,Result)        

它仍然看起来不正确,因为intercept它太大了

LinregressResult(slope=-213.12489536011773, intercept=7138.48783135982, rvalue=-0.16776138446214162, pvalue=3.0450456899520655e-07, stderr=41.31287437069993)

为什么会这样?这些输出值是否需要重新调整?

标签: pythonpandasnumpyscipy

解决方案


的签名scipy.stats.mstats.linregresslinregress(x,y)您的第二次订购,linregress(average, Result)与您的图表绘制方式一致。在该图上,截距 7138 似乎并非不合理——您是否对您显示的 x 轴限制不会下降到 0(截距实际发生的位置)这一事实感到困惑?

在任何情况下,您的数据看起来并不像它们遵循线性定律,因此斜率(或来自完全错误指定的模型的任何参数)实际上不会告诉您太多。x 和 y 值都严格为正吗?有没有什么特别的原因导致 x 在逻辑上永远不会低于 25?数据点当然似乎与垂直渐近线堆积在一起。如果是这样,我可能会从 x 中减去 25,然后将线性模型拟合到记录的数据。换句话说,用 and 做你的和你plot的。编辑:既然你说 x 是温度,那么 x 不能低于 25 是没有逻辑的原因(例如,想要推断低于 25 是有意义的——甚至低于 0)。因此不要减去 25,也不要记录 x。只需登录 y。linregressx=numpy.log(average-25)y=numpy.log(Result)

在您的评论中,您谈到重新调整斜率,最终怀疑您认为这会给您一个相关系数。这些是不同的东西。相关系数是关于线周围点的分布以及斜率。如果您想要的是相关性,请使用该关键字查找相关工具。


推荐阅读