使用 cobs 包通过特定点进行约束曲线拟合时出错:NA/NaN/Inf 在外部函数调用中
Error with constrained curve fitting through specific points using the cobs package: NA/NaN/Inf in foreign function call
我试图通过一组给定的点找到最佳拟合曲线。拟合曲线也必须通过这些点。我找到了一个 answer on Cross Validated which suggested to use the cobs: Constrained B-Splines (Sparse Matrix Based)
包。但是,我在使用我的示例数据进行测试时遇到错误:
Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)
我的问题:是什么导致了这个错误,我该如何解决?我也对使用不同 methods/packages 的其他解决方案持开放态度。谢谢!
library(cobs)
dat <- data.frame(
x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
y = c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216,5.46))
dat
#> x y
#> 1 1.0e-06 0.0000001
#> 2 2.5e-01 1.9250000
#> 3 5.0e-01 2.9625000
#> 4 7.5e-01 3.4693750
#> 5 1.0e+00 3.8750000
#> 6 2.0e+00 4.5315000
#> 7 3.0e+00 4.8900000
#> 8 4.0e+00 5.0937500
#> 9 5.0e+00 5.2160000
#> 10 6.0e+00 5.4600000
# visual inspection
plot(dat); lines(dat)
# define constrained points
con <- matrix(
cbind(c(0,0,0,0,0,0,0,0,0,0),
c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216, 5.46)),
ncol = 3, nrow = 10)
# curve fitting
fit_result <- cobs(dat$x, dat$y, pointwise = con)
#> qbsks2():
#> Performing general knot selection ...
#> Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)
由 reprex package (v0.3.0)
于 2020-01-21 创建
你的问题听起来像“样条插值”。
可能是 R 中最简单的解决方案:
f = splinefun(dat$x, dat$y)
#simple plot
x = seq(0, 6, , 200)
plot(dat)
lines(x, f(x))
我注意到有不同类型的曲线拟合。例如,在回归建模中,目标通常是找到一条线或平面(泛化到一个表面),从而提供最佳拟合。样条拟合和回归建模并不总是分开进行的,因为有些情况下样条用于回归目的。
注意:我post查看了 R 帮助,并被要求post 到这里。
注意: 我已经在 R-Help 上回答了这个问题,并且 OP 要求我也在 SO 上回答。
一个解决方案是显式设置 constraint
的类型并为 lambda
选择一个值。在 final mail 中,OP 提供了有关如何拟合曲线的额外信息。
library(cobs)
dat <- data.frame(
x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
y = c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216,5.46))
con <- matrix(
cbind(c(0,0,0,0,0,0,0,0,0,0),
c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216, 5.46)),
ncol = 3, nrow = 10)
# curve fitting
fit_result <- cobs(dat$x, dat$y,
constraint = "increase",
lambda = 0.1,
pointwise = con)
pred <- predict(fit_result)
plot(y~x, dat)
lines(pred[,1], pred[,2], col = "red")
我试图通过一组给定的点找到最佳拟合曲线。拟合曲线也必须通过这些点。我找到了一个 answer on Cross Validated which suggested to use the cobs: Constrained B-Splines (Sparse Matrix Based)
包。但是,我在使用我的示例数据进行测试时遇到错误:
Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)
我的问题:是什么导致了这个错误,我该如何解决?我也对使用不同 methods/packages 的其他解决方案持开放态度。谢谢!
library(cobs)
dat <- data.frame(
x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
y = c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216,5.46))
dat
#> x y
#> 1 1.0e-06 0.0000001
#> 2 2.5e-01 1.9250000
#> 3 5.0e-01 2.9625000
#> 4 7.5e-01 3.4693750
#> 5 1.0e+00 3.8750000
#> 6 2.0e+00 4.5315000
#> 7 3.0e+00 4.8900000
#> 8 4.0e+00 5.0937500
#> 9 5.0e+00 5.2160000
#> 10 6.0e+00 5.4600000
# visual inspection
plot(dat); lines(dat)
# define constrained points
con <- matrix(
cbind(c(0,0,0,0,0,0,0,0,0,0),
c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216, 5.46)),
ncol = 3, nrow = 10)
# curve fitting
fit_result <- cobs(dat$x, dat$y, pointwise = con)
#> qbsks2():
#> Performing general knot selection ...
#> Error in x %*% coefficients: NA/NaN/Inf in foreign function call (arg 2)
由 reprex package (v0.3.0)
于 2020-01-21 创建你的问题听起来像“样条插值”。
可能是 R 中最简单的解决方案:
f = splinefun(dat$x, dat$y)
#simple plot
x = seq(0, 6, , 200)
plot(dat)
lines(x, f(x))
我注意到有不同类型的曲线拟合。例如,在回归建模中,目标通常是找到一条线或平面(泛化到一个表面),从而提供最佳拟合。样条拟合和回归建模并不总是分开进行的,因为有些情况下样条用于回归目的。
注意:我post查看了 R 帮助,并被要求post 到这里。
注意: 我已经在 R-Help 上回答了这个问题,并且 OP 要求我也在 SO 上回答。
一个解决方案是显式设置 constraint
的类型并为 lambda
选择一个值。在 final mail 中,OP 提供了有关如何拟合曲线的额外信息。
library(cobs)
dat <- data.frame(
x = c(1e-06,0.25,0.5,0.75,1,2,3,4,5,6),
y = c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216,5.46))
con <- matrix(
cbind(c(0,0,0,0,0,0,0,0,0,0),
c(1e-06,0.25,0.5,0.75,1,2,3, 4,5,6),
c(1e-07,1.925,2.9625,3.469375,
3.875,4.5315,4.89,5.09375,5.216, 5.46)),
ncol = 3, nrow = 10)
# curve fitting
fit_result <- cobs(dat$x, dat$y,
constraint = "increase",
lambda = 0.1,
pointwise = con)
pred <- predict(fit_result)
plot(y~x, dat)
lines(pred[,1], pred[,2], col = "red")