Luigi Marongiu
2021-Jan-27 10:46 UTC
[R] How to predict/interpolate new Y given knwon Xs and Ys?
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 <spurdle.a at 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.luigi at 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 > > <jdnewmil at 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.luigi at 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 at 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 at 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.-- Best regards, Luigi
Jeff Newmiller
2021-Jan-27 14:32 UTC
[R] How to predict/interpolate new Y given knwon Xs and Ys?
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.luigi at 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 <spurdle.a at 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.luigi at 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 >> > <jdnewmil at 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.luigi at 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 at 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 at 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.