2017-12-09 10 views
0

이미 이와 같은 질문이 있지만 수정을 원하며 행운이별로없는 몇 가지 방법을 시도했습니다.예측 잔차를 추가하고 팬더 데이터 프레임에 rsquared - 그룹별로

나는 데이터를 가지고 있으며 판다 데이터 프레임에 그룹별로 회귀의 R 제곱을 별도의 열로 추가하려고합니다. 여기서주의해야 할 점은 각 그룹 내에서 극단적 인 잔여 값을 가지지 않는 값 (즉, 1 표준 편차 이내 또는 -1과 1 z 점수 사이)에 대한 회귀를 수행하기만을 원한다는 것입니다. 지금은 다른 게시물에 있던 대답은 나를 그룹에 잔류를 얻기 위해 작동하는 등이다

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) 

지금이 중대하다 :이 솔루션이었다. 잔류 내 + 1/-1 zscore 이내이다

그러나 지금은 을 I 만 점 각 그룹 내의 R은 회귀 제곱 추가 할 R 제곱 인 다른 열을 추가 할 각 그룹 내에. 따라서 목표는 회귀에서 극단적 인 특이 치를 제거하는 R- 제곱을 추가하는 것입니다 (모든 데이터를 사용하여 R- 제곱 값의 R- 제곱 값을 향상시켜야 함). 어떤 도움을 주시면 감사하겠습니다.

은 참고

그냥 보통의 R이 기능이 될 것 제곱 추가 ** 편집 :

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()) 
:이 여기에

**

내 코드

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입니다

출력 :

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 

그래서 여기에서는 Z 점수가 1보다 크고 -1보다 작은 점수를 사용하지 않고 그룹당 R 제곱의 다른 열을 사용하고자합니다 (예 : 색인 14, 16, 22 및 24는 사용하지 않을 것입니다. r square 계산에 의한 그룹. , 삭제하려면 다음을 시도합니다 (z_score 열을 만든 후) 현재 코드의 맨 끝에, 그리고

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 

:

답변

0

먼저, 모두 residrsquared 열을 할당합니다 groupreg의 전체 정의를 사용 행에서 rsquared 항목 곳 -1 < z_score < 1 :

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