微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在R中找到关于矢量变量的导数

如何解决如何在R中找到关于矢量变量的导数

我在R中具有以下功能,通过它我可以轻松地找到相对于x1或x2或x3的偏导数:

ppp <- function(x1,x2,x3,m)  { 
n*log(m[1]*exp(x1) + m[2]*exp(x2) + m[3]*exp(x3) + m[4]) 
}
Deriv(ppp,"x3")

如何使函数自动化,以便我将派生词查找为Deriv(ppp,"x[3]")

我尝试了类似的方法,但是它不起作用:

ppp <- function(x,m)  { 
n*log(m[1]*exp(x[1]) + m[2]*exp(x[2]) + m[3]*exp(x[3]) + m[4]) 
}
Deriv(ppp,"x[1]")

考虑到函数的两个参数,sum()的范围从1到3,是否可以用m[1]*exp(x[1]) + m[2]*exp(x[2]) + m[3]*exp(x[3])重写函数

解决方法

您可以在Deriv周围写一个包装,将下标转换为变量,然后再次返回:

library(Deriv)

Deriv_vec <- function(f,var,...)
{
  bod <- c(gsub(var,"new_var",as.character(body(f)),fixed = TRUE),"}")
  body(f) <- parse(text = bod)
  formals(f) <- c(alist(new_var=),formals(f))
  result <- Deriv(f,...)

  bod <- c(gsub("new_var",as.character(body(result)),"}")
  body(result) <- parse(text = bod)
  formals(result) <- formals(result)[-1]
  result
}

这允许:

ppp <- function(x,m)  { 
   n*log(m[1] * exp(x[1]) + m[2] * exp(x[2]) + m[3] * exp(x[3]) + m[4]) 
}

Deriv_vec(ppp,"x[1]")
#> function (x,m) 
#> {
#>     .e1 <- exp(x[1])
#>     n * .e1 * m[1]/(.e1 * m[1] + exp(x[2]) * m[2] + exp(x[3]) * 
#>         m[3] + m[4])
#> }

Deriv_vec(ppp,"x[3]")
#> function (x,m) 
#> {
#>     .e1 <- exp(x[3])
#>     n * .e1 * m[3]/(.e1 * m[3] + exp(x[1]) * m[1] + exp(x[2]) * 
#>         m[2] + m[4])
#> }

如果您需要一个包含多个变量的版本,这会更复杂,但可以这样实现:

Deriv_vec <- function(f,...)
{
  for(i in seq_along(var)) {
    bod <- c(gsub(var[i],paste0("new_var",i),"}")
    body(f) <- parse(text = bod)
  }
  
  new_vars <- paste0("new_var",seq_along(var))
  new_args <- setNames(lapply(seq_along(new_vars),function(x) alist(a=)$a),new_vars)
  formals(f) <- c(new_args,formals(f))
  
  result <- Deriv(f,new_vars,...)
  
  for(i in seq_along(var))
  {
    bod <- c(gsub(new_vars[i],var[i],"}")
    if(substr(bod[length(bod) - 1],1,2) == "c(")
    {
      bod[length(bod) - 1] <- 
        gsub(var[i],paste0("`","`"),bod[length(bod) - 1],fixed = TRUE)
    }
    body(result) <- parse(text = bod)
  }
  formals(result) <- formals(result)[-seq_along(var)]
  result
}

然后允许:

Deriv_vec(ppp,c("x[1]","x[2]","x[3]"))
#> function (x,m) 
#> {
#>     .e1 <- exp(x[1])
#>     .e2 <- exp(x[2])
#>     .e3 <- exp(x[3])
#>     .e7 <- .e1 * m[1] + .e2 * m[2] + .e3 * m[3] + m[4]
#>     c(`x[1]` = n * .e1 * m[1]/.e7,`x[2]` = n * .e2 * 
#>         m[2]/.e7,`x[3]` = n * .e3 * m[3]/.e7)
#> }

请小心您的特定示例。函数ppp包含一个名为n的变量。可能应该将其作为参数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。