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

From: Greg Snow <Greg.Snow_at_imail.org>
Date: Fri, 06 Jun 2008 11:39:27 -0600

One simple way is to do something like:

Hope this helps,

```--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow_at_imail.org
(801) 408-8111

> -----Original Message-----

> From: r-help-bounces_at_r-project.org
> [mailto:r-help-bounces_at_r-project.org] On Behalf Of Woolner, Keith
> Sent: Friday, June 06, 2008 10:07 AM
> To: r-help_at_r-project.org
> Subject: [R] How to force two regression coefficients to be
> equal but opposite in sign?
>
> 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
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

______________________________________________
R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help