2015-06-18 22 views
14

Bir pandalar veri çerçevesi kullanarak doğrusal regresyon yapmak için önerilen yol (varsa) nedir? Yapabilirim, ama yöntemim çok ayrıntılı görünüyor. İşleri gereksiz yere karmaşıklaştırıyor muyum?pandalar veri çerçevesini kullanarak rpy2 regresyonunun en az örneği

Şimdi
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 

, benim piton (2.7.10), rpy2 (2.6.0) ve pandalar (0.16.1) sürümü:

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 
karşılaştırma için

R kodu,

Bu arada, pandas.rpy.common ithalatında bir FutureWarning alıyorum. Ancak, (here belirtildiği gibi) R pandalar bir dataframe dönüştürmek için pandas2ri.py2ri(dataframe) çalıştığında, I

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

kullandığınız rpy2' 'sürümü nedir? – joris

+0

Bu bilgiyi eklemek için sorumu güncelledim. – mjandrews

+2

Dataframe dönüşümüyle benzer sorunlar yaşadım ancak rpy2 olmayan işlevleri kullanmam gerekiyordu. “Pandas2ri.py2ri (dataframe)' – shibumi

cevap

12

R almak ve size ise Python/rpy2 bir veri çerçevesini oluşturmak için Python anlamda özdeş değildir

Aksi R. (veri çerçevesi olmadan) vektörleri kullanarak, rpy2 dönüşüm nakliye burada çalışan gibi görünmektedir:

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

sonucu:

>>> 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

Nice ”i çağırmadan önce' pandas2ri.activate() 'i çalıştırmanız gerekir. Teşekkür ederim. İlk denememin muhtemelen aşırı karmaşık şeyler olduğunu biliyordum. – mjandrews

+0

@l Unutbu'nun cevabı gerçekten çok belirgindir çünkü DF'yi R isim alanına atamaya ya da as_semeliğini kullanmaya gerek yoktur. DF pandas'ının direk olarak r fonksiyonuna geçişi, teyitsizin örnek destekli sözdizimi gibi mi, yoksa kullanımdan kaldırılacak mı? Dokümantasyonda yaptığım görüşmelerde, na cevap vermemiştir. – KGS

+0

@KGS: Cevabım, veri çerçevelerinin dönüşümünün çalışmadığı iddiasını geçersiz kılmaya odaklandı. Bunu yapmak için, söz konusu kodu mümkün olduğunca değişmeden [email protected]'nun cevabının yakında herhangi bir zamanda geçersiz olduğunu görmüyorum: R'nin istatistikleri: lm' her zaman bir "data" parametresini kabul etti ve bunun kolay bir şekilde değişeceğini sanmıyorum. – lgautier

19

pandas2ri.activate() numaralı telefonu aradıktan sonra, Panda nesnelerinden R nesnelerine bazı dönüşümler otomatik olarak gerçekleşir. Örneğin,

M = R.lm('y~x', data=df) 

yerine

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

Ben özel elemanlarının nasıl alınacağını özetleyerek unutbu's answer ekleyebileceğiniz verir kullanabilirsiniz katsayıları tablosu includin g, kritik olarak, p -values.

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) 

Biz normal şekilde erişebileceği bir DataFrame bize bırakıyor:

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 
İlgili konular