当前位置: 代码迷 >> python >> 在统计处理的 R2 值上使用“groupby”-python
  详细解决方案

在统计处理的 R2 值上使用“groupby”-python

热度:41   发布时间:2023-07-14 09:50:08.0

对于我的研究,我对 R2 值进行了特定计算。 它不是使用 Linregress 函数直接计算的 R2 值。

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

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


import numpy, scipy,pandas as pd, matplotlib
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import scipy.stats
import copy
df=pd.read_excel("I:/Python/Excel.xlsx")
df.head()

xyDataPairs = df[['x', 'y']].values.tolist()

minDataPoints = len(xyDataPairs) - 1
# utility function
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

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)
    print('best R2', bestR2)

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


结果应如下所示:

Test_Event  best R2
1           0.999
2           0.547
3           0.845
4           0.784

谢谢阅读!!

您可以按“test_event”列进行分组,并应用自定义函数来计算每个组的 best_r2 值。 自定义函数只是您所需逻辑的包装器(此处称为compute_best_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因为它看起来像是一个错误,请确保这是您的意图。

我使用以下示例数据对其进行了测试:

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