在 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/