2015-02-15 5 views
0

сказать, что я сделать регрессию МНК с использованием statsmodels переменной y на некоторых объясняющих переменных x1 x2 x3 (содержится в dataframe df):МНК предсказать, используя только подмножество объясняющих переменных

res = smf.ols('y ~ x1 + x2 + x3', data=df).fit() 

Можно ли получить предсказанное значение, используя только подмножество объясняющих переменных? Например, я хотел бы получить прогнозируемое значение для наблюдений в df, используя только x1 и x2, но не .

Я попытался сделать

res.predict(df[['x1','x2']]) 

, но я получаю сообщение об ошибке: NameError: name 'x3' is not defined.

Редактировать: Причина, по которой я хочу сделать это, заключается в следующем. Я выполняю регрессию ценностей дома по характеристикам дома и манекенам для столичной области, статуса пригородного района и года. Я хотел бы использовать манекены для столичной области, пригородного статуса и года, чтобы построить индекс цен для каждого местоположения и периода времени.

Редактировать 2: Вот как я это сделал, на случай, если это может быть полезно любому, или кто-то может указать мне на лучший способ сделать это.

Я заинтересован в этом МНК на следующей спецификации:

model = 'price ~ C(MetroArea) + C(City) + C(Year) + x1 + ... + xK' 

где 'x1 + ... + xK' псевдо-код для связки переменных, которые я использую в качестве контроля, но я не интересует, и категориальные переменные очень большие (например, 90 мегаполисов).

Далее я подгоняю модель с помощью statsmodels и создаю матрицу дизайна, которую я буду использовать для прогнозирования цен с использованием интересующих переменных.

res = smf.ols(model, data=mydata).fit() 

data_prediction = mydata[['MetroArea','City','Year']] 
model_predict = 'C(MetroArea) + C(City) + C(Year)' 
X = patsy.dmatrix(model_predict, data=data_prediction, return_type='dataframe') 

Хитрость теперь выбрать правильные параметры для переменных, представляющего интереса, так как существует много, и их имена не являются именно теми их соответствующими переменными, так как я использовал категорический оператор, C(), из (например, переменные для MetroArea выглядят так: C(MetroArea)[0], C(MetroArea)[8], ...).

vars_interest = ['Intercept', 'MetroArea', 'City', 'Year'] 
params_interest = res.params[[any([word in var for word in vars_interest]) 
           for var in res.params.index]] 

Получить предсказание, делая скалярное произведение выбранных параметров и переменных, представляющих интерес:

prediction = np.dot(X,params_interest) 

ответ

1

Что вы пытаетесь сделать концептуально? Когда вы прогнозируете использование своей регрессии, вы просто включаете значения в уравнение. Поэтому предсказание «без » такое же, как просто подключение x3 = 0.

С точки зрения реализации этого, похоже, что statsmodels довольно суровые по поводу прогнозирования, используя те же имена переменных, что и во время подгонки. Так что это не элегантно, но работает:

df2 = df.copy() 
df2['x3'] = 0 
res.predict(df2[['x1','x2','x3']]) 
+0

Проблема с этим решением является то, что она становится очень неудобно, когда 'x3' большой вектор управляющих переменных, а когда' df' большой набор данных. – Maturin

+2

Я не думаю, что поддержка этого в предсказании имеет смысл. Вы должны просто сделать точечный продукт самостоятельно, если вы хотите это сделать. Вам нужно будет передавать константу явно в X, хотя. – jseabold

+1

Представление для OLS (линейная модель) - это просто 'x dot params', поэтому вы можете выбрать соответствующие столбцы x и соответствующие элементы вектора params. – user333700

Смежные вопросы