首页 > 解决方案 > 如何通过反复试验或 R 中更好的特定替代方法将数据集拟合到特定函数?

问题描述

我有一个数据集,我想调整到以下函数并找到参数 a 和 b: 在此处输入图像描述

我尝试了非线性最小二乘法,但是,我想通过反复试验来尝试,使用具有 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)))

在此处输入图像描述

标签: rregressionnls

解决方案


我想知道您是否对 的输出有点不信任nls,认为也许您可以找到更适合自己的?

这是一种至少可以让您更好地感受由 和 的不同值创建的适合度的a方法b。这个想法是我们创建一个图,a其中 x 轴上的所有值和by 轴上的所有值。对于每一对,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

在此处输入图像描述

显然,最优的ab位于白线上的某处。

现在让我们看看和nls的最佳组合在哪里:ab

p + geom_point(aes(x= 2.8312323, y = 0.0334379), size = 5)

在此处输入图像描述

它看起来好像在白线的“弯曲”处找到了最佳值,这可能是你猜到的。

看起来如果你偏离这条白线,你的合身性会更差,而且你不会在白线上找到任何更好的地方。

相信nls. 是的,拟合看起来不太好,但这仅仅是因为数据不能很好地拟合这个特定的公式,但是你设置了它的参数。如果您的模型必须采用这种形式,并且这些是您的数据,那么这是您将获得的最佳选择。


推荐阅读