David Winsemius
2018-Apr-06 15:15 UTC
[R] Obtain gradient at multiple values for exponential decay model
> On Apr 6, 2018, at 8:03 AM, David Winsemius <dwinsemius at comcast.net> wrote: > > >> On Apr 6, 2018, at 3:43 AM, g l <gnulinux at gmx.com> wrote: >> >>> Sent: Friday, April 06, 2018 at 5:55 AM >>> From: "David Winsemius" <dwinsemius at comcast.net> >>> >>> >>> Not correct. You already have `predict`. It is capale of using the `newdata` values to do interpolation with the values of the coefficients in the model. See: >>> >>> ?predict >>> >> >> The ? details did not mention interpolation explicity; thanks. >> >>> The original question asked for a derivative (i.e. a "gradient"), but so far it's not clear that you understand the mathematical definiton of that term. We also remain unclear whether this is homework. >>> >> >> The motivation of this post was simple differentiation of a tangent point (dy/dx) manually, then wondering how to re-think in modern-day computing terms. Hence the original question about asking the appropriate functions/syntax to read further ("curiosity"), not the answer (indeed, "homework"). :) >> >> Personal curiosity should be considered "homework". > > Besides symbolic differentiation, there is also the option of numeric differentiation. Here's an amateurish attempt: > > myNumDeriv <- function(x){ (exp( predict (graphmodeld, newdata=data.frame(t=x+.0001))) - > exp( predict (graphmodeld, newdata=data.frame(t=x) )))/ > .0001 } > myNumDeriv(c(100, 250, 350))I realized that this would not work in the context of your construction. I had earlier made a more symbolic version using R formulae: graphdata<-read.csv(text='t,c 0,100 40,78 80,59 120,38 160,25 200,21 240,16 280,12 320,10 360,9 400,7') graphmodeld<-lm(log(c)~t, graphdata) graphmodelp<-exp(predict(graphmodeld)) plot(c~t, graphdata) lines(graphdata[,1],graphmodelp) myNumDeriv(c(100, 250, 350), graphmodeld ) #---------------------------------------------- 1 2 3 -0.31464102 -0.11310753 -0.05718414> > > > David Winsemius > Alameda, CA, USA > > 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law > > ______________________________________________ > 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.David Winsemius Alameda, CA, USA 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law
David Winsemius
2018-Apr-06 18:25 UTC
[R] Obtain gradient at multiple values for exponential decay model
> On Apr 6, 2018, at 8:15 AM, David Winsemius <dwinsemius at comcast.net> wrote: > >> >> On Apr 6, 2018, at 8:03 AM, David Winsemius <dwinsemius at comcast.net> wrote: >> >> >>> On Apr 6, 2018, at 3:43 AM, g l <gnulinux at gmx.com> wrote: >>> >>>> Sent: Friday, April 06, 2018 at 5:55 AM >>>> From: "David Winsemius" <dwinsemius at comcast.net> >>>> >>>> >>>> Not correct. You already have `predict`. It is capale of using the `newdata` values to do interpolation with the values of the coefficients in the model. See: >>>> >>>> ?predict >>>> >>> >>> The ? details did not mention interpolation explicity; thanks. >>> >>>> The original question asked for a derivative (i.e. a "gradient"), but so far it's not clear that you understand the mathematical definiton of that term. We also remain unclear whether this is homework. >>>> >>> >>> The motivation of this post was simple differentiation of a tangent point (dy/dx) manually, then wondering how to re-think in modern-day computing terms. Hence the original question about asking the appropriate functions/syntax to read further ("curiosity"), not the answer (indeed, "homework"). :) >>> >>> Personal curiosity should be considered "homework". >> >> Besides symbolic differentiation, there is also the option of numeric differentiation. Here's an amateurish attempt: >> >> myNumDeriv <- function(x){ (exp( predict (graphmodeld, newdata=data.frame(t=x+.0001))) - >> exp( predict (graphmodeld, newdata=data.frame(t=x) )))/ >> .0001 } >> myNumDeriv(c(100, 250, 350)) > > I realized that this would not work in the context of your construction. I had earlier made a more symbolic version using R formulae: > > graphdata<-read.csv(text='t,c > 0,100 > 40,78 > 80,59 > 120,38 > 160,25 > 200,21 > 240,16 > 280,12 > 320,10 > 360,9 > 400,7') > graphmodeld<-lm(log(c)~t, graphdata) > graphmodelp<-exp(predict(graphmodeld)) > plot(c~t, graphdata) > lines(graphdata[,1],graphmodelp)Again I attempt to correct my incomplete code with this definition that had be modified to take a model object as its second argument: myNumDeriv <- function(x, mod) (exp( predict (mod, newdata=data.frame(t=x+.0001))) - exp( predict (mod, newdata=data.frame(t=x) )))/.0001> myNumDeriv(c(100, 250, 350), graphmodeld ) > #---------------------------------------------- > 1 2 3 > -0.31464102 -0.11310753 -0.05718414 > > >> >> >> >> David Winsemius >> Alameda, CA, USA >> >> 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law >> >> ______________________________________________ >> 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. > > David Winsemius > Alameda, CA, USA > > 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law > > ______________________________________________ > 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.David Winsemius Alameda, CA, USA 'Any technology distinguishable from magic is insufficiently advanced.' -Gehm's Corollary to Clarke's Third Law
Jeff Newmiller
2018-Apr-07 06:19 UTC
[R] Obtain gradient at multiple values for exponential decay model
I have never found the R symbolic differentiation helpful because my
functions are typically quite complicated, but was prompted by Steve
Ellison's suggestion to try it out in this case:
################# reprex (see reprex package)
graphdta <- read.csv( text "t,c
0,100
40,78
80,59
120,38
160,25
200,21
240,16
280,12
320,10
360,9
400,7
", header = TRUE )
nd <- c( 100, 250, 300 )
graphmodeld <- lm( log(c) ~ t, data = graphdta )
graphmodelplin <- predict( graphmodeld
, newdata = data.frame( t = nd )
)
graphmodelp <- exp(graphmodelplin)
graphmodelp
#> 1 2 3
#> 46.13085 16.58317 11.79125
# derivative of exp( a + b*t ) is b * exp( a + b*t )
graphmodeldpdt <- coef( graphmodeld )[ 2 ] * graphmodelp
graphmodeldpdt
#> 1 2 3
#> -0.31464113 -0.11310757 -0.08042364
# Ellison suggestion - fancy, only works for simple functions
dc <- deriv( expression( exp( a + b * t ) )
, namevec = "t"
)
dcf <- function( t ) {
cgm <- coef( graphmodeld )
a <- cgm[ 1 ]
b <- cgm[ 2 ]
eval(dc)
}
result <- dcf( nd )
result
#> [1] 46.13085 16.58317 11.79125
#> attr(,"gradient")
#> t
#> [1,] -0.31464113
#> [2,] -0.11310757
#> [3,] -0.08042364
attr( result, "gradient" )[ , 1 ]
#> [1] -0.31464113 -0.11310757 -0.08042364
#################
On Fri, 6 Apr 2018, David Winsemius wrote:
>
>> On Apr 6, 2018, at 8:03 AM, David Winsemius <dwinsemius at
comcast.net> wrote:
>>
>>
>>> On Apr 6, 2018, at 3:43 AM, g l <gnulinux at gmx.com> wrote:
>>>
>>>> Sent: Friday, April 06, 2018 at 5:55 AM
>>>> From: "David Winsemius" <dwinsemius at
comcast.net>
>>>>
>>>>
>>>> Not correct. You already have `predict`. It is capale of using
the `newdata` values to do interpolation with the values of the coefficients in
the model. See:
>>>>
>>>> ?predict
>>>>
>>>
>>> The ? details did not mention interpolation explicity; thanks.
>>>
>>>> The original question asked for a derivative (i.e. a
"gradient"), but so far it's not clear that you understand the
mathematical definiton of that term. We also remain unclear whether this is
homework.
>>>>
>>>
>>> The motivation of this post was simple differentiation of a tangent
point (dy/dx) manually, then wondering how to re-think in modern-day computing
terms. Hence the original question about asking the appropriate functions/syntax
to read further ("curiosity"), not the answer (indeed,
"homework"). :)
>>>
>>> Personal curiosity should be considered "homework".
>>
>> Besides symbolic differentiation, there is also the option of numeric
differentiation. Here's an amateurish attempt:
>>
>> myNumDeriv <- function(x){ (exp( predict (graphmodeld,
newdata=data.frame(t=x+.0001))) -
>> exp( predict (graphmodeld,
newdata=data.frame(t=x) )))/
>> .0001 }
>> myNumDeriv(c(100, 250, 350))
>
> I realized that this would not work in the context of your construction. I
had earlier made a more symbolic version using R formulae:
>
> graphdata<-read.csv(text='t,c
> 0,100
> 40,78
> 80,59
> 120,38
> 160,25
> 200,21
> 240,16
> 280,12
> 320,10
> 360,9
> 400,7')
> graphmodeld<-lm(log(c)~t, graphdata)
> graphmodelp<-exp(predict(graphmodeld))
> plot(c~t, graphdata)
> lines(graphdata[,1],graphmodelp)
> myNumDeriv(c(100, 250, 350), graphmodeld )
> #----------------------------------------------
> 1 2 3
> -0.31464102 -0.11310753 -0.05718414
>
>
>>
>>
>>
>> David Winsemius
>> Alameda, CA, USA
>>
>> 'Any technology distinguishable from magic is insufficiently
advanced.' -Gehm's Corollary to Clarke's Third Law
>>
>> ______________________________________________
>> 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.
>
> David Winsemius
> Alameda, CA, USA
>
> 'Any technology distinguishable from magic is insufficiently
advanced.' -Gehm's Corollary to Clarke's Third Law
>
> ______________________________________________
> 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.
>
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at 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
J C Nash
2018-Apr-07 12:37 UTC
[R] Obtain gradient at multiple values for exponential decay model
R users may want to note that there are some extensions in packages for symbolic derivatives. In particular, Duncan Murdoch added some "all in R" tools in the package nlsr that I maintain. This is a substitute for the nls() function that uses a fairly unsatisfactory forward difference derivative approximation. Moreover, the solver in nlsr is a variant of the Marquardt stabilized Gauss-Newton approach, rather than the straight Gauss-Newton that often gives a "singular gradient" error. Nothing is free, of course, and the Marquardt approach often uses more iterations when the problem is uncomplicated. On the other hand, it is rather like a pit bull in trying to find a solution. There is also the Deriv package, also "all in R". Both it and nlsr allow extensions to the derivatives table, though I think most users will need to do some homework to become comfortable with doing that. There is also a Google Summer of Code proposal this year to wrap the Julia Automatic Differentiation tools to R. This would allow derivatives of coded functions to be computed avoiding approximations. I believe it will be at least partly successful in achieving its goals. Unfortunately (and I would rather hope that someone can say eventually that I am wrong), I believe no tool is universally applicable. JN On 2018-04-07 02:19 AM, Jeff Newmiller wrote:> I have never found the R symbolic differentiation helpful because my functions are typically quite complicated, but was > prompted by Steve Ellison's suggestion to try it out in this case: > > ################# reprex (see reprex package) > graphdta <- read.csv( text > "t,c > 0,100 > 40,78 > 80,59 > 120,38 > 160,25 > 200,21 > 240,16 > 280,12 > 320,10 > 360,9 > 400,7 > ", header = TRUE ) > > nd <- c( 100, 250, 300 ) > graphmodeld <- lm( log(c) ~ t, data = graphdta ) > graphmodelplin <- predict( graphmodeld > ???????????????????????? , newdata = data.frame( t = nd ) > ???????????????????????? ) > graphmodelp <- exp(graphmodelplin) > graphmodelp > #>??????? 1??????? 2??????? 3 > #> 46.13085 16.58317 11.79125 > # derivative of exp( a + b*t ) is b * exp( a + b*t ) > graphmodeldpdt <- coef( graphmodeld )[ 2 ] * graphmodelp > graphmodeldpdt > #>?????????? 1?????????? 2?????????? 3 > #> -0.31464113 -0.11310757 -0.08042364 > > # Ellison suggestion - fancy, only works for simple functions > dc <- deriv( expression( exp( a + b * t ) ) > ?????????? , namevec = "t" > ?????????? ) > dcf <- function( t ) { > ? cgm <- coef( graphmodeld ) > ? a <- cgm[ 1 ] > ? b <- cgm[ 2 ] > ? eval(dc) > } > result <- dcf( nd ) > result > #> [1] 46.13085 16.58317 11.79125 > #> attr(,"gradient") > #>??????????????? t > #> [1,] -0.31464113 > #> [2,] -0.11310757 > #> [3,] -0.08042364 > attr( result, "gradient" )[ , 1 ] > #> [1] -0.31464113 -0.11310757 -0.08042364 > ################# > > On Fri, 6 Apr 2018, David Winsemius wrote: > >> >>> On Apr 6, 2018, at 8:03 AM, David Winsemius <dwinsemius at comcast.net> wrote: >>> >>> >>>> On Apr 6, 2018, at 3:43 AM, g l <gnulinux at gmx.com> wrote: >>>> >>>>> Sent: Friday, April 06, 2018 at 5:55 AM >>>>> From: "David Winsemius" <dwinsemius at comcast.net> >>>>> >>>>> >>>>> Not correct. You already have `predict`. It is capale of using the `newdata` values to do interpolation with the >>>>> values of the coefficients in the model. See: >>>>> >>>>> ?predict >>>>> >>>> >>>> The ? details did not mention interpolation explicity; thanks. >>>> >>>>> The original question asked for a derivative (i.e. a "gradient"), but so far it's not clear that you understand the >>>>> mathematical definiton of that term. We also remain unclear whether this is homework. >>>>> >>>> >>>> The motivation of this post was simple differentiation of a tangent point (dy/dx) manually, then wondering how to >>>> re-think in modern-day computing terms. Hence the original question about asking the appropriate functions/syntax to >>>> read further ("curiosity"), not the answer (indeed, "homework"). :) >>>> >>>> Personal curiosity should be considered "homework". >>> >>> Besides symbolic differentiation, there is also the option of numeric differentiation. Here's an amateurish attempt: >>> >>> myNumDeriv <- function(x){ (exp( predict (graphmodeld, newdata=data.frame(t=x+.0001))) - >>> ?????????????????????????????????????????? exp( predict (graphmodeld, newdata=data.frame(t=x) )))/ >>> ???????????????????????????????????????? .0001 } >>> myNumDeriv(c(100, 250, 350)) >> >> I realized that this would not work in the context of your construction. I had earlier made a more symbolic version >> using R formulae: >> >> graphdata<-read.csv(text='t,c >> 0,100 >> 40,78 >> 80,59 >> 120,38 >> 160,25 >> 200,21 >> 240,16 >> 280,12 >> 320,10 >> 360,9 >> 400,7') >> graphmodeld<-lm(log(c)~t, graphdata) >> graphmodelp<-exp(predict(graphmodeld)) >> plot(c~t, graphdata) >> lines(graphdata[,1],graphmodelp) >> myNumDeriv(c(100, 250, 350), graphmodeld ) >> #---------------------------------------------- >> ???????? 1?????????? 2?????????? 3 >> -0.31464102 -0.11310753 -0.05718414 >> >> >>> >>> >>> >>> David Winsemius >>> Alameda, CA, USA >>> >>> 'Any technology distinguishable from magic is insufficiently advanced.'?? -Gehm's Corollary to Clarke's Third Law >>> >>> ______________________________________________ >>> 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. >> >> David Winsemius >> Alameda, CA, USA >> >> 'Any technology distinguishable from magic is insufficiently advanced.'?? -Gehm's Corollary to Clarke's Third Law >> >> ______________________________________________ >> 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. >> > > --------------------------------------------------------------------------- > Jeff Newmiller??????????????????????? The???? .....?????? .....? Go Live... > DCN:<jdnewmil at 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 > > ______________________________________________ > 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.
Seemingly Similar Threads
- Obtain gradient at multiple values for exponential decay model
- Obtain gradient at multiple values for exponential decay model
- Obtain gradient at multiple values for exponetial decay model
- Obtain gradient at multiple values for exponential decay model
- Obtain gradient at multiple values for exponetial decay model