2017-12-09 4 views
0

すでにこのような質問がありますが、修正が必要で、多くの方法を試してみました。予測残差を追加し、パンダのデータフレームに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乗計算によってグループ内にある。

答えて

0

まず、residrsquared列の両方が割り当てられgroupregのあなたの完全な定義を使用します。次に

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 

を、(z_score列を作成した後に)あなたの現在のコードの最後に、削除するには、次を試してみてください行-1 < z_score < 1rsquaredエントリ:

df.loc[df['z_score'].abs() < 1, 'rsquared'] = np.NaN 

出力:

gp  x1 x2  y residual rsquared z_score 
10 1 3.17 23 880.37 -43.579309  NaN -0.173726 
12 1 4.76 26 716.20 -174.532201  NaN -0.695759 
14 1 4.17 73 974.79 318.634921 0.250573 1.270214 
16 1 8.70 72 322.80 -287.710952 0.250573 -1.146938 
18 1 11.45 16 1054.25 187.187542  NaN 0.746209 
20 2 3.17 26 980.37 -67.245089  NaN -0.822329 
22 2 4.76 73 816.20 -96.883281 0.912987 -1.184770 
24 2 4.17 72 1074.79 104.400010 0.912987 1.276691 
26 2 8.70 16 522.80 21.017543  NaN 0.257020 
28 2 1.45 25 1254.25 38.710817  NaN 0.473388 
関連する問題