[R] How to force two regression coefficients to be equal but opposite in sign?

From: Woolner, Keith <kwoolner_at_indians.com>
Date: Fri, 06 Jun 2008 12:06:37 -0400


Is there a way to set up a regression in R that forces two coefficients

to be equal but opposite in sign?  

I'm trying to setup a model where a subject appears in a pair of

environments where a measurement X is made. There are a total of 5

environments, one of which is a baseline. But each observation is for

a subject in only two of them, and not all subjects will appear in

each environment.  

Each of the environments has an effect on the variable X. I want to

measure the relative effects of each environment E on X with a model.  

Xj = Xi * Ei / Ej  

Ei of the baseline model is set equal to 1.  

With a log transform, a linear-looking regression can be written as:  

log(Xj) = log(Xi) + log(Ei) - log(Ej)  

My data looks like:  

# E1 X1 E2 X2

1 A .20 B .25  

What I've tried in R:  

env <- c("A","B","C","D","E")  

# Note: data is made up just for this example  

df <- data.frame(

                X1 =

c(.20,.10,.40,.05,.10,.24,.30,.70,.48,.22,.87,.29,.24,.19,.92),
                X2 =

c(.25,.12,.45,.01,.19,.50,.30,.40,.50,.40,.68,.30,.16,.02,.70),
                E1 =

c("A","A","A","B","B","B","C","C","C","D","D","D","E","E","E"),
                E2 =

c("B","C","D","A","D","E","A","B","E","B","C","E","A","B","C")

)  

model <- lm(log(X2) ~ log(X1) + E1 + E2, data = df)  

summary(model)  

Call:

lm(formula = log(X2) ~ log(X1) + E1 + E2, data = df)  

Residuals:

      1       2       3       4       5       6       7       8       9
10      11      12      13      14      15 

 0.3240 0.2621 -0.5861 -1.0283 0.5861 0.4422 0.3831 -0.2608 -0.1222 0.9002 -0.5802 -0.3200 0.6452 -0.9634 0.3182  

Coefficients:

            Estimate Std. Error t value Pr(>|t|)

(Intercept) 0.54563 1.71558 0.318 0.763

log(X1) 1.29745 0.57295 2.265 0.073 .

E1B -0.23571 0.95738 -0.246 0.815

E1C -0.57057 1.20490 -0.474 0.656

E1D -0.22988 0.98274 -0.234 0.824

E1E -1.17181 1.02918 -1.139 0.306

E2B -0.16775 0.87803 -0.191 0.856

E2C 0.05952 1.12779 0.053 0.960

E2D 0.43077 1.19485 0.361 0.733

E2E 0.40633 0.98289 0.413 0.696

---

Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

 

Residual standard error: 1.004 on 5 degrees of freedom

Multiple R-squared: 0.7622,     Adjusted R-squared: 0.3343 

F-statistic: 1.781 on 9 and 5 DF,  p-value: 0.2721 

 

----

 

What I need to do is force the corresponding environment coefficients

to be equal in absolute value, but opposite in sign.  That is:

 

E1B = -E2B

E1C = -E3C

E1D = -E3D

E1E = -E1E

 

In essence, E1 and E2 are the "same" variable, but can play two

different roles in the model depending on whether it's the first part

of the observation or the second part.

 

I searched the archive, and the closest thing I found to my situation

was:

 

http://tolstoy.newcastle.edu.au/R/e4/help/08/03/6773.html 

 

But the response to that thread didn't seem to be applicable to my

situation.

 

Any pointers would be appreciated.

 

Thanks,

Keith

 


	[[alternative HTML version deleted]]

______________________________________________
R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Received on Fri 06 Jun 2008 - 18:15:31 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 06 Jun 2008 - 18:30:38 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive