2012-09-30 40 views
9

Tôi có một dataframe Pandas với các cột nhưhồi quy tuyến tính - giảm bậc tự do

Order  Balance  Profit cum (%) 

tôi đang làm một hồi quy tuyến tính

model_profit_tr = pd.ols(y=df_closed['Profit cum (%)'], x=df_closed['Order']) 

Vấn đề với điều này là mô hình chuẩn là như thế nào (phương trình của một dòng không đi qua nguồn gốc)

y = a * x + b 

Có 2 bậc tự do (a và b)

dốc (a):

a=model_profit_tr.beta['x'] 

và đánh chặn (b):

b=model_profit_tr.beta['intercept'] 

Tôi muốn giảm mức độ tự do cho mô hình của tôi (2-1) và tôi muốn có một mô hình như

y = a * x 

Trả lời

8

Sử dụng đối số intercept keyword:

model_profit_tr = pd.ols(y=df_closed['Profit cum (%)'], 
         x=df_closed['Order'], 
         intercept=False) 

Từ tài liệu:

In [65]: help(pandas.ols) 
Help on function ols in module pandas.stats.interface: 

ols(**kwargs) 

    [snip] 

    Parameters 
    ---------- 
    y: Series or DataFrame 
     See above for types 
    x: Series, DataFrame, dict of Series, dict of DataFrame, Panel 
    weights : Series or ndarray 
     The weights are presumed to be (proportional to) the inverse of the 
     variance of the observations. That is, if the variables are to be 
     transformed by 1/sqrt(W) you must supply weights = 1/W 
    intercept: bool 
     True if you want an intercept. Defaults to True. 
    nw_lags: None or int 
     Number of Newey-West lags. Defaults to None. 

    [snip] 
+0

Cảm ơn rất nhiều (cho cả hai giải pháp, và sự giúp đỡ lời khuyên)! –

+0

Tôi chỉ là một câu hỏi khác nhưng tôi không biết nếu tôi có thể yêu cầu nó ở đây ... tôi nên làm gì nếu tôi muốn đặt chặn cho một giá trị nhất định (khác 0). (Tôi cũng sẽ giảm số bậc tự do từ 2 xuống 1) –

+0

@FemtoTrader: Tôi không nghĩ rằng 'ols' có chức năng đó. Nhưng, xem xét nó có hình vuông nhỏ nhất, bạn có thể trừ rằng đánh chặn từ 'y', sau đó sử dụng' ols' với 'intercept = False'. Nó sẽ giống nhau. – Avaris

0

Dưới đây là một giải pháp cho thấy mẫu:

#!/usr/bin/env python 

import pandas as pd 
import matplotlib.pylab as plt 
import numpy as np 

data = [ 
(0.2, 1.3), 
(1.3, 3.9), 
(2.1, 4.8), 
(2.9,5.5), 
(3.3,6.9) 
] 

df = pd.DataFrame(data, columns=['X', 'Y']) 

print(df) 

# 2 degrees of freedom : slope/intercept 
model_with_intercept = pd.ols(y=df['Y'], x=df['X'], intercept=True) 
df['Y_fit_with_intercept'] = model_with_intercept.y_fitted 

# 1 degree of freedom : slope ; intersept=0 
model_no_intercept = pd.ols(y=df['Y'], x=df['X'], intercept=False) 
df['Y_fit_no_intercept'] = model_no_intercept.y_fitted 

# 1 degree of freedom : slope ; intersept=offset 
offset = -1 
df['Yoffset'] = df['Y'] - offset 
model_with_offset = pd.ols(y=df['Yoffset'], x=df['X'], intercept=False) 
df['Y_fit_offset'] = model_with_offset.y_fitted + offset 

print(model_with_intercept) 
print(model_no_intercept) 
print(model_with_offset) 

df.plot(x='X', y=['Y', 'Y_fit_with_intercept', 'Y_fit_no_intercept', 'Y_fit_offset']) 
plt.show() 
Các vấn đề liên quan