从GAM平滑对象确定导数

Phi*_*l W 4 r mgcv

我有一个非常简单的时间序列数据集,包括单个变量的年平均值("AVERAGE").我想调查时间序列的"趋势"组成部分的变化率(一阶导数)和加速度(二阶导数)以及相关的标准误差.我使用MGCV的GAM和PREDICT功能获得了"趋势",简单如下:

A <- gam(AVERAGE ~ s(YEAR), data=DF, na.action=na.omit)
B <- predict(A, type="response", se.fit=TRUE)
Run Code Online (Sandbox Code Playgroud)

我通过2种不同的方法确定了导数,应用了高DoF立方光滑样条,并通过第一和第二差异(轻微平滑)和自举来近似误差,两者都产生了可比较的结果.

我注意到"gam.fit3"功能有助于确定最多二阶导数但不直接调用.我还注意到使用类型为"lpmatrix"的"predict.gam"有助于平滑的衍生.我想直接使用"GAM"函数计算第一和第二衍生物,但是不足以计算或提取这些衍生物.我尝试在"Predict.gam"帮助页面的末尾重新配置Wood的示例,但是没有成功.让我走向正确方向的任何帮助都会非常棒.谢谢菲尔.

mne*_*nel 5

该示例predict.gam使用有限差分来近似平滑项的导数

以下是针对单个预测变量模型执行此操作的示例.这个例子来自于帮助,这更直截了当.

A <- gam(AVERAGE ~ s(YEAR), data=DF, na.action=na.omit)
# new data for prediction
newDF <- with(DF, data.frame(YEAR = unique(YEAR)))
# prediction of smoothed estimates at each unique year value
# with standard error    
B <- predict(A,  newDF, type="response", se.fit=TRUE)


# finite difference approach to derivatives following
# example from ?predict.gam

eps <- 1e-7
X0 <- predict(A, newDF, type = 'lpmatrix')


newDFeps_p <- newDF + eps

X1 <- predict(A, newDFeps_p, type = 'lpmatrix')

# finite difference approximation of first derivative
# the design matrix
Xp <- (X0 - X1) / eps

# first derivative
fd_d1 <- Xp %*% coef(A)

# second derivative
newDFeps_m <- newDF - eps

X_1 <- predict(A, newDFeps_m, type = 'lpmatrix')
# design matrix for second derivative
Xpp <- (X1 + X_1 - 2*X0)  / eps^2
# second derivative
fd_d2 <- Xpp %*% coef(A)
Run Code Online (Sandbox Code Playgroud)

如果使用引导捆绑来获得置信区间,则应该能够在这些近似值上获得置信区间.