带R的自然三次样条回归

带R的自然三次样条回归,r,regression,lm,spline,cubic-spline,R,Regression,Lm,Spline,Cubic Spline,我似乎对R中的spline::ns()函数有问题 我创造了一个简单的虚拟问题 dat <- data.frame(t <- seq(0, 6, .01), x <- rnorm(length(t), sd = 1), y <- 5 + t - x^2 + rnorm(length(t), sd = .33)) lm(y ~ t + I(x^2), data = dat) library(splin

我似乎对R中的
spline::ns()
函数有问题

我创造了一个简单的虚拟问题

dat <- data.frame(t <- seq(0, 6, .01),
                  x <- rnorm(length(t), sd = 1),
                  y <- 5 + t - x^2 + rnorm(length(t), sd = .33))

lm(y ~ t + I(x^2), data = dat)

library(splines)
lm(y ~ t + ns(x, knots = c(0), Boundary.knots = c(-3, 3)), data = dat)
dat完全忽略ns()您缺少两件事:

1) 上面解释如何定义数据帧的注释:

t <- seq(0, 6, .01)
x <- rnorm(length(t), sd = 1)
y <- 5 + t - x^2 + rnorm(length(t), sd = .33)
df <- data.frame(t, x, y)       
rm(t, x, y)
第一个模型无法正确识别您认为它的功能。

完全忽略ns(),您缺少两件事:

1) 上面解释如何定义数据帧的注释:

t <- seq(0, 6, .01)
x <- rnorm(length(t), sd = 1)
y <- 5 + t - x^2 + rnorm(length(t), sd = .33)
df <- data.frame(t, x, y)       
rm(t, x, y)

第一个模型无法正确识别您认为它的功能。

没有任何错误,因为您安装的模型不完全相同,而且它们甚至不相等。

为了解释您看到的不同结果,使用一个简单的例子和一个协变量
x
就足够了。我们从一个二次多项式生成数据:
5+x+x^2
,然后拟合几个模型

set.seed(0)
x <- rnorm(500, mean = 1)  ## `x` with non-zero mean
y <- 5 + x + x * x + rnorm(500, sd = 0.5)
library(splines)

fit1 <- lm(y ~ x + I(x^2))
#(Intercept)            x       I(x^2)  
#      4.992        1.032        0.980  

fit2 <- lm(y ~ poly(x, degree = 2))
#(Intercept)  poly(x, degree = 2)1  poly(x, degree = 2)2  
#      7.961                70.198                28.720

fit3 <- lm(y ~ bs(x, degree = 2, df = 2))
#(Intercept)  bs(x, degree = 2, df = 2)1   bs(x, degree = 2, df = 2)2  
#      6.583                      -8.337                       20.650  

fit4 <- lm(y ~ ns(x, df = 2))
#(Intercept)  ns(x, df = 2)1  ns(x, df = 2)2  
#      5.523          10.737          21.265  
要查看参数化方面的差异,请查看设计矩阵:

X1 <- model.matrix(~ x + I(x^2))
X2 <- model.matrix(~ poly(x, degree = 2))
X3 <- model.matrix(~ bs(x, degree = 2, df = 2))

par(mfrow = c(3,3), oma = rep.int(1,4), mar = c(4, 4, 0, 0))

plot(x, X1[, 1], cex = 0.2)
plot(x, X1[, 2], cex = 0.2)
plot(x, X1[, 3], cex = 0.2)

plot(x, X2[, 1], cex = 0.2)
plot(x, X2[, 2], cex = 0.2)
plot(x, X2[, 3], cex = 0.2)

plot(x, X3[, 1], cex = 0.2)
plot(x, X3[, 2], cex = 0.2)
plot(x, X3[, 3], cex = 0.2)

没有什么问题,因为您安装的型号不完全相同,而且它们甚至不相等。

为了解释您看到的不同结果,使用一个简单的例子和一个协变量
x
就足够了。我们从一个二次多项式生成数据:
5+x+x^2
,然后拟合几个模型

set.seed(0)
x <- rnorm(500, mean = 1)  ## `x` with non-zero mean
y <- 5 + x + x * x + rnorm(500, sd = 0.5)
library(splines)

fit1 <- lm(y ~ x + I(x^2))
#(Intercept)            x       I(x^2)  
#      4.992        1.032        0.980  

fit2 <- lm(y ~ poly(x, degree = 2))
#(Intercept)  poly(x, degree = 2)1  poly(x, degree = 2)2  
#      7.961                70.198                28.720

fit3 <- lm(y ~ bs(x, degree = 2, df = 2))
#(Intercept)  bs(x, degree = 2, df = 2)1   bs(x, degree = 2, df = 2)2  
#      6.583                      -8.337                       20.650  

fit4 <- lm(y ~ ns(x, df = 2))
#(Intercept)  ns(x, df = 2)1  ns(x, df = 2)2  
#      5.523          10.737          21.265  
要查看参数化方面的差异,请查看设计矩阵:

X1 <- model.matrix(~ x + I(x^2))
X2 <- model.matrix(~ poly(x, degree = 2))
X3 <- model.matrix(~ bs(x, degree = 2, df = 2))

par(mfrow = c(3,3), oma = rep.int(1,4), mar = c(4, 4, 0, 0))

plot(x, X1[, 1], cex = 0.2)
plot(x, X1[, 2], cex = 0.2)
plot(x, X1[, 3], cex = 0.2)

plot(x, X2[, 1], cex = 0.2)
plot(x, X2[, 2], cex = 0.2)
plot(x, X2[, 3], cex = 0.2)

plot(x, X3[, 1], cex = 0.2)
plot(x, X3[, 2], cex = 0.2)
plot(x, X3[, 3], cex = 0.2)

我建议使用
=
而不是
来定义data.frame中的列,第二个模型估计的截距不同于5,由于用于拟合数据的模型与真正的数据生成模型不同。我建议将此问题迁移到交叉验证——这更像是一个统计问题,而不是R问题。我建议使用
=
而不是
在data.frame中定义列。第二个模型估计截距不同于5,因为用于拟合数据的模型不同于真正的数据生成模型。我建议将此问题迁移到交叉验证——这更像是一个统计问题,而不是R问题。
sum(abs(fit1$fitted - fit4$fitted))
# [1] 39.36563