4

R では、相互作用項、二乗項などを含む式の右辺の記号導関数を取得する方法が必要です。

たとえば、次の 2 つの [edit:three] 式の右辺を x について微分できるようにしたいと考えています。

y~x+I(x^2)

y~x:z

編集:y~x*z

上記の 3 つの式を入力すると、それぞれ 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() から出力を取得し、それを数式の右辺のように整形する方法はありますか? 特に、D() がこの問題を軽減し、希望する形式で出力を生成することはわかっています (ただし、D() は数式を入力として処理できません)。導関数を取得したい変数ごとに D() を何度も適用することでこれを回避できますが、そのようなすべての変数の文字列を単純に入力し、配置に適した出力を受け取るとよいでしょう。式の右辺。

ありがとうございました!

4

2 に答える 2

2

数式がある場合は、substitute() を使用して操作できます。

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)

これは、チルダ演算子が関数として扱われ、LHS が の 2 番目の要素であるリスト構造から RHS を抽出することによってy ~ x:z処理されるように、RHS を「再形成」する方法を示しています。~ x*z(~ , <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]]
`^`

式ツリーをトラバースする関数を見たい場合は、数年前に Rhelp で構築された独特の Gabor Grothendieck: http://markmail.org/message/25lapzv54jc4wfwd?q=list:org%2Er-project%2Er -help+eval+substitute+expression

于 2013-10-17T23:52:25.087 に答える
1

deriv( ?deriv)のヘルプ ファイルはexpr、関数の引数がderiv「式または呼び出し、または (D を除く) lhs のない式」であると述べています。したがって、式で方程式の左辺を使用することはできません。

質問の 2 番目の部分で、私があなたの質問を正しく理解していれば、次のようなことができます。たとえば、rhs が x^2+y^2 であり、この式を x と y で偏導関数する必要があるとします。

myexp <- expression((x^2) + (y^2))
D.sc.x <- D(myexp, "x")
> D.sc.x
2 * x
D.sc.y <- D(myexp, "y")
> D.sc.y
2 * y

一行で:

lapply(as.list(c("x","y")),function(a)D(myexp,a))
[[1]]
2 * x

[[2]]
2 * y
于 2013-10-17T22:17:50.907 に答える