regplot()的强大选项到底有什么作用?

时间:2018-05-02 08:40:18

标签: python matplotlib scipy seaborn correlation

this question相关,我想知道seaborn的regplot()中的robust选项实际上是什么。

描述如下:

  

如果True,请使用statsmodels来估算稳健回归。这将减轻异常值。请注意,这比标准线性回归的计算密集程度要大得多,因此您可能希望减少引导重新采样的数量(n_boot)或将ci设置为None

这是否意味着它更类似于Kendall或Spearman相关的工作方式,因为众所周知它们可以抵抗异常值?或者它们之间没有任何关系?换句话说,在为某些数据计算Kendall并使用regplot()绘制散点图时,使用robust=True是否有意义?

1 个答案:

答案 0 :(得分:2)

相关系数与回归系数

KendallSpearman相关性衡量两个变量的相关性,两个变量的密切关系。结果是相关系数,这是一个统计数据,可以告诉您相关事物的相关性(1是完美的关系,0是完美的关系缺席),从粗略的意义上说,这种相关性的方向性(-1代表负斜率)。同样重要的是要注意Spearman和Kendall相关系数对异常值都很敏感,而Spearman方法更敏感。

另一方面,

Robust Linear Regression是线性回归的一个特例,它是一种找到2个或更多变量之间关系的方法。您可以将其视为找到最佳匹配线的方法。线性回归的结果是回归系数,它衡量您的响应随变量变化的方式(方向和斜率)。

"古典"与鲁棒线性回归

通常,线性回归使用Ordinary Least Squares, or OLS来查找回归系数,目标是最小化残差的平方和(估计线与实际数据之差的平方根)。这对异常值非常敏感:

x = np.arange(0,10,0.2)
y = (x*0.25)+np.random.normal(0,.1,50)
y[[12,14,18,24]] -= 4

sns.regplot(x,y, robust = False)

enter image description here

注意异常值如何拖动线条。在很多情况下,这是您想要看到的行为。

另一方面,稳健的回归方法通常使用不同的度量来查找除OLS之外的回归系数,例如最小化least trim squares,这实际上是数据子集上的平方和(在这个意义上) ,它类似于bootstrapping)。通常,这是iteratively, weighing the result accordingly完成的,因此给定的异常值最终不会对系数产生巨大影响。这就是statsmodels.robust.robust_linear_model.RLM所做的事情,当你在seaborn中使用robust = True时会调用它。结果,与以前相同的数据:

sns.regplot(x,y,robust = True)

enter image description here

请注意,您的异常值并未拖累该行。在许多情况下,这不是人们想要的行为,但这取决于你在做什么......

注意:这在计算上非常昂贵(仅适用于那50个数据点,在我的机器上运行大约需要5秒钟)。

使用哪个相关系数?

如果您想继续报告Kendall相关系数, 在可视化数据时不要使用 robust参数。这将是误导性的,因为肯德尔的误差敏感度与你的稳健线性回归所代表的不相当(为了说明这可以变化多少,在我上面的数据中,肯德尔相关系数是0.85,这是长矛手的回归。相关系数为0.93)。 sns.regplot()默认robust=True次调用HuberT(),默认情况下使用import React, { Component } from 'react'; import Card from './Card'; class Deck extends Component { constructor(props) { super(props); this.state = { deck: [], }; } componentDidMount() { return fetch('URL1') .then(response => response.json()) .then(deck => { fetch(`URL2`) .then(response => response.json()) .then(({ cards }) => { this.setState(state => { state.deck = cards; }); this.forceUpdate(); }); }); } render() { const { deck } = this.state; return deck.map((card, i) => <Card card={card} key={this.state.deck[i].code} />); } } export default Deck; 条件。因此,如果你想报告相关系数​​之类的东西,我的直觉是你必须使用statsmodels.robust.robust_linear_model.RLM的一些量度(你可能会找到更多关于那个{{3}的信息。 }})。或者,您可以阅读huber loss,它似乎对强大的相关系数替代方案有一些了解。