比较斜率的分类数据

时间:2017-11-06 06:24:31

标签: python scipy linear-regression

您好我想比较2009年至2017年以下销售数据分布的线性回归线的斜率。因此,如果“蓝色条形图高于其他条形图,我不感兴趣“但如果这三个类别的斜率存在差异。

enter image description here

我想比较回归线的斜率 - 检查它们是否显着不同 -

方法:我为每个回归线绘制额外的置信区间。如果斜率不同并且置信区间在给定时间段内不重叠,我知道斜率是不同的。这是一种合适的方法吗?我怎样才能实现它?

这三个类别的数据是:

Blue  413 506 367 436 523 432 415 700 506 
Red     24 82 126 106 107 115 139 109 101 
Green  27   69  68  79  83  80  113 116 94  

感谢任何帮助!!

3 个答案:

答案 0 :(得分:2)

在python中,这可以使用statsmodels来完成。 您必须设置一个pandas数据框,其中包含一列中的所有数据(),年份列和另一列(我们称之为 color_group )这是一个分类变量,指示数据属于哪个组/颜色。然后,您可以设置一个类似这样的模型:

import statsmodels.formula.api as smf
import numpy as np
import pandas as pd

dat_blue = np.array([413,506,367,436,523,432,415,700,506])
dat_red = np.array([24,82,126,106,107,115,139,109,101])
dat_green = np.array([27,69,68,79,83,80,113,116,94])
values = np.r_[dat_blue, dat_red, dat_green]

yrs = np.array(range(2009,2018))
years = np.r_[yrs, yrs, yrs]

grp = np.r_[np.repeat('BLUE', 9), np.repeat('RED', 9), np.repeat('GREEN', 9)]
df = pd.DataFrame({'value':values, 'year':years, 'color_group':grp})

lm1 = smf.ols(formula='value ~ year * color_group', data=df).fit()
lm1.summary()

然后查看结果以测试year和colour_group之间的interaction。这里有点复杂,但请查看上面的文档链接。我认为这只会测试斜坡是否完全相同。

更进一步,统计学家担心这些涉及时间序列数据的测试中会serial correlation

答案 1 :(得分:1)

费希尔z检验是一种比较相关系数的方法。我之所以提到这一点,是因为你可能会遇到两个样本具有相同的相关系数(x很可能是两者中y的预测因子)但是斜率不同的情况。反之亦然。这很重要,因为它告诉我们在测试零假设时使用哪种方法,两个样本的斜率相同(在此处阅读:http://core.ecu.edu/psyc/wuenschk/docs30/CompareCorrCoeff.pdf

你可以找到每条线的斜率(这里是其中一条线的一个例子)。

from scipy import stats
import numpy as np

x = [2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017]
y_blue = [944, 413, 506, 367, 436, 523, 432, 415, 700, 506]

slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
print(slope)

如果你的样本很大(n> 30就是我所教的那样)而且你不能假设方差的同质性那么z-test就是:

numerator = slope1 - slope2
denominator = pow((pow(std_error1,2) + pow(std_error2,2), 1/2)
z = numerator / denominator  

&安培;使用z-statistic找到p值(在此处阅读:https://www.sophia.org/tutorials/how-to-find-a-p-value-from-a-z-test-statistic

如果你可以假设方差的同质性,那么你想做一个合并的学生t检验。这与上述方法类似,只是不同的公式。检查我发布的第一个链接。

答案 2 :(得分:1)

真实地估计斜坡的统计意义'差异,方法上最准确的方法是使用双因素方差分析。在这个统计测试中,斜率之间的差异是指销售代理(或任何颜色所指的)和年份之间的主要因素之间的相互作用。如果每种颜色的销售率随时间的变化不同,那么您将获得销售代理与年份之间的互动。 问题是在python中没有简单的实现这种anova(例如scipy中没有),我知道。您可以使用需要安装的pyvttbl库。

请参阅此处https://pypi.python.org/pypi/pyvttbl

https://www.marsja.se/two-way-anova-repeated-measures-using-python/

关于您查看置信区间是否重叠的建议,我相信这不会给您准确的指示。首先,3个销售代理的拦截(也可能是范围?)不同,置信区间将为您提供销售价值的指示,而不是时间和销售之间的相互作用。其次,置信区间的重叠与统计显着性并不完全平行,尽管许多人确实将它们混合起来。您可以在重叠误差线上产生统计上的显着性差异。