我想知道如何检索或复制smooth.spline年前引擎盖下使用的设计矩阵.smooth.spline似乎没有办法返回这个矩阵.因此,我正在try 使用bs函数来重新生成矩阵.

当我运行smooth.spline并通过all.knots参数指定 node 时,与通过将相同的 node 传递给bs函数而获得的B样条阵相比,来自Fit的参数的数量减少了1.有没有人能帮我理解如何重现smooth.spline个已知 node 所使用的训练矩阵?谢谢!

以下是重现该行为的代码:

n = 200
y = rnorm(n=n)
x = runif(n=n)
knots = c(0,seq(0.001,0.999,.01),1)
mod = smooth.spline(x,y,all.knots=knots,keep.stuff=TRUE)

X = bs(x,knots=knots)

dim(X)[2] #105 
length(mod$fit$coef) #104

推荐答案

这并没有解释如何使用smooth.spline的输出的内部数据来获得更平滑的矩阵,但我们可以通过将单位矩阵通过smooth.spline来获得该矩阵(这也是求线性运算符的矩阵的一般方法).另请参阅https://www.stat.cmu.edu/~cshalizi/dst/18/hw/02/smoother.matrix.R

set.seed(123)
n <- 200
y <- rnorm(n)
x <- runif(n)
mod <- smooth.spline(x, y, keep.stuff = TRUE)

S <- apply(diag(n), 2, function(y) fitted(smooth.spline(x, y, df = mod$df)))

max(abs(S %*% y - fitted(mod)))
## [1] 2.183287e-08

如果你只需要更平滑的矩阵的对角线,那么hatvalues(mod)就可以了.

max(abs(diag(S) - hatvalues(mod)))
## [1] 1.676781e-08

这将计算一个满足xB=Sy的矩阵X.

b <- mod$fit$coef
X <- tcrossprod(fitted(mod), b/c(crossprod(b)))

max(abs(X %*% b - S %*% y))
## [1] 4.959864e-09

方程成立是因为如果X=(Sy)b‘/(b’b),则xb=((Sy)b‘/(b’b))b=(Sy)(b‘b)/(b’b)=Sy.

请注意,这样的X不是唯一的,因为如果我们将与b垂直的向量加到X的行上,那么等式仍然成立.

尽管我们展示的X确实满足所要求的等式,但我不确定它是否真的是您想要的.请注意,查看source,我们可以将mod$AUXM转换为如下所示的矩数组表:

aux2Mat <- function(auxM) {
    stopifnot(is.list(auxM),
              identical(vapply(auxM, class, ""),
                        setNames(rep("numeric", 4), c("XWy", "XWX", "Sigma", "R"))))
    ## requireNamespace("Matrix")# want sparse matrices
    nk <- length(XWy <- auxM[["XWy"]])
    list(XWy = XWy,
         XWX =  Matrix::bandSparse(nk, k= 0:3, diagonals= matrix(auxM[[ "XWX" ]], nk,4), symmetric=TRUE),
         Sigma= Matrix::bandSparse(nk, k= 0:3, diagonals= matrix(auxM[["Sigma"]], nk,4), symmetric=TRUE))
}
L <- aux2Mat(mod$auxM)

此外,除了可能的尺寸外,所有4个参数都会产生相同的结果:

bb <- solve(L$XWX + mod$lambda * L$Sigma, L$XWy); bb
(L$XWX + mod$lambda * L$Sigma) %*% bb
L$XWy
mod$fit$coef

R相关问答推荐

基于两个现有列创建新列

按自定义数字模式对变量名称排序

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

在(g)子中使用asserable字符

多重RHS固定估计

在另存为PNG之前隐藏htmlwidget绘图元素

R—将各种CSV数字列转换为日期

plotly hover文本/工具提示在shiny 中不起作用

try 将 colored颜色 编码添加到ggploly的标题中

解析R函数中的变量时出现的问题

R中1到n_1,2到n_2,…,n到n_n的所有组合都是列表中的向量?

如何从容器函数中提取conf并添加到ggplot2中?

如何在R中通过多个变量创建交叉表?

跨列查找多个时间报告

将具有坐标列表列的三角形转换为多个多边形

数值型数据与字符混合时如何进行绑定

随机 Select 的非NA列的行均数

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

如何在R中创建这些列?

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?