Hi Jeff, Thanks for your reply and the example.
I'm not sure if it could be applied to the problem I'm facing though, for two reasons: (i) my understanding is that the inverse will associate a new Y coordinate given an absolute X coordinate. However, in the case I'm working on, the transformation that has to be applied depends on X *and* on its position relative to the *normal* of the fitted curve. This means, for instance, that both X and Y will change after transformation. (ii) the fitted curve can be described by a spline, but I'm not sure if inverse of such models can be inferred automatically (I don't know anything about that). The procedure I envision is the following: treat the curve "segment by segment", apply rotation+translation to each segment to bring it on the diagonal, and apply the same transformation to all points corresponding to the same segment (i.e., these are the points that are close and within the "normal" area covered by the segment). Does this make sense? All the best, Emmanuel On 12 March 2012 02:15, Jeff Newmiller <jdnew...@dcn.davis.ca.us> wrote: > It is possible that I do not see what you mean, but it seems like the > following code does what you want. The general version of this is likely to > be rather more difficult to do, but in theory the inverse function seems like > what you are trying to accomplish. > > x <- 1:20 > y <- x^2 + rnorm(20) > > y.lm <- lm( y ~ I(x^2) + x ) > plot( x, y ) > lines( x, predict( y.lm ) ) > > qa <- coef(y.lm)["I(x^2)"] > qb <- coef(y.lm)["x"] > qc <- coef(y.lm)["(Intercept)"] > > # define inverse of known model > f1 <- function( y ) { ( sqrt( 4*qa*( y -qc ) + qb^2 ) - qb ) / ( 2*qa ) } > f2 <- function( y ) { -( sqrt( 4*qa*( y -qc ) + qb^2 ) + qb ) / ( 2*qa ) } > > plot( x, f1( y ) ) > > > --------------------------------------------------------------------------- > Jeff Newmiller The ..... ..... Go Live... > DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... > Live: OO#.. Dead: OO#.. Playing > Research Engineer (Solar/Batteries O.O#. #.O#. with > /Software/Embedded Controllers) .OO#. .OO#. rocks...1k > --------------------------------------------------------------------------- > Sent from my phone. Please excuse my brevity. > > > > Emmanuel Levy <emmanuel.l...@gmail.com> wrote: > >>Dear Jeff, >> >>I'm sorry but I do not see what you mean. It'd be great if you could >>let me know in more details what you mean whenever you can. >> >>Thanks, >> >>Emmanuel >> >> >>On 12 March 2012 00:07, Jeff Newmiller <jdnew...@dcn.davis.ca.us> >>wrote: >>> Aren't you just reinventing the inverse of a function? >>> >>--------------------------------------------------------------------------- >>> Jeff Newmiller The ..... ..... Go >>Live... >>> DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live >>Go... >>> Live: OO#.. Dead: OO#.. >> Playing >>> Research Engineer (Solar/Batteries O.O#. #.O#. with >>> /Software/Embedded Controllers) .OO#. .OO#. >> rocks...1k >>> >>--------------------------------------------------------------------------- >>> Sent from my phone. Please excuse my brevity. >>> >>> Emmanuel Levy <emmanuel.l...@gmail.com> wrote: >>> >>>>Hi, >>>> >>>>I am trying to normalize some data. First I fitted a principal curve >>>>(using the LCPM package), but now I would like to apply a >>>>transformation so that the curve becomes a "straight diagonal line" >>on >>>>the plot. The data used to fit the curve would then be normalized by >>>>applying the same transformation to it. >>>> >>>>A simple solution could be to apply translations only (e.g., as done >>>>after a fit using loess), but here rotations would have to be applied >>>>as well. One could visualize this as the "stretching of a curve", >>>>i.e., during such an "unfolding" process, both translations and >>>>rotations would need to be applied. >>>> >>>>Before I embark on this (which would require me remembering long >>>>forgotten geometry principles) I was wondering if you can think of >>>>packages or tricks that could make my life simpler? >>>> >>>>Thanks for any input, >>>> >>>>Emmanuel >>>> >>>> >>>>Below I provide an example - the black curve is to be "brought" along >>>>the diagonal, and all data points normal to a "small segment" (of the >>>>black curve) would undergo the same transformation as it - what >>>>"small" is remains to be defined though. >>>> >>>> tmp=rnorm(2000) >>>> X.1 = 5+tmp >>>> Y.1 = 5+ (5*tmp+rnorm(2000)) >>>> tmp=rnorm(1000) >>>> X.2 = 9+tmp >>>> Y.2 = 40+ (1.5*tmp+rnorm(1000)) >>>> X.3 = 7+ 0.5*runif(500) >>>> Y.3 = 15+20*runif(500) >>>> X = c(X.1,X.2,X.3) >>>> Y = c(Y.1,Y.2,Y.3) >>>> >>>> lpc1 = lpc(cbind(X,Y), scaled=FALSE, h=c(1,1) ) >>>> plot(lpc1) >>>> >>>>______________________________________________ >>>>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. >>> > ______________________________________________ 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.