首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于线性回归R^2值的熊猫数据变化

基于线性回归R^2值的熊猫数据变化
EN

Stack Overflow用户
提问于 2015-12-13 14:35:23
回答 2查看 216关注 0票数 0

我需要对熊猫的数据拟合一个线性方程,根据直线的拟合(R^2值),我需要删除数据的行。我使用的是SciPy线性回归函数。我尝试过几种方法,但还没有找到一种我需要它的方式,比如:

代码语言:javascript
运行
复制
slope, intercept, r_value, p_value, std_err = stats.linregress([df['p_rel',df['y_BET'])
r_sq = r_value ** 2

if r_sq < 0.995:
    '''remove last row from dataframe and run linregress again. repeat this until r_sq >= 0.995 '''
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-13 14:54:43

为什么不把它变成一个函数呢?

代码语言:javascript
运行
复制
def regress(df):
    slope, intercept, r_value, p_value, std_err = stats.linregress(df['p_rel'], df['y_BET'])

    if r_value ** 2 < 0.995:
        regress(df.iloc[:-1, :])  # call again and regress with last row removed
    else:
        DO STUFF WITH RESULT

这个递归是保证结束的:我们正在回归两列(所以是两个n x 1结构),并递归地将其更新为n-1, n-2, ..., 2。它最迟在2停止,因为对两个2 x 1结构的回归保证R-平方等于1(从而在if语句中计算为false )。

编辑:如果您想在函数之外使用结果(请参阅注释),这是可行的:

代码语言:javascript
运行
复制
def regress(df):
    slope, intercept, r_value, p_value, std_err = stats.linregress(df['p_rel'], df['y_BET'])

    if r_value ** 2 < 0.995:
        return regress(df.iloc[:-1, :])  # call again and regress with last row removed
    else:
        return slope, intercept, r_value, p_value, std_err 

# call like so:
slope, intercept, r_value, p_value, std_err = regress(df)

# use the results here
票数 1
EN

Stack Overflow用户

发布于 2015-12-13 15:16:29

您可以使用一个generator expression来创建一个迭代器,它可以遍历linregress调用的序列。由于它是一个单程迭代器,对linregress的调用将被推迟到必要时。

然后可以使用itertools.dropwhile对生成器表达式进行迭代,删除结果直到R**2值大于0.995:

代码语言:javascript
运行
复制
import scipy.stats as stats
import itertools as IT
regressions = (stats.linregress([df['p_rel'].iloc[:-i], df['y_BET'].iloc[:-i]) 
                                for i in range(len(df)))
slope, intercept, r_value, p_value, std_err = next(IT.dropwhile(
    lambda x: x[2]**2 < 0.995, regressions))

您还可以将其包装在一个函数中:

代码语言:javascript
运行
复制
def regress_dropping_tail_outliers(x, y, threshold=0.995):
    regressions = (stats.linregress([x.iloc[:-i], y.iloc[:-i]) for i in range(len(x)))
    return next(IT.dropwhile(lambda x: x[2]**2 < threshold, regressions))

slope, intercept, r_value, p_value, std_err = regress_dropping_tail_outliers(
    df['p_rel'], df['y_BET'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34252216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档