4 votos

Cómo encontrar / reemplazar un elemento en el campo con la Calculadora de campo

Solo quiero realizar la siguiente operación realizada en Matlab en la Calculadora de campo usando Python:

 p(p==0) = 0.001 ; p(p == 1) = 0.999; 
tVar = .5*log(p ./ (1 - p))
 

La operación consiste en una transformación Logit:

  1. Encuentra 0's y 1's y reemplaza con .001 y .999 respectivamente, y
  2. Realizar el segundo cálculo con logaritmos.

He intentado lo siguiente para 1) en Python sin éxito:

Código de Script Pre-Lógico:

 def iLogit(a):
  return [.0001 if x==0 else x for x in a]
 

¿Alguna ayuda por favor?

6voto

Aaron Puntos 25882

Usando un analizador de Python:

Código de Script Pre-Lógico:

 def switch(x):
    if x == 0:
        x = 0.001
    elif x == 1:
        x = 0.999
    tVar = 0.5 * math.log(x / (1 - x))
    return tVar
 

En el bloque de código:

y =

 switch(!x!)
 

introduzca la descripción de la imagen aquí

3voto

GreyCat Puntos 146

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

1voto

Nikola Puntos 21

Intenta con ...

Código de Script Pre-Lógico:

 def iLogit(x):
  if x==0:
    x=0.001
  elif x==1:
    x=0.999
  tVar=0.5*math.log(x/(1-x))
  return tVar
 

EDITAR (versión compacta):

 def iLogit(x):
    x = .001 if x==0 else .999 if x==1 else x
    return .5*math.log(x/(1-x))
 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X