2015-06-18 9 views
14

पांडा डेटाफ्रेम का उपयोग करके रैखिक प्रतिगमन करने के लिए अनुशंसित तरीका (यदि कोई है) क्या है? मैं कर सकता हूं, लेकिन मेरी विधि बहुत विस्तृत प्रतीत होती है। क्या मैं चीजों को अनावश्यक रूप से जटिल बना रहा हूं?पांडा डेटा फ्रेम का उपयोग कर rpy2 प्रतिगमन का न्यूनतम उदाहरण

आर कोड, तुलना के लिए:

x <- c(1,2,3,4,5) 
y <- c(2,1,3,5,4) 
M <- lm(y~x) 
summary(M)$coefficients 
      Estimate Std. Error t value Pr(>|t|) 
(Intercept)  0.6 1.1489125 0.522233 0.6376181 
x    0.8 0.3464102 2.309401 0.1040880 

अब, मेरी अजगर (2.7.10), rpy2 (2.6.0), और पांडा (0.16.1) संस्करण:

import pandas 
import pandas.rpy.common as common 
from rpy2 import robjects 
from rpy2.robjects.packages import importr 

base = importr('base') 
stats = importr('stats') 

dataframe = pandas.DataFrame({'x': [1,2,3,4,5], 
           'y': [2,1,3,5,4]}) 

robjects.globalenv['dataframe']\ 
    = common.convert_to_r_dataframe(dataframe) 

M = stats.lm('y~x', data=base.as_symbol('dataframe')) 

print(base.summary(M).rx2('coefficients')) 

      Estimate Std. Error t value Pr(>|t|) 
(Intercept)  0.6 1.1489125 0.522233 0.6376181 
x    0.8 0.3464102 2.309401 0.1040880 

वैसे, मुझे pandas.rpy.common के आयात पर एक भविष्यवाणियां मिलती हैं। हालांकि, जब मैं pandas2ri.py2ri(dataframe) की कोशिश की आर (उल्लेख here के रूप में) करने के लिए पांडा से एक dataframe कन्वर्ट करने के लिए, मैं

NotImplementedError: Conversion 'py2ri' not defined for objects of type '<class 'pandas.core.series.Series'>' 
+0

'rpy2' किस संस्करण का उपयोग कर रहे हैं? – joris

+0

मैंने इस जानकारी को जोड़ने के लिए अपना प्रश्न अपडेट कर दिया है। – mjandrews

+2

मुझे डेटाफ्रेम रूपांतरण के साथ समान समस्याएं थीं लेकिन मुझे गैर rpy2 फ़ंक्शंस का उपयोग करना पड़ा। 'Pandas2ri.py2ri (डेटाफ्रेम)' – shibumi

उत्तर

12

आर मिलता है और अजगर सख्ती से समान है क्योंकि आप अजगर/rpy2 आप जबकि में एक डेटा फ्रेम का निर्माण नहीं कर रहे हैं

अन्यथा आर में वैक्टर (एक डेटा फ्रेम के बिना) का उपयोग करें, rpy2 साथ रूपांतरण शिपिंग यहां काम कर रहा है:

from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
robjects.globalenv['dataframe'] = dataframe 
M = stats.lm('y~x', data=base.as_symbol('dataframe')) 

परिणाम:

>>> print(base.summary(M).rx2('coefficients')) 
      Estimate Std. Error t value Pr(>|t|) 
(Intercept)  0.6 1.1489125 0.522233 0.6376181 
x    0.8 0.3464102 2.309401 0.1040880 
+0

नाइस कॉल करने से पहले आपको 'pandas2ri.activate()' निष्पादित करना होगा। धन्यवाद। मुझे पता था कि मेरा प्रारंभिक प्रयास शायद अधिक जटिल चीजें थी। – mjandrews

+0

@l Unutbu का जवाब वास्तव में सहज दिखता है क्योंकि आर नेमस्पेस में डीएफ को असाइन करने की आवश्यकता नहीं है या as_symbol का उपयोग करें। क्या एक पांडस डीएफ को आर समारोह में सीधे पास करने की विधि है जैसे अनंटू के उदाहरण समर्थित वाक्यविन्यास या इसे हटा दिया जाएगा? प्रलेखन के माध्यम से मेरी जानकारी ने उत्तर नहीं दिया है। – KGS

+0

@ केजीएस: मेरा जवाब दावा को अमान्य करने पर केंद्रित है कि डेटा फ्रेम का रूपांतरण काम नहीं कर रहा है। ऐसा करने के लिए मैंने जितना संभव हो सके अपरिवर्तित प्रश्न में कोड रखा।मुझे @unutbu का जवाब जल्द ही अमान्य नहीं दिख रहा है: आर के आंकड़े :: एलएम' ने हमेशा पैरामीटर 'डेटा' स्वीकार कर लिया है, और मुझे नहीं लगता कि यह आसानी से बदल जाएगा। – lgautier

19

pandas2ri.activate() पर कॉल करने के बाद पांडस ऑब्जेक्ट्स से कुछ ऑब्जेक्ट्स आर ऑब्जेक्ट्स स्वचालित रूप से होते हैं। उदाहरण के लिए, आप

M = R.lm('y~x', data=df) 
बजाय

robjects.globalenv['dataframe'] = dataframe 
M = stats.lm('y~x', data=base.as_symbol('dataframe')) 

import pandas as pd 
from rpy2 import robjects as ro 
from rpy2.robjects import pandas2ri 
pandas2ri.activate() 
R = ro.r 

df = pd.DataFrame({'x': [1,2,3,4,5], 
        'y': [2,1,3,5,4]}) 

M = R.lm('y~x', data=df) 
print(R.summary(M).rx2('coefficients')) 

पैदावार

  Estimate Std. Error t value Pr(>|t|) 
(Intercept)  0.6 1.1489125 0.522233 0.6376181 
x    0.8 0.3464102 2.309401 0.1040880 
1

मैं कैसे की विशेष तत्वों को पुनः प्राप्त करने की रूपरेखा द्वारा unutbu's answer को जोड़ सकते हैं का उपयोग कर सकते गुणांक तालिका includin जी, महत्वपूर्ण रूप से, पी -वृत्त।

def r_matrix_to_data_frame(r_matrix): 
    """Convert an R matrix into a Pandas DataFrame""" 
    import pandas as pd 
    from rpy2.robjects import pandas2ri 
    array = pandas2ri.ri2py(r_matrix) 
    return pd.DataFrame(array, 
         index=r_matrix.names[0], 
         columns=r_matrix.names[1]) 

# Let's start from unutbu's line retrieving the coefficients: 
coeffs = R.summary(M).rx2('coefficients') 
df = r_matrix_to_data_frame(coeffs) 

यह हमें एक DataFrame जो हम सामान्य तरीके से उपयोग कर सकते हैं के साथ छोड़ देता है:

In [179]: df['Pr(>|t|)'] 
Out[179]: 
(Intercept) 0.637618 
x    0.104088 
Name: Pr(>|t|), dtype: float64 

In [181]: df.loc['x', 'Pr(>|t|)'] 
Out[181]: 0.10408803866182779 
संबंधित मुद्दे