Thank you Arne. Though I didn't detail all of my attempts, I did in fact try a larger restriction matrix that accounted for the levels of the factors.
However, I think my error in those attempts was in adding N columns to the matrix for an N-level factor (rather than N-1 columns), because I thought I needed to explicitly constrain all 5 coefficients of each factor. I am aware of how lm() returns coefficients for all but the first level of the factor, but wasn't clear on how that interacted with the restriction matrix. A brief sentence in the documentation emphasizing the relationship of the number of levels of a factor to the number of coefficients represented in the restriction matrix would have helped me a lot in this situation, but I would, of course, defer to you as to whether this tip is of general enough interest to include in the documentation. Thank you again for your patience and assistance. Keith > -----Original Message----- > From: Arne Henningsen [mailto:[EMAIL PROTECTED] > Sent: Tuesday, June 10, 2008 2:33 AM > To: r-help@r-project.org > Cc: Woolner, Keith > Subject: Re: [R] Systemfit (was RE: How to force two regression > coefficients to be equal but opposite in sign?) > > Hi Keith! > > On Monday 09 June 2008 16:27, Woolner, Keith wrote: > > [...] > > After I sent my initial message, I came across the Systemfit package, > > which allows specification of constraints on parameters. In theory, > > this should solve my problem perfectly. However, I was not able to > > get it to work with my data, as every attempt yielded the following > error: > > > > Error in dimnames(x) <- dn : > > length of 'dimnames' [2] not equal to array extent > > > > I suspect that it is related to some of my variables being factors > > rather than numeric. > > Yes and no (see below). > > > library(systemfit) > > > > # create data frame - X1, X2, X3, X4 are numeric. E1 and E2 are > > factors 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") > > ) > > > > df$X3 <- sqrt(df$X1)+runif(1) > > df$X4 <- sqrt(df$X2)+runif(1) > > > > # Create constraint matrix such that the last two variables must be > > equal but opposite in sign > > No. I guess that you mean that the *coefficients* (and not the > variables) must be equal but opposite in sign. > > > tx <- matrix(0,nrow=1,ncol=4) > > tx[1,3]<- 1 > > tx[1,4]<- 1 > > > > # Run systemfit with only numeric variables (works) > > systemfit(X2 ~ X1 + X3 + X4,"OLS", data=df, restrict.matrix=tx) > > > > # Run systemfit with factors but not constraints (works) > > systemfit(X2 ~ X1 + E1 + E2,"OLS", data=df) > > > > # Run systemfit with factors and constraints (this returns an error) > > systemfit(X2 ~ X1 + E1 + E2,"OLS", data=df, restrict.matrix=tx) > > Run this regression without constraints (works) > systemfit(X2 ~ X1 + E1 + E2,"OLS", data=df ) > > Take a look at the coefficients: We have *10* coefficients now (because > "E1" > and "E2" are factors. Hence, your restriction matrix must have *10* > columns. > For instance, if you want to restrict the coefficients of the "B"s in > "E1" > and "E2" (third and seventh coefficient, respectively) to be equal but > opposite in sign, you could do the following: > tx2 <- matrix(0,nrow=1,ncol=10) > tx2[1,3]<- 1 > tx2[1,7]<- 1 > systemfit(X2 ~ X1 + E1 + E2,"OLS", data=df, restrict.matrix=tx2) > > > Is systemfit able to deal with factors as independent variables > having > > constraints, and if so, is there some trick in formulating the > problem? > > I searched through the package documentation, but did not see mention > > of factors being either supported or unsupported. > > Until now, I thought that it not necessary to say something about > factors, because they should work in systemfit as in other R functions > (e.g. lm). > The documentation says that "restrict.matrix" must be a j x k matrix, > where k is the number of all parameters (NOT the number of all > regressors, which differs if some regressors are factors). Hence, I > think that the documentation is clear enough. However, please tell me > if you have any suggestions for improving the documentation. > > Best wishes, > Arne > > -- > Arne Henningsen > http://www.arne-henningsen.name ______________________________________________ R-help@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.