LaTeXFan - 9 months ago 47

R Question

Consider a function

`f`

`x`

`a`

`f`

`x`

`g`

`a`

`g`

`a`

`uniroot`

`integrate`

`R`

`b <- 2`

truncfn <- function(x) pmin(b, pmax(x, -b))

# thetashape and thetascale are constants

# x and a are arguments

f <- function(x, thetashape, thetascale, a){

term1 <- -1/thetascale

term2 <- (1-thetashape)/thetascale

term3 <- x/(thetascale-thetashape*x)

term1 + term2*term3 - a

}

# First, integrate f with respect to x

g <- integrate(truncfn(f), lower=0, upper=Inf)

# Second, find root of g

uniroot(g, ...)

Answer

You can define a function (I call it `truncfn2`

) that calls `truncfn`

on the result of the call to `f`

, and then `g`

integrates `truncfn2`

. Finally `uniroot`

searches for the root of `g`

:

```
b <- 2
truncfn <- function(x) pmin(b, pmax(x, -b))
# thetashape and thetascale are constants
# x and a are arguments
f <- function(x, thetashape, thetascale, a){
term1 <- -1/thetascale
term2 <- (1-thetashape)/thetascale
term3 <- x/(thetascale-thetashape*x)
term1 + term2*term3 - a
}
truncfn2 <- function(x, thetashape, thetascale, a) truncfn(f(x, thetashape, thetascale, a))
g <- function(a) integrate(truncfn2, thetascale=1, thetashape=0.6, a=a, lower=0, upper=10)$value
uniroot(g, lower=-10, upper=10)
# $root
# [1] -1.867932
#
# $f.root
# [1] 1.134733e-07
#
# $iter
# [1] 7
#
# $init.it
# [1] NA
#
# $estim.prec
# [1] 6.103516e-05
```

Source (Stackoverflow)