对于我的研究,我对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值。那我该怎么办呢? 我需要得到上面的代码,相对于“测试事件”,使用“ groupby”给我“ bestR2”值。 R2值经过高度处理以适合我的研究项目所需的结果。 因此,直接使用Linregress将无济于事,这就是我计算bestR2不同的原因。 简而言之:我需要通过上述方法计算出的多个测试事件的最佳R2值。
结果应如下:
Test_Event best R2
1 0.999
2 0.547
3 0.845
4 0.784
感谢阅读!
答案 0 :(得分:1)
您可以按“ 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