gpt4 book ai didi

python - 对统计处理的 R2 值使用 'groupby' - python

转载 作者:行者123 更新时间:2023-12-01 09:00:54 28 4
gpt4 key购买 nike

对于我的研究,我对 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

关于python - 对统计处理的 R2 值使用 'groupby' - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52462144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com