Hi, I'm Marianna I'm trying to apply the command "repeat" to my matrix but the repeat process doesn't work as I would. In particular I would like to apply the function robustm () _that I have created_ to my two matrices, if the difference between the two matrices is less than 0.001, R give me back the last matrix. The code thus created allows me to repeat the process only on the first two matrices: function(x) { for(i in 1:10) repeat { b<-robustm(S_X) b2<-robustm(b) if(abs(b2[i,i]-b[i,i])<=0.001) break } print(b2)} in particular S_X is my matrix number1 (already defined, dim 10*10), b2 is my matrix n.2, if the difference isn't less than my value, I would like reiterate the process using b2 instead S_X and so on... (actually serves to me that if the difference is not less than 0.001 the process starts again taking the last array that has identified as output (in this case b2) and the remarket in the process creating b3, b4, etc. up to find the minimum difference between the two matrices and returns me the last.) Sorry if I am not so clear, thanks Mary -- View this message in context: http://r.789695.n4.nabble.com/Iterative-loop-using-repeat-tp4654625.html Sent from the R help mailing list archive at Nabble.com.
Hi Mary, Some things are clear from your code fragment: - S_X is a variable external to your function, and is possibly a variable accessible to robustm. - Unless calling robustm changes S_X or abs(b1[i,i]-b)[i,i])<=0.001 is always true for all S_X and all i, your repeat statement, and so your function, will never terminate. Otherwise, your code fragment is opaque, and unless you tell me something you have not stated in your email, I cannot help you. I'm sorry. Best, Mario On Fri, Jan 4, 2013 at 6:13 AM, mary <mary.dama@libero.it> wrote:> Hi, > I'm Marianna > I'm trying to apply the command "repeat" to my matrix but the repeat > process > doesn't work as I would. > > In particular I would like to apply the function robustm () _that I have > created_ to my two matrices, if the difference between the two matrices is > less than 0.001, R give me back the last matrix. > The code thus created allows me to repeat the process only on the first two > matrices: > > function(x) { > for(i in 1:10) > repeat { > b<-robustm(S_X) > b2<-robustm(b) > if(abs(b2[i,i]-b[i,i])<=0.001) > break > } > print(b2)} > > in particular S_X is my matrix number1 (already defined, dim 10*10), b2 is > my matrix n.2, if the difference isn't less than my value, I would like > reiterate the process using b2 instead S_X and so on... > > (actually serves to me that if the difference is not less than 0.001 the > process starts again taking the last array that has identified as output > (in > this case b2) and the remarket in the process creating b3, b4, etc. up to > find the minimum difference between the two matrices and returns me the > last.) > > Sorry if I am not so clear, thanks > Mary > > > > -- > View this message in context: > http://r.789695.n4.nabble.com/Iterative-loop-using-repeat-tp4654625.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > 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. >-- Mario Bourgoin, Ph.D. Department of Mathematics Brandeis University Waltham, MA [[alternative HTML version deleted]]
On 01/04/2013 10:13 PM, mary wrote:> Hi, > I'm Marianna > I'm trying to apply the command "repeat" to my matrix but the repeat process > doesn't work as I would. > > In particular I would like to apply the function robustm () _that I have > created_ to my two matrices, if the difference between the two matrices is > less than 0.001, R give me back the last matrix. > The code thus created allows me to repeat the process only on the first two > matrices: > > function(x) { > for(i in 1:10) > repeat { > b<-robustm(S_X) > b2<-robustm(b) > if(abs(b2[i,i]-b[i,i])<=0.001) > break > } > print(b2)} > > in particular S_X is my matrix number1 (already defined, dim 10*10), b2 is > my matrix n.2, if the difference isn't less than my value, I would like > reiterate the process using b2 instead S_X and so on... > > (actually serves to me that if the difference is not less than 0.001 the > process starts again taking the last array that has identified as output (in > this case b2) and the remarket in the process creating b3, b4, etc. up to > find the minimum difference between the two matrices and returns me the > last.) >Hi Mary, In the above, you are testing whether there is at least one absolute difference less than or equal to 0.001 in the diagonals of two matrices. One matrix is S_X after applying the "robustm" function and the other is after a second iteration of "robustm" on the first matrix. So it seems that "robustm" is a function that hopefully converges on some final value. First, remember that applying "robustm" to S_X in your repeat loop doesn't change S_X. Each time you repeat, you will get the same result. What you may want to do is this: iterate.robustm<-function(x) { b<-robustm(x) finido<-FALSE while(!finido) { b2<-robustm(b) for(i in 1:10) if(abs(b2[i,i]-b[i,i])<=0.001) finido<-TRUE b<-b2 } return(b2) } iterate.robustm(S_X) This iterates "robustm" until at least one diagonal difference is less than or equal to 0.001. Hopefully that function will always converge. Jim
Thanks for the help, For Mario: you're absolutely right in fact the process never stopped!!! in particular I'm trying to do a converge process; the robustm() function is: function (x,z) 1# {eigen<-eigen(x) 2# d<-madmatrix(z) ##I have created this function to calculate "mad" of a whole matrix 3# eigenc<-eigen$vectors 4# q<-d%*%eigenc 5# invQ<-matrix.inverse(q) 6# sZ<-mdefpos(z,invQ) ##this function serves me to define positive my new matrix Z, it's X%*%invQ 7# madZ<-madmatrix(sZ) 8# S_X<-q%*%(madsZ)^2%*%t(q) return(S_X) } reviewing this function I realized that it can not be applied in an iterative manner in the next step because every time a new matrix z should be fed back into the process and then calculate a new scatter matrix; in the code above : (x) is a scatter matrix, Z is a matrix (n*p) of original data that I have used to obtain a scatter matrix... in line 6# I need this new matrix sZ because it will be my new (z) if I reiterate the process on the new scatter matrix S_X, in fact my function robustm() ask me the scatter matrix and the data matrix so... how I can do this...and the reiterate the process so that the matrix converges?? (Thanks to Jim: your reply has focused my problem!!!) -- View this message in context: http://r.789695.n4.nabble.com/Iterative-loop-using-repeat-tp4654625p4654719.html Sent from the R help mailing list archive at Nabble.com.
I'm sorry I read it again the answers and I realized that the condition "if(abs(b2[i,i]-b[i,i])<=0.001)" must be tested for the entire matrix and not only for the diagonal, I misspelled. thanks -- View this message in context: http://r.789695.n4.nabble.com/Iterative-loop-using-repeat-tp4654625p4654720.html Sent from the R help mailing list archive at Nabble.com.