[R] Partial Derivatives in R

Paul Heinrich Dietrich paul.heinrich.dietrich at gmail.com
Mon May 11 13:30:28 CEST 2009


Hi Spencer,
Thanks for suggesting the genD function.  In attempting it, I have
rearranged my function from phat1 ~ ... to ... - 1, it apparently doesn't
like the first one :)  But when I run it, it tells me the partials are all
zero.  I'm trying out a simple MNL equation before I expand it to what I'm
looking for.  Here is what I tried (and I get different answers from a
textbook solution, deriv(), and genD()):

> ### Variables for an observation
> x01 <- rnorm(1,0,1)
> x02 <- rnorm(1,0,1)
> ### Parameters for an observation
> b00.1 <- rnorm(1,0,1)
> b00.2 <- rnorm(1,0,1)
> b00.3 <- 0
> b01.1 <- rnorm(1,0,1)
> b01.2 <- rnorm(1,0,1)
> b01.3 <- 0
> b02.1 <- rnorm(1,0,1)
> b02.2 <- rnorm(1,0,1)
> b02.3 <- 0
> ### Predicted Probabilities for an observation
> phat1 <- 0.6
> phat2 <- 0.3
> phat3 <- 0.1
> ### Correct way to calculate a partial derivative
> partial.b01.1 <- phat1 * (b01.1 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b01.2 <- phat2 * (b01.2 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b01.3 <- phat3 * (b01.3 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b01.1; partial.b01.2; partial.b01.3
[1] 0.04288663
[1] -0.1804876
[1] 0.1376010
> 
> partial.b02.1 <- phat1 * (b02.1 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b02.2 <- phat2 * (b02.2 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b02.3 <- phat3 * (b02.3 - (b01.1*phat1+b01.2*phat2+b01.3*phat3))
> partial.b02.1; partial.b02.2; partial.b02.3
[1] 0.8633057
[1] 0.3171978
[1] 0.1376010
> ### Derivatives for MNL
> dp1.dx <- deriv(phat1 ~ exp(b00.1+b01.1*x01+b02.1*x02) /
+ (exp(b00.1+b01.1*x01+b02.1*x02)+exp(b00.2+b01.2*x01+b02.2*x02)+
+ exp(b00.3+b01.3*x01+b02.3*x02)), c("x01","x02"))
> dp2.dx <- deriv(phat2 ~ exp(b00.2+b01.2*x01+b02.2*x02) /
+ (exp(b00.1+b01.1*x01+b02.1*x02)+exp(b00.2+b01.2*x01+b02.2*x02)+
+ exp(b00.3+b01.3*x01+b02.3*x02)), c("x01","x02"))
> dp3.dx <- deriv(phat3 ~ exp(b00.3+b01.3*x01+b02.3*x02) /
+ (exp(b00.1+b01.1*x01+b02.1*x02)+exp(b00.2+b01.2*x01+b02.2*x02)+
+ exp(b00.3+b01.3*x01+b02.3*x02)), c("x01","x02"))
> attr(eval(dp1.dx), "gradient")
             x01      x02
[1,] -0.01891354 0.058918
> attr(eval(dp2.dx), "gradient")
            x01         x02
[1,] -0.1509395 -0.06258685
> attr(eval(dp3.dx), "gradient")
          x01         x02
[1,] 0.169853 0.003668849
> library(numDeriv)
> dp1.dx <- function(x) {exp(b00.1+b01.1*x01+b02.1*x02) /
+ (exp(b00.1+b01.1*x01+b02.1*x02)+exp(b00.2+b01.2*x01+b02.2*x02)+
+ exp(b00.3+b01.3*x01+b02.3*x02)) - phat1}
> test <- genD(dp1.dx, c(phat1,b00.1,b01.1,b02.1,x01,x02)); test
$D
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
[,14]
[1,]    0    0    0    0    0    0    0    0    0     0     0     0     0    
0
     [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26]
[1,]     0     0     0     0     0     0     0     0     0     0     0     0
     [,27]
[1,]     0

$p
[1] 6

$f0
[1] 0.05185856

$func
function(x) {exp(b00.1+b01.1*x01+b02.1*x02) /
(exp(b00.1+b01.1*x01+b02.1*x02)+exp(b00.2+b01.2*x01+b02.2*x02)+
exp(b00.3+b01.3*x01+b02.3*x02)) - phat1}

$x
[1]  0.600000000  1.401890082 -1.304531849  0.062833294 -0.143141379
[6] -0.005995477

$d
[1] 1e-04

$method
[1] "Richardson"

$method.args
$method.args$eps
[1] 1e-04

$method.args$d
[1] 1e-04

$method.args$zero.tol
[1] 1.781029e-05

$method.args$r
[1] 4

$method.args$v
[1] 2


attr(,"class")
[1] "Darray"
> 





spencerg wrote:
> 
>       Have you considered genD{numDeriv}? 
> 
>       If this does not answer your question, I suggest you try the 
> "RSiteSearch" package.  The following will open a list of options in a 
> web browser, sorted by package most often found with your search term: 
> 
> 
> library(RSiteSearch)
> pd <- RSiteSearch.function('partial derivative')
> pds <- RSiteSearch.function('partial derivatives')
> attr(pd, 'hits') # 58
> attr(pds, 'hits')# 52
> summary(pd)
> HTML(pd)
> HTML(pds)
> 
>    
>       The development version available via 
> 'install.packages("RSiteSearch", repos="http://R-Forge.R-project.org")' 
> also supports the following: 
>      
> 
> pd. <- unionRSiteSearch(pd, pds)
> attr(pd., 'hits')# 94
> HTML(pd.)
> 
> 
>       Hope this helps. 
>       Spencer Graves
> 
> Paul Heinrich Dietrich wrote:
>> Quick question:
>>
>> Which function do you use to calculate partial derivatives from a model
>> equation?
>>
>> I've looked at deriv(), but think it gives derivatives, not partial
>> derivatives.  Of course my equation isn't this simple, but as an example,
>> I'm looking for something that let's you control whether it's a partial
>> or
>> not, such as:
>>
>> somefunction(y~a+bx, with respect to x, partial=TRUE)
>>
>> Is there anything like this in R?
>>
> 
> ______________________________________________
> R-help at r-project.org mailing list
> 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.
> 
> 

-- 
View this message in context: http://www.nabble.com/Partial-Derivatives-in-R-tp23470413p23481511.html
Sent from the R help mailing list archive at Nabble.com.




More information about the R-help mailing list