2016-02-21 2 views
0

У меня есть ФР так:линейной регрессии на основе GroupBy

Allotment Year NDVI  A_Annex Bachelor 
A_Annex  1984 1.0  0.40  0.60 
A_Annex  1984 1.5  0.56  0.89 
A_Annex  1984 2.0  0.78  0.76 
A_Annex  1985 3.4  0.89  0.54 
A_Annex  1985 1.6  0.98  0.66 
A_Annex  1986 2.5  1.10  0.44 
A_Annex  1986 1.7  0.87  0.65 
Bachelor 1984 8.9  0.40  0.60 
Bachelor 1984 6.5  0.56  0.89 
Bachelor 1984 4.2  0.78  0.76 
Bachelor 1985 2.4  0.89  0.54 
Bachelor 1985 1.7  0.98  0.66 
Bachelor 1986 8.9  1.10  0.44 
Bachelor 1986 9.6  0.87  0.65 

, и я хочу, чтобы запустить регрессии, основанные на GroupBy. Я хочу регрессировать каждый уникальный Allotment и его значение NDVI с его ассоциированным столбцом. Поэтому я хочу регрессировать колонку A_Annex с AllotmentA_Annex и связанную с ней NDVI. И тогда я хочу сделать то же самое, но с Bachelor. По сути, я хочу сопоставлять столбцы с ассоциированным Allotment, а затем регрессировать значения в столбце с соответствующими значениями NDVI.

я мог бы сделать это за один надельной, как это:

stat=merge.groupby(['Allotment']).apply(lambda x: sp.stats.linregress(x['A_Annex'], x['NDVI'])) 

, но мне нужно было бы продолжить, чтобы изменить значение х в sp.stats.linregress(x['A_Annex'], x['NDVI'])), и я хотел бы избежать этого.

+0

Извините, но я не следую почему вы предшествуете свой фрагмент кода с помощью «Я мог бы сделать это за один надельный, как это:» - он будет делать это для каждого значения «Выделение». Я вообще не понимаю ваш вопрос. –

+0

Не уверен, что это самый лучший способ, но нет реального недостатка для простого цикла 'for' здесь, который я могу видеть:' для x в df.Allotment.unique(): your_regression_code' – JohnE

+0

Кстати, я думаю, самый рекомендуемый способ теперь делать регрессии панд с помощью statsmodels (я добавил тег выше) – JohnE

ответ

1

Вы после чего-то вроде этого?

r = {annex: pd.ols(x=group['A_Annex'], y=group['NDVI']) 
    for annex, group in df.groupby('Allotment')} 
>>> r 

{'A_Annex': 
-------------------------Summary of Regression Analysis------------------------- 

Formula: Y ~ <x> + <intercept> 

Number of Observations:   7 
Number of Degrees of Freedom: 2 

R-squared:   0.3774 
Adj R-squared:  0.2529 

Rmse:    0.6785 

F-stat (1, 5):  3.0307, p-value:  0.1422 

Degrees of Freedom: model 1, resid 5 

-----------------------Summary of Estimated Coefficients------------------------ 
     Variable  Coef Std Err  t-stat p-value CI 2.5% CI 97.5% 
-------------------------------------------------------------------------------- 
       x  1.9871  1.1415  1.74  0.1422 -0.2501  4.2244 
     intercept  0.3731  0.9454  0.39  0.7094 -1.4798  2.2260 
---------------------------------End of Summary---------------------------------, 
'Bachelor': 
-------------------------Summary of Regression Analysis------------------------- 

Formula: Y ~ <x> + <intercept> 

Number of Observations:   7 
Number of Degrees of Freedom: 2 

R-squared:   0.0650 
Adj R-squared: -0.1220 

Rmse:    3.4787 

F-stat (1, 5):  0.3478, p-value:  0.5810 

Degrees of Freedom: model 1, resid 5 

-----------------------Summary of Estimated Coefficients------------------------ 
     Variable  Coef Std Err  t-stat p-value CI 2.5% CI 97.5% 
-------------------------------------------------------------------------------- 
       x -3.4511  5.8522  -0.59  0.5810 -14.9213  8.0191 
     intercept  8.7796  4.8467  1.81  0.1298 -0.7200 18.2792 
---------------------------------End of Summary---------------------------------} 

Вы можете извлечь параметры модели следующим образом:

>>> {k: r[k].sm_ols.params for k in r} 
{'A_Annex': array([ 1.9871432 , 0.37310585]), 
'Bachelor': array([-3.45111992, 8.77960702])} 
Смежные вопросы