2013-05-23 63 views
8

Tôi đang thực hiện hồi quy logistic bằng cách sử dụng pandas 0.11.0 (xử lý dữ liệu) và statsmodels 0.4.3 để thực hiện hồi quy thực tế, trên Mac OSX Lion.Python 2.7 - mô hình thống kê - định dạng và viết đầu ra tóm tắt

Tôi sẽ chạy ~ 2,900 mô hình hồi quy logistic khác nhau và cần kết quả đầu ra cho tệp csv và được định dạng theo cách cụ thể.

Hiện nay, tôi chỉ biết làm print result.summary() đó in kết quả (như sau) để vỏ:

Logit Regression Results       
    ============================================================================== 
Dep. Variable:   death_death No. Observations:     9752 
Model:       Logit Df Residuals:      9747 
Method:       MLE Df Model:       4 
Date:    Wed, 22 May 2013 Pseudo R-squ.:    -0.02672 
Time:      22:15:05 Log-Likelihood:    -5806.9 
converged:      True LL-Null:      -5655.8 
             LLR p-value:      1.000 
=============================================================================== 
        coef std err   z  P>|z|  [95.0% Conf. Int.] 
------------------------------------------------------------------------------- 
age_age5064 -0.1999  0.055  -3.619  0.000  -0.308 -0.092 
age_age6574 -0.2553  0.053  -4.847  0.000  -0.359 -0.152 
sex_female  -0.2515  0.044  -5.765  0.000  -0.337 -0.166 
stage_early -0.1838  0.041  -4.528  0.000  -0.263 -0.104 
access   -0.0102  0.001 -16.381  0.000  -0.011 -0.009 
=============================================================================== 

Tôi cũng sẽ cần các tỷ số chênh, mà được tính bằng print np.exp(result.params), và được in trong vỏ như vậy:

age_age5064 0.818842 
age_age6574 0.774648 
sex_female  0.777667 
stage_early 0.832098 
access   0.989859 
dtype: float64 

những gì tôi cần là cho các từng được viết vào một tập tin csv trong hình thức của một lon hàng rất tương tự (không chắc chắn, vào thời điểm này, cho dù tôi sẽ cần những thứ như Log-Likelihood, nhưng đã bao gồm nó vì lợi ích của toàn diện):

`Log-Likelihood, age_age5064_coef, age_age5064_std_err, age_age5064_z, age_age5064_p>|z|,...age_age6574_coef, age_age6574_std_err, ......access_coef, access_std_err, ....age_age5064_odds_ratio, age_age6574_odds_ratio, ...sex_female_odds_ratio,.....access_odds_ratio` 

Tôi nghĩ bạn sẽ có được hình ảnh - một hàng rất dài, với tất cả các giá trị thực tế này và tiêu đề có tất cả các chỉ định cột theo định dạng tương tự.

Tôi quen thuộc với csv module bằng Python và đang trở nên quen thuộc hơn với pandas. Không chắc chắn liệu thông tin này có thể được định dạng và lưu trữ trong một pandas dataframe và sau đó được viết, sử dụng to_csv vào tệp khi tất cả ~ 2,900 mô hình hồi quy logistic đã hoàn tất; điều đó chắc chắn sẽ ổn. Ngoài ra, viết chúng như mỗi mô hình được hoàn thành cũng tốt (sử dụng csv module).

UPDATE:

Vì vậy, tôi đang tìm kiếm thêm tại trang statsmodels, đặc biệt là cố gắng tìm hiểu làm thế nào kết quả của một mô hình được lưu trữ trong các lớp học. Có vẻ như có một lớp được gọi là 'Kết quả', sẽ cần được sử dụng. Tôi nghĩ rằng việc sử dụng thừa kế từ lớp này để tạo một lớp khác, trong đó một số phương thức/toán tử được thay đổi có thể là cách để đi, để có được định dạng mà tôi yêu cầu. Tôi có rất ít kinh nghiệm trong cách làm điều này, và sẽ cần phải dành một chút thời gian để tìm ra điều này (điều đó là tốt). Nếu ai cũng có thể giúp/có nhiều trải nghiệm tuyệt vời hơn!

Dưới đây là trang web nơi mà các lớp học được đặt ra: statsmodels results class

+0

Đã thêm cập nhật vào cuối câu hỏi này. Xin vui lòng xem qua! – DMML

+0

Nếu bạn xem xét cập nhật câu trả lời, vui lòng xem xét tự trả lời. – Jacinda

Trả lời

7

Không có bảng premade các thông số và thống kê kết quả của họ hiện nay.

Về bản chất, bạn cần phải tự mình sắp xếp tất cả các kết quả, cho dù trong danh sách, mảng hay gấu trúc có khối u dữ liệu phụ thuộc vào những gì thuận tiện hơn cho bạn hay không.

ví dụ, nếu tôi muốn một mảng NumPy có các kết quả cho một mô hình, LLF và kết quả trong bảng thông số tóm tắt, sau đó tôi có thể sử dụng

res_all = [] 
for res in results: 
    low, upp = res.confint().T # unpack columns 
    res_all.append(numpy.concatenate(([res.llf], res.params, res.tvalues, res.pvalues, 
        low, upp))) 

Nhưng nó có thể là tốt hơn để phù hợp với gấu trúc , tùy thuộc vào cấu trúc bạn có trên các mô hình.

Bạn có thể viết hàm trợ giúp lấy tất cả các kết quả từ cá thể kết quả và nối chúng trong một hàng.

(Tôi không chắc chắn những gì là thuận tiện nhất cho văn bản cho csv bởi hàng)

chỉnh sửa:

Dưới đây là một ví dụ lưu trữ các kết quả hồi quy trong một dataframe

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/sandbox/multilinear.py#L21

vòng lặp nằm trên đường 159.

tóm tắt() a mã tương tự bên ngoài các mô hình thống kê, ví dụ http://johnbeieler.org/py_apsrtable/ để kết hợp một số kết quả, được định hướng theo hướng in và không lưu trữ các biến.

+0

Cảm ơn bạn rất nhiều vì đã dành thời gian để đọc tất cả điều đó và để trả lời! Tôi sẽ thử nó/thử nghiệm với nó vào ngày mai! Tôi đã, ban đầu, cố gắng để iterate qua results.summary() - mà không hoạt động! – DMML

+0

Cảm ơn bạn một lần nữa vì điều này! Xin lỗi nó mất nhiều thời gian sau đó tôi đã nói nó sẽ lấy lại cho bạn. Tôi đã thử ví dụ 'res_all = []' mà bạn đưa ra và nó trả về một đối tượng 'TypeError: 'BinaryResultsWrapper' không thể lặp lại'. Bất kỳ ý tưởng? Tôi cũng sẽ xem github bạn đăng. – DMML

+0

Ngoài ra, hãy xem http://statsmodels.sourceforge.net/stable/_images/inheritance-094830692a2117caf718ad013bd23e2a57db7b6d.png này có vẻ như tôi đang xử lý 'BinaryResultsWrapper' trái ngược với kết quả ... – DMML

2

Nếu bạn muốn tìm kết quả hệ số.params sẽ cung cấp cho bạn các hệ số. Nếu bạn muốn tìm pvalues ​​thì sử dụng results.pvalues. Trong bất kỳ cách nào bạn có thể sử dụng dir (kết quả) để tìm hiểu tất cả các thuộc tính của một đối tượng.

0

Tôi thấy công thức này đơn giản hơn một chút. Bạn có thể thêm/bớt các cột bằng cách làm theo cú pháp từ các ví dụ (khoảng, coeff, conf_lower, conf_higher).

import pandas as pd  #This can be left out if already present... 

def results_summary_to_dataframe(results): 
    '''This takes the result of an statsmodel results table and transforms it into a dataframe''' 
    pvals = results.pvalues 
    coeff = results.params 
    conf_lower = results.conf_int()[0] 
    conf_higher = results.conf_int()[1] 

    results_df = pd.DataFrame({"pvals":pvals, 
           "coeff":coeff, 
           "conf_lower":conf_lower, 
           "conf_higher":conf_higher 
           }) 

    #Reordering... 
    results_df = results_df[["coeff","pvals","conf_lower","conf_higher"]] 
    return results_df 
Các vấn đề liên quan