すでにこのような質問がありますが、修正が必要で、多くの方法を試してみました。予測残差を追加し、パンダのデータフレームにrsquaredをグループ別に
私はデータを持っており、グループごとに回帰のR二乗をパンダデータフレームの別々の列として追加したいと考えています。ここで注意しなければならないのは、各グループ内で極端な残存値を持たない値(すなわち、1標準偏差または-1と1zスコアの間)で回帰を行いたいだけです。今、別のポストにあった答えは、私は、グループ内の残差を取得するために働くようになっている
df = pd.DataFrame({'gp': [1,1,1,1,1,2,2,2,2,2],
'x1': [3.17, 4.76, 4.17, 8.70, 11.45, 3.17, 4.76, 4.17, 8.70, 1.45],
'x2': [23, 26, 73, 72, 16, 26, 73, 72, 16, 25],
'y': [880.37, 716.20, 974.79, 322.80, 1054.25, 980.37, 816.20, 1074.79, 522.80, 1254.25]},
index=np.arange(10, 30, 2))
:ここ
は SAMPLEデータフレームです。これは解決策だった:私は、各グループ内で線形回帰の残差を与える列残差を持っているのでimport pandas as pd
import numpy as np
import statsmodels.formula.api as sm
regmodel = 'y ~ x1 + x2'
def groupreg(g):
g['residual'] = sm.ols(formula=regmodel, data=g).fit().resid
return g
df = df.groupby('gp').apply(groupreg)
print(df)
は今、これは素晴らしいです。
しかし今は私はRのみ残差が以内+ 1/-1 zscore内にあるポイントの各グループ内回帰の二乗追加するR二乗された別の列を追加します各グループ内で。だから、目標は回帰で極限の外れ値を取り除くR-二乗を加えることです(これはすべてのデータを使って正規のR-二乗のR-二乗値を改善するはずです)。どんな助けもありがとう。ここで
def groupreg(g):
g['residual'] = sm.ols(formula=regmodel, data=g).fit().resid
g['rsquared'] = sm.ols(formula=regmodel, data=g).fit().rsquared
return g
EDIT 2 **
が私のコードです:
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm
df = pd.DataFrame({'gp': [1,1,1,1,1,2,2,2,2,2],
'x1': [3.17, 4.76, 4.17, 8.70, 11.45, 3.17, 4.76, 4.17, 8.70, 1.45],
'x2': [23, 26, 73, 72, 16, 26, 73, 72, 16, 25],
'y': [880.37, 716.20, 974.79, 322.80, 1054.25, 980.37, 816.20, 1074.79, 522.80, 1254.25]},
index=np.arange(10, 30, 2))
regmodel = 'y ~ x1 + x2'
def groupreg(g):
g['residual'] = sm.ols(formula=regmodel, data=g).fit().resid
return g
df = df.groupby('gp').apply(groupreg)
print(df)
df['z_score'] = df.groupby('gp')['residual'].apply(lambda x: (x - x.mean())/x.std())
編集**
FYI普通のR関数はこのことでしょう乗追加します
出力:
gp x1 x2 y residual z_score
10 1 3.17 23 880.37 -43.579309 -0.173726
12 1 4.76 26 716.20 -174.532201 -0.695759
14 1 4.17 73 974.79 318.634921 1.270214
16 1 8.70 72 322.80 -287.710952 -1.146938
18 1 11.45 16 1054.25 187.187542 0.746209
20 2 3.17 26 980.37 -67.245089 -0.822329
22 2 4.76 73 816.20 -96.883281 -1.184770
24 2 4.17 72 1074.79 104.400010 1.276691
26 2 8.70 16 522.80 21.017543 0.257020
28 2 1.45 25 1254.25 38.710817 0.473388
ここでは、グループごとにRの二乗を別の列にしたいのですが、Zスコアが1より大きく、-1より小さいポイントを使用しないようにします(たとえば、インデックス14,16,22、および24は使用しませんr 2乗計算によってグループ内にある。