基于线性回归R^2值改变数据帧

2024-06-16 10:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将一个线性方程拟合到一个数据帧上,并且根据行的拟合程度(R^2值),我需要删除数据帧的行。我用的是SciPy线性回归函数。我已经尝试了一些方法,但还没有找到一种方法,可以满足我的需要,比如:

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 '''

Tags: 数据方法函数dfvaluestatssq线性
2条回答

您可以使用generator expression来创建迭代器 它可以遍历linregress调用序列。因为它是一个 一次通过迭代器,对linregress的调用将延迟到必要时。你知道吗

然后可以使用^{}在生成器表达式上迭代,删除结果直到R**2值大于0.995:

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))

也可以将其包装到函数中:

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'])

为什么不把它放到函数中呢?你知道吗

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)。你知道吗

编辑:如果要在函数外使用结果(请参见注释),则此操作有效:

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

相关问题 更多 >