Pregunta

Estoy usando el siguiente código para extraer el loadings matriz:

from rpy2.robjects import r, numpy2ri
numpy2ri.activate()
import numpy as np

A = np.random.rand(50,10)
fit = r.factanal(A, 5, rotation='promax')
load = r.loadings(fit)

¡Lo cual funciona!

Pero si trato de hacer lo mismo correlation

from rpy2.robjects import r, numpy2ri
numpy2ri.activate()
import numpy as np

A = np.random.rand(50,10)
fit = r.factanal(A, 5, rotation='promax')
corr = r.correlation(fit)

Yo obtengo: AttributeError: 'R' object has no attribute 'correlation'

Si, en cambio, intento:

from rpy2.robjects import r, numpy2ri
numpy2ri.activate()
import numpy as np

A = np.random.rand(50,10)
fit = r.factanal(A, 5, rotation='promax')
corr = fit.rx2('correlation')

Yo obtengo: ValueError: All parameters must be of type Sexp_Type,or Python int/long, float, bool, or None

Esto me parece extraño, especialmente porque tanto la correlación como las cargas deberían ser válidas.

print fit.names

me da:

['converged' 'loadings' 'uniquenesses' 'correlation' 'criteria' 'factors'
 'dof' 'method' 'rotmat' 'STATISTIC' 'PVAL' 'n.obs' 'call']
¿Fue útil?

Solución

El problema es numpy2ri.

Por lo que puedo decir, hay dos posibles soluciones.En primer lugar, omita los rpy .rx2 funcionar y usar R's raw [[, No sé cuáles son las implicaciones de esto, ya que no sé qué están haciendo todas las demás cosas en robjects.vectors.rx2, pero funciona aquí:

In [1]: from rpy2.robjects import r, numpy2ri    
In [2]: numpy2ri.activate()    
In [3]: import numpy as np   
In [4]: A = np.random.rand(50,10)   
In [5]: fit = r.factanal(A, 5, rotation='promax')  
In [6]: corr = fit.rx2('correlation')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-cf8a3601ab8e> in <module>()
----> 1 corr = fit.rx2('correlation')

/ifs/apps/apps/python-2.7.1/lib/python2.7/site-packages/rpy2/robjects/vectors.pyc in __call__(self, *args, **kwargs)
     69         fun = self._extractfunction
     70         conv_args.insert(0, self._parent)
---> 71         res = fun(*conv_args, **kwargs)
     72         res = conversion.py2ro(res)
     73         return res

ValueError: All parameters must be of type Sexp_Type,or Python int/long, float, bool, or None

In [7]: r["[["](fit,'correlation')
Out[7]: 
array([[  1.00000000e+00,   1.13009428e-01,  -1.68749351e-01,
          1.85869656e-01,   2.62402778e-01,   5.11846775e-02,
          1.96957316e-01,   9.83478574e-02,   2.10043867e-02,
          1.34883265e-01],
       ...

La segunda alternativa es desactivar numpy2ri, siempre puedes reactivarlo nuevamente después:

In [8]: numpy2ri.deactivate()    
In [9]: corr = fit.rx2('correlation')     
In [10]: print corr
             [,1]          [,2]         [,3]        [,4]        [,5]
 [1,]  1.00000000  0.1130094277 -0.168749351  0.18586966  0.26240278
 [2,]  0.11300943  1.0000000000 -0.116878885  0.12378751 -0.05303278
 [3,] -0.16874935 -0.1168788854  1.000000000 -0.26323867 -0.17794088
 [4,]  0.18586966  0.1237875121 -0.263238668  1.00000000  0.03955314
 [5,]  0.26240278 -0.0530327762 -0.177940878  0.03955314  1.00000000
 [6,]  0.05118468 -0.0007762935  0.227475607 -0.11270587 -0.10768763
 [7,]  0.19695732 -0.0423807326  0.036117785 -0.03174723 -0.11218540
 [8,]  0.09834786  0.1055451947  0.221756056  0.01828542 -0.41956986
 [9,]  0.02100439 -0.2173312335 -0.064198166 -0.06230902 -0.05976113
[10,]  0.13488326  0.0810527379  0.005651769 -0.10353872 -0.11954671
...

Otros consejos

He reproducido su error con rpy2 versión 2.4.2.Parece rpy2 tiene algunos problemas con la indexación de cadenas.

r.correlation(fit) No me funciona porque no existe tal función. correlation en mi R por defecto.Pero hay loadings, entonces r.loadings(fit) funciona bien.

Este código me dio una matriz de correlación:

fit = r.factanal(A, 5, rotation='promax')
corr = fit[3]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top