9 votos

Modelo lineal con restricciones

Soy bastante nuevo en R y tengo un problema de seguimiento:

Tengo un simple modelo lineal de dos factores:

# factor1 has 8 categorical values, factor2 has 6 categories
Rate ~ factor1 + factor2 
model1 <- lm(Rate~factor1+factor2, data=myData)

Y quiero poner restricciones SUM de los coeficientes de factor1 = 0, lo mismo para el factor2.

Ninguno de los manuales da ninguna pista de cómo hacer esto.

Encontré un enlace a un problema similar aquí, pero es diferente y no pude averiguar cómo modificarlo...

3 votos

Por favor, no hacer crossposting simultáneamente aquí y en SO.

0 votos

Ciertamente, señor :)

22voto

Akira Puntos 1061

Aquí hay un truco. Para simplificar, supongamos que está tratando de construir un modelo de la forma $$y = b_1 x_1 + b_2 x_2 + b_3 x_3,$$ sujeto a $b_1 + b_2 + b_3 = 0$ . Simplemente reexpresar $b_3$ como $b_3 = - b_1 - b_2$ lo que significa que estás tratando de construir un modelo de la forma $$y = b_1 x_1 + b_2 x_2 - (b_1 + b_2) x_3 = b_1 (x_1 - x_3) + b_2 (x_2 - x_3).$$ Así que crea nuevas variables $\tilde{x}_1 = x_1 - x_3,$ y $\tilde{x}_2 = x_2 - x_3$ y realizar su regresión usando estas variables transformadas como las variables independientes.

Deberías ser capaz de aplicar este truco independientemente a las categorías de factor1 y factor2 . (He supuesto que los datos se dan como 0/1 indicadores de la pertenencia a las distintas categorías).

2 votos

Huh, los factores se manejan bien usando el factor por lo que no es necesario recurrir a la codificación ficticia (por lo demás, es accesible a través de model.matrix(lm(x~a*b)) para el ejemplo de mi juguete).

2 votos

@chl gracias. Sé muy poco de R, pero sospechaba que este simple truco algebraico podría aplicarse en cualquier caso, o al menos ilustrar lo que está pasando 'bajo el capó'

0 votos

Sí, definitivamente, esto era una precisión. (y tienes mi +1)

8voto

Omar Kooheji Puntos 384

En problemas como éste (en los que hay múltiples objetos en movimiento que empiezan en momentos diferentes), suelo empezar asignando una variable a la cantidad que la pregunta pide: $$\text{let }x=\text{the speed of the pedestrian}$$ y luego asignando una variable al tiempo transcurrido de un instante específico: $$\text{let }t=\text{time (in hours) since 5am}.$$

Con estas variables, trato de escribir expresiones para las posiciones de cada objeto en movimiento en términos de $x$ y $t$ y establecer las expresiones de posición iguales que corresponden a cuando los objetos están en el mismo lugar.

Si esto no es suficiente para desatascarte, por favor comenta esta respuesta y hazme saber lo que has hecho hasta ahora usando estas ideas.

0 votos

Gracias. Sí funcionó, pregunta: no forzó la condición de que los coeficientes sumen 0, sino que minimizó las sumas para ambos factores. ¿Hay alguna forma de forzar la condición ==0, o simplemente no lo hace porque afectaría al error?

1 votos

@Vytautas: Creo que te olvidas del nivel de referencia de tu factor que no se muestra (ya que es la línea base de los demás).

1 votos

@Vytautas o echa un vistazo a Interpretación de las columnas de la matriz del modelo cuando se utiliza contr.sum , j.mp/9pNFQe .

4voto

Joe W. Puntos 849

Lo más fácil es utilizar el función incorporada :

myContrasts <- list(factor1=contr.sum(length(levels(factor1))),
                    factor2=contr.sum(length(levels(factor2))))

model1 <- lm(Rate ~ factor1 + factor2, data=myData, contrasts=myContrasts)

2voto

Tim Saunders Puntos 3694

Hay paquetes para ello.

Un ejemplo es glmc - Modelos lineales generalizados sujetos a restricciones.

Vea la documentación aquí: http://cran.r-project.org/web/packages/glmc/glmc.pdf

Una muy buena visión general de las técnicas de optimización con el uso de conservantes se puede encontrar aquí: http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

Código de ejemplo (de la documentación de Glmc):

library(glmc)
#Specify the data.
n <- rbind(c(5903,230),c(5157,350))
mat <- matrix(0,nrow=sum(n),ncol=2)
mat <- rbind(matrix(1,nrow=n[1,1],ncol=1)%*%c(0,0),
matrix(1,nrow=n[1,2],ncol=1)%*%c(0,1),
matrix(1,nrow=n[2,1],ncol=1)%*%c(1,0),
matrix(1,nrow=n[2,2],ncol=1)%*%c(1,1))
#Specifying the population constraints.
gfr <- .06179*matrix(1,nrow=nrow(mat),ncol=1)
g <- matrix(1,nrow=nrow(mat),ncol=1)

amat <- matrix(mat[,2]*g-gfr,ncol=1)

hrh <- data.frame(birth=mat[,2], child=mat[,1], constraints=amat)
gfit <- glmc(birth~child, data=hrh, family="binomial",emplik.method="Owen",
control=glmc.control(maxit.glm=10,maxit.weights=200,
itertrace.weights=TRUE,gradtol.weights=10^(-6)))
summary.glmc(gfit)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X