r - 公式的符号导数

标签 r formula derivative

在 R 中,我想要一种方法来获取公式右侧的符号导数,其中可能包括交互项、平方项等。

例如,我希望能够求以下两个 [edit: Three] 公式右侧关于 x 的导数:

y~x+I(x^2)

y~x:z

编辑:y~x*z

我想要一个函数,当输入上述三个公式中的每一个时,分别返回 1+2x、z 和 1+z。

我尝试过以下方法:

f1<-y~x+I(x^2)
deriv(f1,"x")
## Error in deriv.formula(f1, "x") : Function 'I' is not in the derivatives table

f2<-y~x:z
deriv(f2,"x")
## Error in deriv.formula(f2, "x") : Function '`:`' is not in the derivatives table

有没有办法强制R将I(x^2)(或者类似地,I(x*z)等)识别为x^2(分别为x*z),x:z为x *z(数学意义上)和x*z(公式意义上)作为x+z+x*z(数学意义上)用于计算导数?

其次,有没有办法获取 deriv() 的输出并将其 reshape 为看起来像公式的右侧?特别是,我知道 D() 会缓解这个问题并以我想要的形式生成输出(尽管 D() 无法处理公式作为输入),但是如果我想对多个变量求导数怎么办?我可以通过对每个我想要求导的变量一遍又一遍地应用 D() 来解决这个问题,但是最好简单地输入所有这些变量的字符串并接收适合放置的输出在公式的右侧。

谢谢!

最佳答案

如果您有公式表达式,您可以使用 Replace() 来处理它:

substitute( x~x:z+x:y , list(`:`=as.name("*") ) )
x ~ x * z + x * y

这将让您将表达式对象传递给 substitute首先对其进行评估(否则不会发生这种情况,因为 substitute 不会评估其第一个参数):

form1 <- expression(x ~ x : z + x : y)
rm(form2)
form2 <- do.call('substitute' , list(form , list(`:`=as.name("*") ) ))
form2
# expression(x ~ x * z + x * y)

这展示了如何“ reshape ”RHS,以便 y ~ x:z处理方式类似于 ~ x*z通过从其列表结构中提取 RHS,其中波形符运算符被视为函数,而 LHS 是 (~ , <LHS>, <RHS>) 中的第二个元素:

 f2<-y~x:z
 substar <- function(form) { 
            do.call('substitute' , list(form , list(`:`=as.name("*") ) )) }
 f3 <- substar(f2)
 deriv(f3[[3]],"x")
 #----------------------
expression({
    .value <- x * z
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- z
    attr(.value, "gradient") <- .grad
    .value
})

如果您想使用表达式,了解它们的组织方式类似于列表以及运算符实际上是类似 Lisp 的函数可能会有所帮助:

> Z <- y~x+I(x^2)
> Z
y ~ x + I(x^2)
> Z[[1]]
`~`
> Z[[2]]
y
> Z[[3]]
x + I(x^2)
> Z[[3]][[1]]
`+`
> Z[[3]][[2]]
x
> Z[[3]][[3]]
I(x^2)
> Z[[3]][[3]][[1]]
I
> Z[[3]][[3]][[2]]
x^2
> Z[[3]][[3]][[2]][[1]]
`^`

如果您想查看一个遍历表达式树的函数,无与伦比的 Gabor Grothendieck 几年前在 Rhelp 中构建了一个函数:http://markmail.org/message/25lapzv54jc4wfwd?q=list:org%2Er-project%2Er-help+eval+substitute+expression

关于r - 公式的符号导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436401/

相关文章:

r - 当每条记录是一个段落并且某些记录有 4 个字段而其他记录有 6 个时,如何将文本文件读入 R

r - R 中的 Julia(JuliaCall 和 XRJulia 不适用于 Julia 0.7 或更高版本)

excel - 每次单元格的值被公式更改时,如何运行 VBA 代码?

r - R 中的类表达式。其中元素的使用

r - 使用 ggplot 和 purrr 绘制多条逻辑曲线的推导图

python - Jupyter 笔记本的 R 内核

sql - 响应 SQL 的 'in' 语句的 R 语句是什么?

excel - 仅从与人员列表匹配的日期和 ID 中获取名称

python - 年金公式的 future 值(value)不起作用

python - 如何从多项式拟合中提取导数?