¿Es posible en R (o en general) forzar que los coeficientes de regresión sean un signo determinado?

10

Estoy trabajando con algunos datos del mundo real y los modelos de regresión están dando algunos resultados contraintuitivos. Normalmente confío en las estadísticas, pero en realidad algunas de estas cosas no pueden ser ciertas. El principal problema que estoy viendo es que un aumento en una variable está causando un aumento en la respuesta cuando, de hecho, en realidad, deben correlacionarse negativamente.

¿Hay alguna manera de forzar un signo específico para cada uno de los coeficientes de regresión? Cualquier código R para hacer esto también sería apreciado.

¡Gracias por cualquier y toda la ayuda!

JRW
fuente
99
Ver stat.columbia.edu/~gelman/stuff_for_blog/… .
Dimitriy V. Masterov
1
Podría estar relacionado aquí
Este enlace r-bloggers.com/positive-coefficient-regression-in-r creo que responde a la pregunta de @ JRW sobre los valores de R cuadrado. Como ya se comentó, se debe tener cuidado antes de forzar valores de coeficientes positivos.
Esme_

Respuestas:

11
  1. tenga cuidado con la distinción entre la correlación marginal y la correlación parcial (correlación condicional en otras variables). Pueden ser legítimamente de diferente signo.

    Es decir, de hecho puede ser negativo, mientras que el coeficiente de regresión en una regresión múltiple es positivo. No hay necesariamente ninguna contradicción en esas dos cosas. Ver también la paradoja de Simpson , que está algo relacionada (especialmente el diagrama). En general, no se puede inferir que un coeficiente de regresión debe ser de un signo simplemente basado en un argumento sobre la correlación marginal.corr(Y,Xi)

  2. Sí, ciertamente es posible restringir los coeficientes de regresión a o *. Hay varias formas de hacerlo; algunos de estos se pueden hacer con bastante facilidad en R, como a través de . Consulte también las respuestas a esta pregunta que mencionan varios paquetes R y otros enfoques posibles.000nnls

    Sin embargo, le advierto que no ignore apresuradamente los puntos en 1. solo porque muchos de ellos se implementan fácilmente.

    * (puede usar programas que no sean negativos para hacer no positivos al negar la variable correspondiente)

Glen_b -Reinstate a Monica
fuente
10

Muy bien puede haber una manera tal, pero yo diría que es no aconsejable en sus circunstancias.

Si tiene un resultado que es imposible:

1) Hay un problema con sus datos 2) Hay un problema con su definición de "imposible" o 3) Está utilizando el método incorrecto

Primero, verifique los datos. En segundo lugar, verifique el código. (O pídale a otros que lo revisen). Si ambos están bien, entonces tal vez esté sucediendo algo inesperado.

Afortunadamente para usted, tiene una simple "imposibilidad": dice que dos variables no pueden correlacionarse positivamente. Entonces, haga un diagrama de dispersión y agregue un suavizador y vea. Un solo caso atípico podría causar esto; o podría ser una relación no lineal. O algo mas.

Pero, si tienes suerte, has encontrado algo nuevo. Como solía decir mi profesor favorito "Si no estás sorprendido, no has aprendido nada".

Peter Flom - Restablece a Monica
fuente
(+1 a Peter y Glen) @JRW - Si arreglas el letrero, me gustaría ser una mosca en la pared cuando trates de explicar a tu audiencia el coeficiente que "obtuviste" y su intervalo de confianza. Además, podrían preguntar legítimamente: ¿Arreglaste el signo y / o el rango de los demás? ¿Si no, porque no?
rolando2
6

Para responder a su pregunta específica, puede probar el paquete nnls que hace la regresión de mínimos cuadrados con restricciones no negativas en los coeficientes. Puede usarlo para obtener los signos que desea cambiando los signos de los predictores apropiados.

Por cierto, aquí hay una manera muy simple de crear un conjunto de datos para demostrar cómo es posible tener correlaciones positivas y coeficientes de regresión negativos.

> n <- rnorm(200)
> x <- rnorm(200)
> d <- data.frame(x1 = x+n, x2= 2*x+n, y=x)
> cor(d)
      x1        x2         y
 x1 1.0000000 0.9474537 0.7260542
 x2 0.9474537 1.0000000 0.9078732
 y  0.7260542 0.9078732 1.0000000
> plot(d)
> lm(y~x1+x2-1, d)

Call:
lm(formula = y ~ x1 + x2 - 1, data = d)

Coefficients:
x1  x2  
-1   1  
Innuo
fuente
Acabo de jugar un poco con este paquete nnls. ¿Hay alguna forma de obtener un valor R cuadrado ajustado (o algo equivalente), o tendría que intentar calcularlo yo mismo de alguna manera?
JRW