En Stata 11, la función rowmedian le permite calcular las medianas de las filas directamente con egen.
¿Cómo calcular las medianas de las filas?
Título | Calcular las medianas de las filas | |
Autor | Nicholas J. Cox, Durham University |
Calcular las medianas en un software estadístico como Stata debería ser fácil, y normalmente lo es. Cuando se quiere una mediana de fila -una mediana dentro de las observaciones a través de varias variables del mismo tipo- parece más complicado.
Merece la pena discutir este problema, no sólo porque surge en la práctica. También proporciona un pequeño ejemplo de varias partes de Stata en juego.
Para recapitular lo básico: si usted quiere una mediana de una variable, podría ordenar en esa variable y escoger la mediana usted mismo. Es necesario tener algo de cuidado cuando se está interesado en sólo algunas de las observaciones o hay valores perdidos. Por lo general, los usuarios disparan resumir, detallar, que se encarga de todos estos asuntos, e identifica la mediana dentro de los resultados. A continuación, se deja en la memoria inmediatamente como r(p50).
Si en su lugar desea poner la mediana en una variable, puede utilizar egen, median(). Esto tiene más sentido cuando sus datos están subdivididos en grupos y quiere que la mediana de cada grupo se registre para su uso posterior. Por lo tanto, utilizaría egen, median() junto con by:.
Cuando tiene un grupo de variables del mismo tipo, a veces hay una respuesta fácil. Si esas variables son realmente datos de panel o longitudinales, debería remodelar a largo y trabajar con una estructura de datos diferente. La vida será mucho más fácil de esa manera, no sólo para las medianas de fila, que ahora son sólo medianas de panel, sino también para casi todos los tipos de análisis que usted podría querer hacer con esos datos.
Si sabe que los valores de sus variables de fila están en orden numérico, de modo que, por ejemplo, y1 es siempre menor o igual que y2, que a su vez es menor o igual que y3, y así sucesivamente, entonces la mediana se puede calcular directamente como una de las variables o la media de dos de las variables, dependiendo de si el número de variables es par o impar. Pero esto se vería afectado por cualquier valor faltante.
Usted puede llegar a esa situación de variables de fila en orden numérico mediante el uso de rowsort de SSC (requiere Stata 8; funciona sólo con valores enteros) o sortrows de SSC (requiere Stata 9).
Luego vienen las situaciones en las que tiene pocas variables (dos, tres o cuatro) sobre las que desea tomar la mediana de la fila-y de nuevo no hay valores faltantes. La mediana de dos variables es la misma que su media, así que el primer caso es fácil:
. gen median = (y1 + y2) / 2
Un truco menos conocido para tres variables también simplifica la resolución del problema:
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
En palabras: calcula la suma de las filas; luego resta el mínimo y el máximo. Lo que queda debe ser la mediana.
Ahora un truco para cuatro variables es inmediato:
. gen median = (y1 + y2 + y3 + y4 - /// min(y1, y2, y3, y4) - max(y1, y2, y3, y4)) / 2
En palabras: calcula la suma de las filas; luego resta el mínimo y el máximo. Lo que queda es la suma de los dos valores interiores, y si se divide por la mitad se obtiene la mediana.
Los trucos sencillos para cinco o más variables, en general, no son evidentes.
Un poco de reflexión muestra que los empates no suponen ningún problema para ninguno de estos trucos. La suposición más incómoda es que no faltan valores. Hay algunas posibilidades de salvar los problemas con los valores que faltan. Se puede calcular el número de valores perdidos a partir de
. egen nmissing = rowmiss(varlist)
pero para unas pocas variables, contar las variables perdidas sobre la marcha es igual de fácil.
Con cualquier variable perdida, la mediana de dos puede salvarse mediante
. gen median = (y1 + y2) / 2 . replace median = max(y1, y2) if median == .
Esta secuencia de comandos explota el hecho de que max(y1, y2) es no perdido siempre que uno de los valores lo sea. Si ambos valores faltan, no perdemos realmente, ya que algunas faltas simplemente se sobrescriben con otras. Podrías escribir min(y1, y2) si eso te hiciera sentir más cómodo. (¿Por qué el resultado es el mismo?)
Del mismo modo, se puede salvar la mediana de tres.
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
Si faltan y1, y2 e y3, ya tienes la única respuesta posible: falta. Las situaciones que hay que arreglar son que falte una sola variable y que falten dos variables en cada observación.
. replace median = max(y1, y2, y3) if (missing(y1) + missing(y2) + missing(y3)) == 2
Si faltan dos variables, entonces podemos obtener la otra a partir de max() y es automáticamente la mediana.
. replace median = ( /// cond(missing(y1), 0, y1) + /// cond(missing(y2), 0, y2) + /// cond(missing(y3), 0, y3) ) / 2 /// if (missing(y1) + missing(y2) + missing(y3)) == 1
Si falta una variable, entonces la media de las otras dos da la mediana. Nos aseguramos de que las pérdidas se ignoran en la suma utilizando 0 en su lugar. Si supiéramos que todas las variables deben ser positivas (o cero), entonces se podrían utilizar términos como max(y1, 0) en lugar de términos como cond(missing(y1), 0, y1), y si supiéramos que todas las variables deben ser negativas (o cero), podríamos utilizar min(y1, 0) en su lugar. Además, se podría hacer lo mismo con egen:
. egen rowsum = rowsum(y1 y2 y3). replace median = rowsum / 2 ///if (missing(y1) + missing(y2) + missing(y3)) == 1
Manifestamente, aunque el código hasta ahora tiene cierto valor de curiosidad al mostrar que no siempre es necesario ordenar para obtener las medianas de las filas, realmente necesitamos un programa que incorpore un enfoque más sistemático.
Sin embargo, no existe una función oficial de egen para las medianas de las filas. Si se buscan las funciones aportadas por la comunidad y se miran con atención, se puede empezar a ver por qué. En esencia, dos enfoques eran posibles antes de Stata 9.
El primero, implementado en egen, rmed() de STB-57 (se requiere Stata 5), es hacer un bucle sobre las observaciones, copiar los valores en una variable y luego obtener la mediana. Desafortunadamente, este enfoque asume que el número de variables en cuestión no es mayor que el número de observaciones. Esto suele ser cierto, pero no necesariamente. El segundo, implementado en egen, rmedf() de SSC (se requiere Stata 6), es reestructurar el conjunto de datos sobre la marcha, calcular las medianas, y luego reestructurar de nuevo. Discutiblemente, la reestructuración de un conjunto de datos no es algo que deba hacerse en medio de una función egen, pero en cualquier caso este enfoque podría fallar fácilmente si no se dispone de suficiente memoria.
Con Stata 9, sin embargo, llega una oportunidad más positiva: utilizar Mata. El paquete egenmore en SSC incluye egen, rowmedian(). Es mucho más rápida que las funciones egen anteriores -aunque el bucle básico sigue siendo un bucle sobre las observaciones- y requiere poca memoria adicional. Este es el código:
program _growmedian version 9 gettoken type 0 : 0 gettoken h 0 : 0 gettoken eqs 0 : 0 syntax varlist(numeric) if `"`by'"' != "" { _egennoby rowmedian() `"`by'"' /* NOTREACHED */ } marksample touse, novarlist quietly { mata : row_median("`varlist'", "`touse'", "`h'", "`type'") } end mata : void row_median(string scalar varnames, string scalar tousename, string scalar medianname, string scalar type) { real matrix y real colvector median, row real scalar n st_view(y, ., tokens(varnames), tousename) median = J(rows(y), 1, .) for(i = 1; i