Buscar..


Los fundamentos de la fórmula.

Las funciones estadísticas en R hacen un uso intensivo de la llamada notación de fórmula de Wilkinson-Rogers 1 .

Cuando se ejecutan funciones de modelo como lm para las regresiones lineales , necesitan una formula . Esta formula especifica qué coeficientes de regresión serán estimados.

my_formula1 <- formula(mpg ~ wt)
class(my_formula1) 
# gives "formula"

mod1 <- lm(my_formula1, data = mtcars)
coef(mod1)
# gives (Intercept)          wt 
#         37.285126   -5.344472 

En el lado izquierdo de ~ (LHS) se especifica la variable dependiente, mientras que el lado derecho (RHS) contiene las variables independientes. Técnicamente, la llamada a la formula anterior es redundante porque el operador tilde es una función de infijo que devuelve un objeto con clase de fórmula:

form <- mpg ~ wt
class(form)
#[1] "formula"

La ventaja de la función de formula sobre ~ es que también permite que se especifique un entorno para la evaluación:

form_mt <- formula(mpg ~ wt, env = mtcars)

En este caso, la salida muestra que se estima un coeficiente de regresión para wt , así como (por defecto) un parámetro de intercepción. La intersección puede ser excluida / forzada a ser 0 al incluir 0 o -1 en la formula :

coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))

Las interacciones entre las variables a y b pueden agregar al incluir a:b en la formula :

 coef(lm(mpg ~ wt:vs, data = mtcars))

Como es (desde un punto de vista estadístico) generalmente recomendable no tener interacciones en el modelo sin los efectos principales, el enfoque ingenuo sería expandir la formula a a + b + a:b . Esto funciona, pero se puede simplificar escribiendo a*b , donde el operador * indica el cruce de factor (cuando está entre dos columnas de factor) o la multiplicación cuando una o ambas columnas son 'numéricas':

coef(lm(mpg ~ wt*vs, data = mtcars))

El uso de la notación * expande un término para incluir todos los efectos de orden inferior, de manera que:

coef(lm(mpg ~ wt*vs*hp, data = mtcars))

Dará, además de la interceptación, 7 coeficientes de regresión. Uno para la interacción de tres vías, tres para las interacciones de dos vías y tres para los efectos principales.

Si uno quiere, por ejemplo, excluir la interacción de tres vías, pero retener todas las interacciones de dos vías, hay dos métodos abreviados. Primero, usando - podemos restar cualquier término en particular:

coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))

O, podemos usar la notación ^ para especificar qué nivel de interacción requerimos:

coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))

Esas dos especificaciones de la fórmula deberían crear la misma matriz modelo.

Por último, . Es una abreviatura utilizar todas las variables disponibles como efectos principales. En este caso, el argumento de data se utiliza para obtener las variables disponibles (que no están en el LHS). Por lo tanto:

coef(lm(mpg ~ ., data = mtcars))

Da los coeficientes para el intercepto y 10 variables independientes. Esta notación se usa con frecuencia en paquetes de aprendizaje automático, en los que uno quisiera usar todas las variables para la predicción o clasificación. Tenga en cuenta que el significado de . depende del contexto (ver, por ejemplo ?update.formula para un significado diferente).

  1. GN Wilkinson y CE Rogers. Revista de la Real Sociedad de Estadística. Serie C (Estadística Aplicada) vol. 22, No. 3 (1973), pp. 392-399

Crear términos de interacción lineal, cuadrática y de segundo orden

y ~ . : Aquí . se interpreta como todas las variables excepto y en el marco de datos utilizado para ajustar el modelo. Es equivalente a las combinaciones lineales de variables predictoras. Por ejemplo y ~ var1 + var2 + var3+...+var15

y ~ . ^ 2 proporcionará todos los términos de interacción lineal (efectos principales) y de segundo orden de las variables en el marco de datos. Es equivalente a y ~ var1 + var2 + ...+var15 + var1:var2 + var1:var3 + var1:var4...and so on

y ~ var1 + var2 + ...+var15 + I(var1^2) + I(var2^2) + I(var3^2)...+I(var15^2) : Aquí I(var^2) indica polinomio cuadrático de una variable en el marco de datos.

y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)

o

y ~ poly(var1, var2, var3, ....var15, degree = 2) será equivalente a la expresión anterior.

poly(var1, degree = 2) es equivalente a var1 + I(var1^2) .

Para obtener polinomios cúbicos, use degree = 3 en poly() .

Hay una advertencia en el uso de poly frente a I(var, 2) , que es después de ajustar el modelo, cada uno de ellos producirá diferentes coeficientes, pero los valores ajustados son equivalentes, ya que representan diferentes parametrizaciones del mismo modelo. Se recomienda usar I(var, 2) sobre poly() para evitar el efecto de resumen visto en poly() .

En resumen, para obtener términos de interacción lineal, cuadrática y de segundo orden, tendrá una expresión como

y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)

Demo para cuatro variables:

old <- reformulate( 'y ~ x1+x2+x3+x4' )
new <- reformulate( " y ~ .^2 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) ")
tmp <- .Call(stats:::C_updateform, old, new)
terms.formula(tmp, simplify = TRUE )

# ~y ~ x1 + x2 + x3 + x4 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) + 
#   x1:x2 + x1:x3 + x1:x4 + x2:x3 + x2:x4 + x3:x4
# attr(,"variables")
# list(~y, x1, x2, x3, x4, I(x1^2), I(x2^2), I(x3^2), I(x4^2))
# attr(,"factors")
#         x1 x2 x3 x4 I(x1^2) I(x2^2) I(x3^2) I(x4^2) x1:x2 x1:x3 x1:x4 x2:x3 x2:x4 x3:x4
# ~y       0  0  0  0       0       0       0       0     0     0     0     0     0     0
# x1       1  0  0  0       0       0       0       0     1     1     1     0     0     0
# x2       0  1  0  0       0       0       0       0     1     0     0     1     1     0
# x3       0  0  1  0       0       0       0       0     0     1     0     1     0     1
# x4       0  0  0  1       0       0       0       0     0     0     1     0     1     1
# I(x1^2)  0  0  0  0       1       0       0       0     0     0     0     0     0     0
# I(x2^2)  0  0  0  0       0       1       0       0     0     0     0     0     0     0
# I(x3^2)  0  0  0  0       0       0       1       0     0     0     0     0     0     0
# I(x4^2)  0  0  0  0       0       0       0       1     0     0     0     0     0     0
# attr(,"term.labels")
# [1] "x1"      "x2"      "x3"      "x4"      "I(x1^2)" "I(x2^2)" "I(x3^2)" "I(x4^2)"
# [9] "x1:x2"   "x1:x3"   "x1:x4"   "x2:x3"   "x2:x4"   "x3:x4"  
# attr(,"order")
# [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2
# attr(,"intercept")
# [1] 1
# attr(,"response")
# [1] 1
# attr(,".Environment")
# <environment: R_GlobalEnv>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow