Saltar al contenido principal

4.7: Factores

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\id}{\mathrm{id}}$$ $$\newcommand{\Span}{\mathrm{span}}$$

( \newcommand{\kernel}{\mathrm{null}\,}\) $$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$ $$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$ $$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\id}{\mathrm{id}}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\kernel}{\mathrm{null}\,}$$

$$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$

$$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$

$$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$ $$\newcommand{\AA}{\unicode[.8,0]{x212B}}$$

$$\newcommand{\vectorA}[1]{\vec{#1}} % arrow$$

$$\newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow$$

$$\newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vectorC}[1]{\textbf{#1}}$$

$$\newcommand{\vectorD}[1]{\overrightarrow{#1}}$$

$$\newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}}$$

$$\newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}}$$

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\avec}{\mathbf a}$$ $$\newcommand{\bvec}{\mathbf b}$$ $$\newcommand{\cvec}{\mathbf c}$$ $$\newcommand{\dvec}{\mathbf d}$$ $$\newcommand{\dtil}{\widetilde{\mathbf d}}$$ $$\newcommand{\evec}{\mathbf e}$$ $$\newcommand{\fvec}{\mathbf f}$$ $$\newcommand{\nvec}{\mathbf n}$$ $$\newcommand{\pvec}{\mathbf p}$$ $$\newcommand{\qvec}{\mathbf q}$$ $$\newcommand{\svec}{\mathbf s}$$ $$\newcommand{\tvec}{\mathbf t}$$ $$\newcommand{\uvec}{\mathbf u}$$ $$\newcommand{\vvec}{\mathbf v}$$ $$\newcommand{\wvec}{\mathbf w}$$ $$\newcommand{\xvec}{\mathbf x}$$ $$\newcommand{\yvec}{\mathbf y}$$ $$\newcommand{\zvec}{\mathbf z}$$ $$\newcommand{\rvec}{\mathbf r}$$ $$\newcommand{\mvec}{\mathbf m}$$ $$\newcommand{\zerovec}{\mathbf 0}$$ $$\newcommand{\onevec}{\mathbf 1}$$ $$\newcommand{\real}{\mathbb R}$$ $$\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}$$ $$\newcommand{\laspan}[1]{\text{Span}\{#1\}}$$ $$\newcommand{\bcal}{\cal B}$$ $$\newcommand{\ccal}{\cal C}$$ $$\newcommand{\scal}{\cal S}$$ $$\newcommand{\wcal}{\cal W}$$ $$\newcommand{\ecal}{\cal E}$$ $$\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}$$ $$\newcommand{\gray}[1]{\color{gray}{#1}}$$ $$\newcommand{\lgray}[1]{\color{lightgray}{#1}}$$ $$\newcommand{\rank}{\operatorname{rank}}$$ $$\newcommand{\row}{\text{Row}}$$ $$\newcommand{\col}{\text{Col}}$$ $$\renewcommand{\row}{\text{Row}}$$ $$\newcommand{\nul}{\text{Nul}}$$ $$\newcommand{\var}{\text{Var}}$$ $$\newcommand{\corr}{\text{corr}}$$ $$\newcommand{\len}[1]{\left|#1\right|}$$ $$\newcommand{\bbar}{\overline{\bvec}}$$ $$\newcommand{\bhat}{\widehat{\bvec}}$$ $$\newcommand{\bperp}{\bvec^\perp}$$ $$\newcommand{\xhat}{\widehat{\xvec}}$$ $$\newcommand{\vhat}{\widehat{\vvec}}$$ $$\newcommand{\uhat}{\widehat{\uvec}}$$ $$\newcommand{\what}{\widehat{\wvec}}$$ $$\newcommand{\Sighat}{\widehat{\Sigma}}$$ $$\newcommand{\lt}{<}$$ $$\newcommand{\gt}{>}$$ $$\newcommand{\amp}{&}$$ $$\definecolor{fillinmathshade}{gray}{0.9}$$

Bien, es momento de comenzar a introducir algunos de los tipos de datos que son algo más específicos de las estadísticas. Si recuerdas volver al Capítulo 2, cuando asignamos números a posibles resultados, estos números pueden significar cosas bastante diferentes dependiendo del tipo de variable que estemos intentando medir. En particular, comúnmente hacemos la distinción entre datos nominales, ordinales, de intervalos y de escala de relación. ¿Cómo capturamos esta distinción en R? Actualmente, solo parece que tenemos un único tipo de datos numéricos. Eso probablemente no va a ser suficiente, ¿verdad?

Un poco de pensamiento sugiere que la clase de variable numérica en R es perfectamente adecuada para capturar datos de escala de relación. Por ejemplo, si tuviera que medir el tiempo de respuesta (RT) para cinco eventos diferentes, podría almacenar los datos en R así:

RT <- c(342, 401, 590, 391, 554)

donde los datos aquí se miden en milisegundos, como es convencional en la literatura psicológica. Es perfectamente sensato hablar de “el doble del tiempo de respuesta”, 2×RT, o el “tiempo de respuesta más 1 segundo”, RT+1000, por lo que las dos siguientes son cosas perfectamente razonables para que R haga:

2 * RT

## [1]  684  802 1180  782 1108
RT + 1000

## [1] 1342 1401 1590 1391 1554

Y en menor medida, la clase “numérica” está bien para los datos de escala de intervalos, siempre y cuando recordemos que la multiplicación y la división no son terriblemente interesantes para este tipo de variables. Es decir, si mi puntaje de CI es 110 y el tuyo es 120, está perfectamente bien decir que eres 10 puntos de CI más inteligente que yo 58, pero no está bien decir que solo soy 92% tan inteligente como tú, porque la inteligencia no tiene un cero natural. 59 Incluso podríamos estar dispuestos a tolerar el uso de variables numéricas para representar variables de escala ordinal, como las que normalmente obtienes cuando le pides a la gente que clasifique los elementos de orden (por ejemplo, como lo hacemos en las elecciones australianas), aunque como veremos R en realidad tiene una herramienta incorporada para representar datos ordinales (ver Sección 7.11.2) Sin embargo, cuando se trata de datos de escala nominal, se vuelve completamente inaceptable, porque casi todas las reglas “habituales” de lo que se le permite hacer con los números no se aplican a los datos de escala nominal. Es por esta razón que R tiene factores.

Introduciendo factores

Supongamos que estaba haciendo un estudio en el que la gente pudiera pertenecer a una de las tres condiciones de tratamiento diferentes. A cada grupo de personas se les pidió que completaran la misma tarea, pero cada grupo recibió diferentes instrucciones. No en vano, podría querer tener una variable que haga un seguimiento de en qué grupo se encontraban las personas. Así que podría escribir algo como esto

group <- c(1,1,1,2,2,2,3,3,3)

para que ese grupo [i] contenga la pertenencia al grupo de la i-ésima persona en mi estudio. Claramente, se trata de datos numéricos, pero igualmente obviamente se trata de una variable de escala nominal. No tiene sentido en que “grupo 1” más “grupo 2” sea igual a “grupo 3”, pero sin embargo si trato de hacer eso, R no me detendrá porque no sabe nada mejor:

group + 2

## [1] 3 3 3 4 4 4 5 5 5

Al parecer R parece pensar que está permitido inventar “grupo 4” y “grupo 5”, aunque en realidad no existían. Desafortunadamente, R es demasiado estúpido para conocerlo mejor: piensa que 3 es un número ordinario en este contexto, por lo que no ve ningún problema en calcular 3 + 2. Pero como no somos tan estúpidos, nos gustaría evitar que R haga esto. Podemos hacerlo instruyendo a R para que trate al grupo como un factor. Esto es fácil de hacer usando la función.factor (). 60

group <- as.factor(group)
group

## [1] 1 1 1 2 2 2 3 3 3
## Levels: 1 2 3

Se ve más o menos igual que antes (aunque no es inmediatamente obvio de qué se trata toda esa basura de Niveles), pero si le pedimos a R que nos diga cuál es la clase de la variable de grupo ahora, está claro que ha hecho lo que pedimos:

class(group)

## [1] "factor"

Ordenado. Mejor aún, ahora que he convertido el grupo a un factor, mira lo que pasa cuando intento agregarle 2:

group + 2

## Warning in Ops.factor(group, 2): '+' not meaningful for factors
## [1] NA NA NA NA NA NA NA NA NA

Esta vez incluso R es lo suficientemente inteligente como para saber que estoy siendo un idiota, así que me regala y luego produce un vector de valores faltantes. (es decir, NA: ver Sección 4.6.1).

Etiquetado de los niveles de factores

Tengo que hacer una confesión. Mi memoria no es infinita en capacidad; y parece que va empeorando a medida que envejezco. Así que me molesta cuando consigo conjuntos de datos donde hay una variable de escala nominal llamada género, con dos niveles correspondientes a machos y hembras. Pero cuando voy a imprimir la variable me sale algo como esto:

gender
## [1] 1 1 1 1 1 2 2 2 2
## Levels: 1 2

Okaaaay. Eso no ayuda en absoluto, y me pone muy triste. ¿Qué número corresponde a los machos y cuál corresponde a las hembras? ¿No sería bueno que R pudiera hacer un seguimiento de esto? Es demasiado difícil recordar qué número corresponde a qué género. Y además, el problema que esto causa es mucho más grave que un solo nerd triste... porque R no tiene forma de saber que los 1 s en la variable de grupo son un tipo de cosas muy diferentes a las 1 s en la variable de género. Entonces, si trato de preguntar qué elementos de la variable de grupo son iguales a los elementos correspondientes en género, R piensa que esto es totalmente kosher, y me da esto:

group == gender
## Error in Ops.factor(group, gender): level sets of factors are different


Bueno, eso es... especialmente estúpido. 61 El problema aquí es que R tiene una mentalidad muy literal. Aunque hayas declarado que tanto el grupo como el género son factores, todavía asume que un 1 es un 1 sin importar en qué variable aparezca.

Para solucionar ambos problemas (mi problema de memoria y las exasperantes interpretaciones literales de R), lo que tenemos que hacer es asignar etiquetas significativas a los diferentes niveles de cada factor. Podemos hacer eso así:

levels(group) <- c("group 1", "group 2", "group 3")
print(group)
## [1] group 1 group 1 group 1 group 2 group 2 group 2 group 3 group 3 group 3
## Levels: group 1 group 2 group 3
levels(gender) <- c("male", "female")
print(gender)

## [1] male   male   male   male   male   female female female female
## Levels: male female

Eso es mucho más fácil a la vista, y mejor aún, R es lo suficientemente inteligente como para saber que “femenino” no es igual al “grupo 2", así que ahora cuando trato de preguntar qué membresías grupales son “iguales” al género de la persona correspondiente,

group == gender
## Error in Ops.factor(group, gender): level sets of factors are different

R correctamente me dice que soy un idiota.

Avanzando...

Los factores son cosas muy útiles, y los usaremos mucho en este libro: son la principal manera de representar una variable de escala nominal. Y hay muchas variables de escala nominal por ahí. Hablaré más de factores en 7.11.2, pero por ahora sabes lo suficiente como para poder empezar.

This page titled 4.7: Factores is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform.