See comments in-line:
On 01/10/11 23:26, Antoine wrote:
Dear Rolf, I tryed to follow your advices but the results I am getting seems still strange to me. See below an example of a matrix: datamat<- matrix(c(2.2, 0.4, 0.4, 2.8), 2, 2) plot(ellipse(datamat),type='l') eigenval<- eigen(datamat)$values eigenvect<- eigen(datamat)$vectors eigenscl<- eigenvect * sqrt(eigenval) * (qchisq(0.95,2))# One solution to get rescale
This is wrong because you are multiplying the i-th row of ``eigenvect'' the square root of the i-th eigenvalue. The *columns* of ``eigenvect'' are the eigenvectors. So you need to multiply the j-th column by the square root of the j-th eigenvalue.
v1<- (eigenvect[,1])*(sqrt(eigenval[1]))*(qchisq(0.95,2))#or directly rescale the vectors needed v2<- (eigenvect[,2])*(sqrt(eigenval[2]))*(qchisq(0.95,2))
The foregoing is correct except that you need to take the square root of the chi-squared quantile.
#Or v1<- eigenscl[1,] v2<- eigenscl[2,] segments(-v1[1],-v1[2],v1[1],v1[2]) segments(-v2[1],-v2[2],v2[1],v2[2]) The vectors don't seem to be scaled properly and I don't see what I am doing wrong. Any ideas?
Here is correct code: require(ellipse) S <- matrix(c(2.2, 0.4, 0.4, 2.8), 2, 2) # Note the ``asp=1'' which makes orthogonal lines # look orthogonal: plot(ellipse(S),type='l',asp=1) E <- eigen(S) Val <- E$values Vec <- E$vectors v1 <- sqrt(Val[1]*qchisq(0.95,2))*Vec[,1] v2 <- sqrt(Val[2]*qchisq(0.95,2))*Vec[,2] segments(-v1[1],-v1[2],v1[1],v1[2]) segments(-v2[1],-v2[2],v2[1],v2[2]) cheers, Rolf Turner ______________________________________________ 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.