我在2D图上有点。我想找到适合该模型的最佳三阶多项式并获得其一阶导数。但是我无法使D函数正常工作。这是简单的示例:

a <- 0:10
b <- c(2, 4, 5, 8, 9, 12, 15, 16, 18, 19, 20)
plot(a, b)
m1 <- lm(b ~ a + I(a ^ 2) + I(a ^ 3))
s <- coef(m1)

## try to get 1st derivative of the regression polynomial
D(expression(s[1] + s[2] * a + (a ^ 2) * s[3] + (a ^ 3) * s[4]), "a")



D中的错误(表达式(s [1] + s [2] * a +(a ^ 2)* s [3] +(a ^ 3)* s [4]),:

函数“ [”不在派生表中


我想避免通过微分计算数值导数。感谢帮助!

最佳答案

您看到“函数'['不在派生表中”的错误消息是因为D只能识别符号操作的某些功能。您可以在?D中找到它们:

The internal code knows about the arithmetic operators ‘+’, ‘-’,
‘*’, ‘/’ and ‘^’, and the single-variable functions ‘exp’, ‘log’,
‘sin’, ‘cos’, ‘tan’, ‘sinh’, ‘cosh’, ‘sqrt’, ‘pnorm’, ‘dnorm’,
‘asin’, ‘acos’, ‘atan’, ‘gamma’, ‘lgamma’, ‘digamma’ and
‘trigamma’, as well as ‘psigamma’ for one or two arguments (but
derivative only with respect to the first).  (Note that only the
standard normal distribution is considered.)


"["实际上是R中的一个函数(读取?Extract?"[")。

为了证明类似的行为,请考虑:

s <- function (x) x

D(expression(s(x) + x ^ 2), name = "x")
# Error in D(expression(s(x) + x^2), name = "x") :
#  Function 's' is not in the derivatives table


在这里,即使s被定义为简单函数,D对此也无能为力。

我最近对Function for derivatives of polynomials of arbitrary order (symbolic method preferred)的回答已解决了您的问题。我的三个答案中提供了三种方法,但都不基于数值导数。我个人更喜欢the one using outer(LaTeX数学公式的唯一答案),因为对于多项式来说,一切都是精确的。

要使用该解决方案,请在此处使用函数g,并通过要计算导数的值(例如x)指定参数0:10,并通过多项式回归系数pc指定s。默认情况下,为nderiv = 0L,因此将多项式本身返回,就好像调用了predict.lm(m1, newdata = list(a = 0:10))一样。但是,一旦指定了nderiv,您将获得回归曲线的精确导数。

a <- 0:10
b <- c(2, 4, 5, 8, 9, 12, 15, 16, 18, 19, 20)
plot(a, b)
m1 <- lm(b ~ a + I(a ^ 2) + I(a ^ 3))
s <- coef(m1)
#(Intercept)           a      I(a^2)      I(a^3)
# 2.16083916  1.17055167  0.26223776 -0.02020202

## first derivative at your data points
g(0:10, s, nderiv = 1)
# [1] 1.1705517 1.6344211 1.9770785 2.1985237 2.2987568 2.2777778 2.1355866
# [8] 1.8721834 1.4875680 0.9817405 0.3547009




其他说明:建议您使用poly(a, degree = 3, raw = TRUE)而不是I()。它们在此处执行相同的操作,但poly更简洁,并且如果想要进行交互(例如在How to write interactions in regressions in R?中),则更容易

关于r - 使用`D`获取回归多项式的导数时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34799673/

10-12 19:47