Thank you for the clarification. On Wed, Jan 27, 2021 at 3:32 PM Jeff Newmiller <jdnew...@dcn.davis.ca.us> wrote: > > Your piecewise-linear function Y(X) is not invertible as a whole so there is > no general solution per algebra. > > You keep saying predict can do this, but as I pointed out and Rui ventured to > expand the math on, predict cannot calculate an inverse even if you swap the > inputs. And as Abby pointed out, you are abusing lm by applying it to data > with systematic errors (negligible random residuals). > > If you know which portion of the curve you want a result in, you can use a > subset of your data to create an invertible piecewise linear function:: > > approx( Y[1:39], X[1:39], 6 )$y > > On January 27, 2021 2:46:40 AM PST, Luigi Marongiu <marongiu.lu...@gmail.com> > wrote: > >That is right, I removed the points above 39, and also got 16.60964, > >which looks good to me. Splines is good and I will use it for > >non-linear interpolation. For now I used linear conversion to keep it > >simple but looks to me it is getting out of hand. I simply need to do > >the following interpolation: > >``` > >Y <-c(1.301030, 1.602060, 1.903090, 2.204120, 2.505150, 2.806180, > ># log transformation of the original data > > 3.107210, 3.408240, 3.709270, > > 4.010300, 4.311330, 4.612360, 4.913390, 5.214420, 5.515450, > > 5.816480, 6.117510, 6.418540, > > 6.719570, 7.020599, 7.321629, 7.622658, 7.923686, 8.224713, > > 8.525735, 8.826751, 9.127752, > > 9.428723, 9.729637, 10.030434, 10.330998, 10.631096, 10.930265, > > 11.227580, 11.521213, 11.807577, > > 12.079787, 12.325217, 12.523074, 12.647915, 12.693594, 12.698904, > > 12.698970, 12.698970, 12.698970) > >X <- 1:45 > >plot(Y~X) > >points(16.60964, 6, pch=16) > >segments(0, 6, 16.60964, 6) > >arrows(16.60964, 6, 16.60964, 1) > ># given Y find X > >``` > >How shall I use predict then? The use of other packages when predict > >can do it would be overkill... > >Thank you > > > >On Wed, Jan 27, 2021 at 11:32 AM Abby Spurdle <spurdl...@gmail.com> > >wrote: > >> > >> I got 16.60964. > >> Your curve is not linear up to the 39th point. > >> And as your points appear to be deterministic and nonlinear, splines > >> are likely to be easier to use. > >> > >> Here's a base-only solution (if you don't like my kubik suggestion): > >> > >> g <- splinefun (X, Y) > >> f <- function (x) g (x) - 6 > >> uniroot (f, c (1, 45) )$root > >> > >> > >> On Wed, Jan 27, 2021 at 10:30 PM Luigi Marongiu > >> <marongiu.lu...@gmail.com> wrote: > >> > > >> > Dear Jeff, > >> > I am not sure if I understood the procedure properly but it looks > >like it works: > >> > ``` > >> > Y <-c(1.301030, 1.602060, 1.903090, 2.204120, 2.505150, > >2.806180, > >> > 3.107210, 3.408240, 3.709270, > >> > 4.010300, 4.311330, 4.612360, 4.913390, 5.214420, 5.515450, > >> > 5.816480, 6.117510, 6.418540, > >> > 6.719570, 7.020599, 7.321629, 7.622658, 7.923686, 8.224713, > >> > 8.525735, 8.826751, 9.127752, > >> > 9.428723, 9.729637, 10.030434, 10.330998, 10.631096, 10.930265, > >> > 11.227580, 11.521213, 11.807577, > >> > 12.079787, 12.325217, 12.523074, 12.647915, 12.693594, 12.698904, > >> > 12.698970, 12.698970, 12.698970) > >> > X <- 1:45 > >> > plot(Y~X) > >> > raw_value <- predict(lm(X[1:39]~Y[1:39]), newdata = > >data.frame(Y=6)) > >> > x <- unname(raw_value[!is.na(raw_value)]) # x= 16.62995 > >> > points(x, 6, pch = 16) > >> > ``` > >> > Here I used the points 1:39 because afterward there is a bend. But > >I > >> > am not clear why I need to use `lm(X~Y),` instead of `lm(Y~X)`. > >> > Thank you > >> > > >> > On Tue, Jan 26, 2021 at 10:20 AM Jeff Newmiller > >> > <jdnew...@dcn.davis.ca.us> wrote: > >> > > > >> > > model2 <- lm( x~y ) > >> > > predict(model2, data.frame(y=26)) > >> > > > >> > > model2 is however not the inverse of model... if you need that > >then you need to handle that some other way than using predict, such as > >an invertible monotonic spline (or in this case a little algebra). > >> > > > >> > > On January 26, 2021 1:11:39 AM PST, Luigi Marongiu > ><marongiu.lu...@gmail.com> wrote: > >> > > >Hello, > >> > > >I have a series of x/y and a model. I can interpolate a new > >value of x > >> > > >using this model, but I get funny results if I give the y and > >look for > >> > > >the correspondent x: > >> > > >``` > >> > > >> x = 1:10 > >> > > >> y = 2*x+15 > >> > > >> model <- lm(y~x) > >> > > >> predict(model, data.frame(x=7.5)) > >> > > > 1 > >> > > >30 > >> > > >> predict(model, data.frame(y=26)) > >> > > > 1 2 3 4 5 6 7 8 9 10 > >> > > >17 19 21 23 25 27 29 31 33 35 > >> > > >Warning message: > >> > > >'newdata' had 1 row but variables found have 10 rows > >> > > >> data.frame(x=7.5) > >> > > > x > >> > > >1 7.5 > >> > > >> data.frame(y=26) > >> > > > y > >> > > >1 26 > >> > > >``` > >> > > >what is the correct syntax? > >> > > >Thank you > >> > > >Luigi > >> > > > > >> > > >______________________________________________ > >> > > >R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, > >see > >> > > >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. > >> > > > >> > > -- > >> > > Sent from my phone. Please excuse my brevity. > >> > > >> > > >> > > >> > -- > >> > Best regards, > >> > Luigi > >> > > >> > ______________________________________________ > >> > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > >> > 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. > > -- > Sent from my phone. Please excuse my brevity.
-- Best regards, Luigi ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.