我在2D图上有点。我想找到适合这个模型的最佳第3个多项式并得到它的一阶导数。但我无法使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]),:
功能&#39;
[
&#39;不在衍生表中
我想避免通过差分计算数值导数。谢谢你的帮助!
答案 0 :(得分:3)
您看到的错误消息&#34; 功能&#39; public class Solution {
public int reverse(int x) {
long tmp = x;
long res = 0;
if(x>0){
while(tmp >= 10){
res += tmp%10;
res*=10;
tmp=tmp/10;
}
}
else{
while(tmp <= -10){
res += tmp%10;
res*=10;
tmp=tmp/10;
}
}
res+=tmp;
return (res>Integer.MAX_VALUE||res<Integer.MIN_VALUE)? 0: (int)res;
}
}
&#39;不属于衍生工具表&#34;是因为[
只能识别符号操作的某组函数。您可以在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
也无法使用它。
我最近对Function for derivatives of polynomials of arbitrary order (symbolic method preferred)的回答解决了您的问题。在我的三个答案中提供了三种方法,其中没有一种是基于数值导数。我个人更喜欢the one using outer
(使用LaTeX数学公式的唯一答案),就多项式而言,一切都是精确的。
要使用该解决方案,请使用此处的函数D
,并按要评估导数的值(例如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()
更简洁,如果您想要互动,可以更轻松,例如How to write interactions in regressions in R?