respuesta actualizada
Como utilizar una lista (return [.0001 if x==0 else x for x in a]
) y una función logit (gracias whuber, me había olvidado por completo esta función en mi primera respuesta: los valores reales estrictamente entre 0 y 1.):
en Matlab/Octave:
p=[1,1,0.5,0.6,0,0.4,1];
p(p==0) = 0.001 ; p(p == 1) = 0.999;
disp(p)
0.9990 0.9990 0.5000 0.6000 0.0010 0.4000 0.9990
tVar = .5*log(p ./ (1 - p));
disp(tvar)
3.4534 3.4534 0 0.2027 -3.4534 -0.2027 3.4534
En Python:
from math import log #natural logarithm
p=[1,1,0.5,0.6,0,0.4,1]
# with conditional list comprehension
p =[(0.001 if x==0 else (0.999 if x==1 else x)) for x in p]
print p
[0.999, 0.999, 0.5, 0.6, 0.001, 0.4, 0.999]
tVar = [.5*log(x/(1-x)) for x in p]
print tVar
[3.4533773893242765, 3.4533773893242765, 0.0, 0.2027325540540821, -3.453377389324277, -0.20273255405408214, 3.4533773893242765]
Por lo tanto, podemos escribir la función (como una lista):
def iLogit(a):
replace = [(0.001 if x==0 else (0.9999 if x==1 else x)) for x in a]
return [.5*log(x/(1-x)) for x in replace]
( Respuesta Original con errores en los valores para la transformación logit )
en Matlab:
p=[1,2,0,1,0,2,1,1];
p(p==0) = 0.001 ; p(p == 1) = 0.999;
disp(p):
0.9990000 2.0000000 0.0010000 0.9990000 0.0010000 2.0000000 0.9990000 0.9990000
tVar = .5*log(p ./ (1 - p));
disp(tvar)
3.45338 + 0.00000i 0.34657 + 1.57080i -3.45338 + 0.00000i 3.45338 + 0.00000i -3.45338 + 0.00000i 0.34657 + 1.57080i 3.45338 + 0.00000i 3.45338 + 0.00000i
En Python:
from math import log #natural logarithm
p=[1,2,0,1,0,2,1,1]
# with conditional list comprehension
p =[(0.001 if x==0 else (0.999 if x==1 else x)) for x in p]
print p
[0.999, 2, 0.001, 0.999, 0.001, 2, 0.999, 0.999]
tVar = [.5*log(x/(1-x)) for x in p]
Así que, en teoría:
def iLogit(a):
replace = [(0.001 if x==0 else (0.9999 if x==1 else x)) for x in a]
return [.5*log(x/(1-x)) for x in replace]
¿Por qué en la teoría ? Debido a que el logaritmo de números negativos: sólo se puede calcular el logaritmo de un número positivo en Python solo.
x = 3
print .5*log(x/(1-x)) # or print .5*log(3/(1-3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
# with numpy
print .5*numpy.log(x/(1-x))
Warning: invalid value encountered in log
nan
Si desea que el mismo resultado como Matlab (número complejo), debe utilizar el cmath módulo
import cmath
x = 0.999
print .5*(cmath.log(x/(1-x)))
(3.45337738932+0j)
No olvides el problema de Aritmética de Punto flotante: Lo que Todo Científico de la computación Debe Saber Acerca de la Aritmética de Punto Flotante y Aritmética de Punto Flotante: Problemas y Limitaciones en Python.)