2015-08-19 35 views
5

Thực tiễn hữu ích và phổ biến để nối các giá trị được dự đoán và số dư từ chạy hồi quy lên một khung dữ liệu dưới dạng các cột riêng biệt. Tôi mới đến gấu trúc, và tôi gặp khó khăn khi thực hiện thao tác rất đơn giản này. Tôi biết tôi đang thiếu một cái gì đó hiển nhiên. Có a very similar question hỏi khoảng một năm rưỡi trước, nhưng nó không thực sự được trả lời.Gắn giá trị dự đoán và số dư vào khung dữ liệu gấu trúc

Các dataframe hiện trông giống như sau:

y    x1   x2 
880.37   3.17   23 
716.20   4.76   26 
974.79   4.17   73 
322.80   8.70   72 
1054.25   11.45  16 

Và tất cả tôi muốn là để trả về một dataframe có giá trị tiên đoán và còn sót lại từ y = x1 + x2 cho mỗi quan sát:

y    x1   x2  y_hat   res 
880.37   3.17   23  840.27  40.10 
716.20   4.76   26  752.60  -36.40 
974.79   4.17   73  877.49  97.30 
322.80   8.70   72  348.50  -25.70 
1054.25   11.45  16  815.15  239.10 

Tôi đã thử giải quyết vấn đề này bằng cách sử dụng các mô hình thống kê và gấu trúc và không thể giải quyết được. Cảm ơn trước!

Trả lời

5

Đây là biến thể về câu trả lời của Alexander sử dụng mô hình OLS từ mô hình thống kê thay vì mô hình gấu trúc ols. Chúng ta có thể sử dụng công thức hoặc giao diện mảng/DataFrame cho các mô hình.

fittedvaluesresid là chuỗi gấu trúc có chỉ mục chính xác. predict không trả lại chuỗi gấu trúc.

import numpy as np 
import pandas as pd 
import statsmodels.api as sm 
import statsmodels.formula.api as smf 

df = pd.DataFrame({'x1': [3.17, 4.76, 4.17, 8.70, 11.45], 
        'x2': [23, 26, 73, 72, 16], 
        'y': [880.37, 716.20, 974.79, 322.80, 1054.25]}, 
        index=np.arange(10, 20, 2)) 

result = smf.ols('y ~ x1 + x2', df).fit() 
df['yhat'] = result.fittedvalues 
df['resid'] = result.resid 


result2 = sm.OLS(df['y'], sm.add_constant(df[['x1', 'x2']])).fit() 
df['yhat2'] = result2.fittedvalues 
df['resid2'] = result2.resid 

# predict doesn't return pandas series and no index is available 
df['predicted'] = result.predict(df) 

print(df) 

     x1 x2  y  yhat  resid  yhat2  resid2 \ 
10 3.17 23 880.37 923.949309 -43.579309 923.949309 -43.579309 
12 4.76 26 716.20 890.732201 -174.532201 890.732201 -174.532201 
14 4.17 73 974.79 656.155079 318.634921 656.155079 318.634921 
16 8.70 72 322.80 610.510952 -287.710952 610.510952 -287.710952 
18 11.45 16 1054.25 867.062458 187.187542 867.062458 187.187542 

    predicted 
10 923.949309 
12 890.732201 
14 656.155079 
16 610.510952 
18 867.062458 

Như xem trước, có một phương pháp dự đoán mở rộng trong các kết quả mô hình trong statsmodels thạc sĩ (0,7), nhưng API chưa được giải quyết:

>>> print(result.get_prediction().summary_frame()) 
      mean  mean_se mean_ci_lower mean_ci_upper obs_ci_lower \ 
10 923.949309 268.931939 -233.171432 2081.070051 -991.466820 
12 890.732201 211.945165  -21.194241 1802.658643 -887.328646 
14 656.155079 269.136102 -501.844105 1814.154263 -1259.791854 
16 610.510952 282.182030 -603.620329 1824.642233 -1339.874985 
18 867.062458 329.017262 -548.584564 2282.709481 -1214.750941 

    obs_ci_upper 
10 2839.365439 
12 2668.793048 
14 2572.102012 
16 2560.896890 
18 2948.875858 
+0

Cảm ơn bạn, đây là một trợ giúp to lớn! –

1

Vì vậy, hãy lịch sự để tạo câu hỏi của bạn để người đóng góp có thể dễ dàng chạy mã của bạn.

import pandas as pd 

y_col = [880.37, 716.20, 974.79, 322.80, 1054.25] 
x1_col = [3.17, 4.76, 4.17, 8.70, 11.45] 
x2_col = [23, 26, 73, 72, 16] 

df = pd.DataFrame() 
df['y'] = y_col 
df['x1'] = x1_col 
df['x2'] = x2_col 

Sau đó gọi df.head() sản lượng:

  y  x1 x2 
0 880.37 3.17 23 
1 716.20 4.76 26 
2 974.79 4.17 73 
3 322.80 8.70 72 
4 1054.25 11.45 16 

Bây giờ cho câu hỏi của bạn, nó khá đơn giản để thêm các cột với các giá trị tính toán, mặc dù tôi không đồng ý với các dữ liệu mẫu của bạn:

df['y_hat'] = df['x1'] + df['x2'] 
df['res'] = df['y'] - df['y_hat'] 

Đối với tôi, những lợi nhuận sau:

  y  x1 x2 y_hat  res 
0 880.37 3.17 23 26.17 854.20 
1 716.20 4.76 26 30.76 685.44 
2 974.79 4.17 73 77.17 897.62 
3 322.80 8.70 72 80.70 242.10 
4 1054.25 11.45 16 27.45 1026.80 

Hy vọng điều này sẽ hữu ích!

+1

Để thêm các cột đó là sự kết hợp cộng của hiện các cột bạn cũng có thể làm 'df.eval ('y_hat = x1 + y1')' rất đẹp, đặc biệt nếu tên DataFrame của bạn dài – JoeCondron

+0

Rất hữu ích. Sẽ đảm bảo thêm mã nguồn dataframe trong tương lai. Cảm ơn bạn! –

1

Điều này phải tự giải thích.

import pandas as pd 

df = pd.DataFrame({'x1': [3.17, 4.76, 4.17, 8.70, 11.45], 
        'x2': [23, 26, 73, 72, 16], 
        'y': [880.37, 716.20, 974.79, 322.80, 1054.25]}) 
model = pd.ols(y=df.y, x=df.loc[:, ['x1', 'x2']]) 
df['y_hat'] = model.y_fitted 
df['res'] = model.resid 

>>> df 
     x1 x2  y  y_hat   res 
0 3.17 23 880.37 923.949309 -43.579309 
1 4.76 26 716.20 890.732201 -174.532201 
2 4.17 73 974.79 656.155079 318.634921 
3 8.70 72 322.80 610.510952 -287.710952 
4 11.45 16 1054.25 867.062458 187.187542 
+0

Điều này đơn giản và tốt hơn. –

Các vấn đề liên quan