es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prueba de Kruskal-Wallis para comparación múltiple utilizando Python.

Estoy planeando realizar la prueba de Kruskal-Wallis para varias variables entre grupos (por ejemplo, diferencias de enfermedad en out1, out2 y out3 a nivel ordinal) y obtener las variables ordenadas [por ejemplo, out2, out3, out1] basadas en los resultados decrecientes de la prueba KW. Sin embargo, obtengo el mensaje de error: “ValueError: Si se utilizan todos los valores escalares, debes pasar un índice”. ¿Cómo puedo solucionarlo?

from scipy import stats
import pandas as pd
import numpy as np

datos = pd.DataFrame({ 'ID': list(range(1,21)), 
                  'Enfermedad': ["Cáncer","Saludable","Adenoma","Cáncer","Cáncer","Saludable","Cáncer","Saludable","Cáncer","Cáncer","Adenoma","Cáncer","Saludable","Cáncer","Saludable","Saludable","Saludable","Inflamación","Saludable","Inflamación"],
                   'Out1': np.random.randn(20),
                  'Out2': np.random.randn(20),
                  'Out3': np.random.randn(20)})

def prueba_KW(y, x):
  y = np.array(y)
  etiqueta, idx = np.unique(list(x), return_inverse=True)
  grupos = [y[idx == i] for i, l in enumerate(etiqueta)]
  H, p = stats.kruskal(*grupos)
  return H

resultados=[]
variables= list(datos.columns)[2:]
for i in variables: 
   y=datos[i]
   x=datos.iloc[:, 1]
   resultados=prueba_KW(y,x)
   resultados=pd.DataFrame({'variables': i, 'prueba_KW': resultados}, columns=['variables', 'prueba_KW']) 
   resultados.append(resultados)
   # ordenar los resultados de manera decreciente utilizando los resultados de prueba_KW
   resultados=resultados.sort_values(["prueba_KW"], ascending=False)
   # devolver las variables ordenadas 
   print(resultados[variables]) 
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “ValueError: If using all scalar values, you must pass an index” es probablemente causado por la línea “results=pd.DataFrame({‘outcomes’: i, ‘KW_test’: KW_test}, columns=[‘outcomes’, ‘KW_test’])”. En esta línea, la variable ‘i’ es un valor escalar (el nombre de la variable de resultado), pero el DataFrame de pandas espera una lista de valores para cada columna. Para solucionarlo, puedes cambiar la línea a:

    results = results.append({'outcomes': i, 'KW_test': KW_test}, ignore_index=True)
    

    Esto crea una nueva fila en el DataFrame usando el método append, con los valores de ‘i’ y ‘KW_test’. La opción ignore_index=True le indica a pandas que asigne automáticamente un nuevo índice a la fila.

    Además, en la línea “results=results.sort_value([“KW_test”], ascending=False)”, debería ser “sort_values” en lugar de “sort_value”, ya que este último es el nombre del método correcto.

    Finalmente, al imprimir los resultados ordenados, debería ser “print(results[‘outcomes’])” en lugar de “print(results[outcomes])”. Este último intentaría imprimir una columna con el nombre almacenado en la variable ‘outcomes’, que no existe.

Comments are closed.