r - 如何通过反复试验或 R 中更好的特定替代方法将数据集拟合到特定函数?
问题描述
我尝试了非线性最小二乘法,但是,我想通过反复试验来尝试,使用具有 a 值和 b 值的向量,然后绘制混合这些值的所有备选方案以选择更好的拟合。
library(readxl)
library(ggplot2)
x <- c(52.67, 46.80, 41.74, 40.45)
y <- c(1.73, 1.84, 1.79, 1.45)
df <- data.frame(x,y)
ggplot(data = df, aes(x, y))+
geom_point()+
stat_smooth(method="nls",
se=FALSE,
formula = y ~ (a*b*x)/(1+(b*x)),
method.args = list(start = c(a=2.86, b=0.032)))
解决方案
我想知道您是否对 的输出有点不信任nls
,认为也许您可以找到更适合自己的?
这是一种至少可以让您更好地感受由 和 的不同值创建的适合度的a
方法b
。这个想法是我们创建一个图,a
其中 x 轴上的所有值和b
y 轴上的所有值。对于每一对,a
我们b
计算出结果曲线与我们的数据的接近程度(通过取对数平方和)。如果合身好,我们用亮色上色,如果合身性不好,我们用深色上色。这使我们能够看到适合的组合类型 - 实际上是参数的热图。
# Our actual data, put in a data frame:
df <- data.frame(x = c(52.67, 46.80, 41.74, 40.45), y = c(1.73, 1.84, 1.79, 1.45))
# Create a grid of all a and b values we want to compare
a <- seq(-5, 10, length.out = 200)
b <- seq(0, 0.5, length.out = 100)
all_mixtures <- setNames(expand.grid(a, b), c("a", "b"))
# Get the sum of squares for each point:
all_mixtures$ss <- apply(all_mixtures, 1, function(i) {
log(sum((i[1] * i[2] * df$x / (1 + i[2] * df$x) - y)^2))
})
现在我们绘制热图:
p <- ggplot(all_mixtures, aes(a, b, fill = ss)) +
geom_tile() +
scale_fill_gradientn(colours = c("white", "yellow", "red", "blue"))
p
显然,最优的a
和b
位于白线上的某处。
现在让我们看看和nls
的最佳组合在哪里:a
b
p + geom_point(aes(x= 2.8312323, y = 0.0334379), size = 5)
它看起来好像在白线的“弯曲”处找到了最佳值,这可能是你猜到的。
看起来如果你偏离这条白线,你的合身性会更差,而且你不会在白线上找到任何更好的地方。
相信nls
. 是的,拟合看起来不太好,但这仅仅是因为数据不能很好地拟合这个特定的公式,但是你设置了它的参数。如果您的模型必须采用这种形式,并且这些是您的数据,那么这是您将获得的最佳选择。
推荐阅读
- algorithm - 在特定成本内找到路径
- php - 使用 PHP 进行条带化。如何通过来源对用户的卡信息进行收费
- python - 如何处理熊猫列中的多个时间戳?
- java - 无法在 Java 中解析 lineSeparator
- android - 检查 androidx 对 Xamarin Form 的支持
- java - 关于anroidstudio edittext监听器,TextWatcher不起作用
- javascript - 制作一个适用于所有文本区域的 Summernote,无需重复,
- jquery - jquery ui选项卡除了第一个选项卡外不显示任何内容
- spring - 如何使用 Spring MVC 处理 MaxUploadSizeExceededException
- amazon-web-services - Helm 升级引发 YAML 解析器错误