使用';groupby';关于统计处理的R2值-python

使用';groupby';关于统计处理的R2值-python,python,python-3.x,pandas,numpy,scipy,Python,Python 3.x,Pandas,Numpy,Scipy,对于我的研究,我有一个R2值的具体计算。它不是使用线性回归函数直接计算的R2值 我使用的代码用于统计处理的R2值(标记为“最佳R2”)。我得到整个x轴和y轴的R2值。但是,数据中有多个“测试事件”。这意味着我需要单个“测试事件”的R2值 到目前为止,我用于计算R2值(以及我需要的输出)的代码如下: Test_Event best R2 1 0.999 2 0.547 3 0.845 4 0.784 上述最佳R2

对于我的研究,我有一个R2值的具体计算。它不是使用线性回归函数直接计算的R2值

我使用的代码用于统计处理的R2值(标记为“最佳R2”)。我得到整个x轴和y轴的R2值。但是,数据中有多个“测试事件”。这意味着我需要单个“测试事件”的R2值

到目前为止,我用于计算R2值(以及我需要的输出)的代码如下:

Test_Event  best R2
1           0.999
2           0.547
3           0.845
4           0.784

上述最佳R2值适用于整个x和y列。 但是,假设我必须将整个数据集拆分为四个事件,每个事件都有自己的R2值。那我怎么得到它呢? 我需要得到上面的代码,给我关于“测试事件”的带有“groupby”的“bestR2”值。 这是一个R2值,经过高度处理,以适合我的研究项目所需的结果。 因此,直接使用Linregress不会有帮助,这就是我计算bestR2时有所不同的原因。 简而言之:我需要通过上述方法计算的多个测试事件的最佳R2值


结果如下:

Test_Event  best R2
1           0.999
2           0.547
3           0.845
4           0.784

谢谢你的阅读

您可以按“测试事件”列进行分组,并应用自定义函数计算每个组的最佳\u r2值。自定义函数只是对所需逻辑的包装(这里称为
compute\u best\u r2

以下是一个可行的解决方案:

import numpy, pandas as pd
import copy

df=pd.read_excel("...")

def UniqueCombinations(items, n):
    if n==0:
        yield []
    else:
        for i in range(len(items)):
            for cc in UniqueCombinations(items[i+1:],n-1):
                yield [items[i]]+cc


def compute_best_r2(data):
    xyDataPairs = data[['x', 'y']].values.tolist()
    minDataPoints = len(xyDataPairs)
    bestR2 = 0.0
    bestDataPairCombination = []
    bestParameters = []

    for pairs in UniqueCombinations(xyDataPairs, minDataPoints):
        x = []
        y = []
        for pair in pairs:
            x.append(pair[0])
            y.append(pair[1])
        fittedParameters = numpy.polyfit(x, y, 1) # straight line
        modelPredictions = numpy.polyval(fittedParameters, x)
        absError = modelPredictions - y
        Rsquared = 1.0 - (numpy.var(absError) / numpy.var(y))
        if Rsquared > bestR2:
            bestR2 = Rsquared
            bestDataPairCombination = copy.deepcopy(pairs)
            bestParameters = copy.deepcopy(fittedParameters)
    data['best_r2'] = bestR2
    return data

df_with_best_r2 = df.groupby(['test_event']).apply(compute_best_r2)
result = df_with_best_r2[['test_event', 'best_r2']].groupby(['test_event']).agg(['first']).reset_index()[['test_event', 'best_r2']]
result.columns = result.columns.droplevel(-1)
请注意,我将
minDataPoints
更改为
len(xyDataPairs)
而不是
len(xyDataPairs)-1
,因为它看起来像一个bug,请确保这是您想要的

我使用以下样本数据对其进行了测试:

test_event  x   y
1          1.5  2
1          1    1.8
1          2    4
1          2    6
2          1    1
2          2    2
其结果是:

   test_event   best_r2
0           1  0.705464
1           2  1.000000

如果需要任何其他信息,或者需要更多澄清,请让我知道。为什么不干脆
groupby(“Test_Event”)
?@cncggvg,我确实尝试过groupby。我在代码开头的“minDataPoints”行之后添加了它。它没有帮助。有趣的是,
groupby
没有帮助,您能在excel中提供数据结构吗?