Tengo un dataframe en pandas que estoy usando para producir un diagrama de dispersión, y desea incluir una línea de regresión para la trama. Ahora mismo estoy tratando de hacer esto con polyfit.

Aquí está mi código:

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from numpy import *

table1 = pd.DataFrame.from_csv('upregulated_genes.txt', sep='\t', header=0, index_col=0)
table2 = pd.DataFrame.from_csv('misson_genes.txt', sep='\t', header=0, index_col=0)
table1 = table1.join(table2, how='outer')

table1 = table1.dropna(how='any')
table1 = table1.replace('#DIV/0!', 0)

# scatterplot
plt.scatter(table1['log2 fold change misson'], table1['log2 fold change'])
plt.ylabel('log2 expression fold change')
plt.xlabel('log2 expression fold change Misson et al. 2005')
plt.title('Root Early Upregulated Genes')
plt.axis([0,12,-5,12])

# this is the part I'm unsure about
regres = polyfit(table1['log2 fold change misson'], table1['log2 fold change'], 1)

plt.show()

Pero me sale el siguiente error:

TypeError: cannot concatenate 'str' and 'float' objects

¿Alguien sabe donde estoy pasando mal aquí? También estoy seguro de cómo agregar la línea de regresión a mi parcela. Cualquier otro tipo de comentarios en mi código también sería enormemente apreciados, todavía soy un principiante.

en la línea de lo que obtengo el error?
regres = polyfit(table1['log2 fold change misson'], table1['log2 fold change'], 1)
asegurarse de que no hay valores NaN en las mesas? porque pylab.esparcir simplemente no la trama de la x,y puntos en los que x o y son NaN (es decir, que no da errores), pero tal vez polyfit no saben que? (sólo adivinar en donde el problema puede estar aquí – cómo no-un-número de valores almacenados en el archivo csv -?)
Nope, no hay valores NaN. No sólo es un número, los valores fueron ‘#DIV/0!’, que me quitaron
¿cuál es el tipo de tabla1[‘log 2 veces el cambio misson’] y tabla1[‘log 2 veces el cambio’] ? (como yo sé que debe ser numpy.matriz con flotador como dtype (y ambas deben tener la misma forma))

OriginalEl autor TimStuart | 2013-10-15

1 Comentario

  1. 23

    Lugar de reemplazar ‘#DIV/0!’ con la mano, la fuerza de los datos numéricos. Esto hace dos cosas a la vez: se asegura de que el resultado es de tipo numérico (no str), y sustituye NaN para todas las entradas que no puede ser analizado como un número. Ejemplo:

    In [5]: Series([1, 2, 'blah', '#DIV/0!']).convert_objects(convert_numeric=True)
    Out[5]: 
    0     1
    1     2
    2   NaN
    3   NaN
    dtype: float64

    Esto debería solucionar el error. Pero, en el tema general de ajuste de una recta a los datos, puedo tener a la mano dos maneras de hacer esto que me gusta mejor que polyfit. El segundo de los dos es más eficaz (y, potencialmente, puede volver una información mucho más detallada acerca de las estadísticas), pero requiere de statsmodels.

    from scipy.stats import linregress
    def fit_line1(x, y):
        """Return slope, intercept of best fit line."""
        # Remove entries where either x or y is NaN.
        clean_data = pd.concat([x, y], 1).dropna(0) # row-wise
        (_, x), (_, y) = clean_data.iteritems()
        slope, intercept, r, p, stderr = linregress(x, y)
        return slope, intercept # could also return stderr
    
    import statsmodels.api as sm
    def fit_line2(x, y):
        """Return slope, intercept of best fit line."""
        X = sm.add_constant(x)
        model = sm.OLS(y, X, missing='drop') # ignores entires where x or y is NaN
        fit = model.fit()
        return fit.params[1], fit.params[0] # could also return stderr in each via fit.bse

    A la trama, hacer algo como

    m, b = fit_line2(x, y)
    N = 100 # could be just 2 if you are only drawing a straight line...
    points = np.linspace(x.min(), x.max(), N)
    plt.plot(points, m*points + b)
    Gracias! Obligando a los datos numéricos se ha corregido el error que me estaba haciendo, pero me estoy poniendo NaN salida de polyfit y el código sugerido… Alguna idea de por qué podría ser esto?
    Algunos Nan, o todos los Nan? Puede reproducir el problema con un pequeño subconjunto de los datos, y compartir aquí?
    Lastima que fue solo un error por mí, ahora funciona. ¿Sabes cómo me gustaría añadir esto como una línea a mi diagrama de dispersión?
    Ver la parte de abajo de mi respuesta. Si no aparece en la misma parcela, trate de añadir la palabra clave argumento ax=plt.gca() en plot.
    No hay problema! Por favor, considere la posibilidad de marcar mi respuesta aceptada.

    OriginalEl autor Dan Allan

Dejar respuesta

Please enter your comment!
Please enter your name here