如何在R中用平滑样条生成预测?及MSE计算报错排查
问题解答
1. 错误原因及修正
你遇到的错误是因为predict(smooth.spline(...))返回的是列表对象,包含预测的x值($x)和对应的预测y值($y),直接用列表和数值向量做减法属于非数值操作,触发报错。
修正代码如下:
# 拟合平滑样条模型 fit_training <- smooth.spline(training_dataset$x, training_dataset$y) # 预测训练集并提取预测值向量 yhat_training <- predict(fit_training, newx = training_dataset$x)$y # 计算训练MSE mean((yhat_training - training_dataset$y)^2)
如果你的X_training_set和y_training_set是单独提取的向量,可改为:
yhat_training <- predict(fit_training, newx = X_training_set)$y mean((yhat_training - y_training_set)^2)
2. 关于smooth.spline的最优Knots选择
R中smooth.spline默认不是直接选择knot的数量,而是通过**广义交叉验证(GCV)**自动选择最优的平滑参数lambda,以此控制样条的平滑程度:
- 默认设置
nknots = min(n, 30)(n为样本量),生成固定数量的knots; - 通过GCV选择最优
lambda,该参数会惩罚模型复杂度,最终决定有效自由度(Effective Degrees of Freedom),对应拟合的灵活程度; - 若需手动指定knot数量,可通过
nknots参数设置,例如smooth.spline(x, y, nknots = 15)。
测试集预测示例
对测试集进行预测的逻辑与训练集一致:
# 假设test_dataset为你的测试数据集 yhat_test <- predict(fit_training, newx = test_dataset$x)$y test_mse <- mean((yhat_test - test_dataset$y)^2)
内容的提问来源于stack exchange,提问作者TFT
相关产品推荐
相关产品推荐

