LaTeXFan - 1 year ago 139
R Question

# uniroot in R when there are two unknowns

Consider a function

`f`
of two arguments
`x`
and
`a`
. First I take integration of
`f`
with respect to
`x`
, which becomes a function
`g`
of
`a`
. Second, I want to find the root of the resulting function
`g`
of
`a`
. Can I do this using
`uniroot`
and
`integrate`
in
`R`
? If so, how? If not, is there a way to do this at all? Thanks.

``````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, ...)
``````

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
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download