需要更平滑的拟合曲线

机器算法验证 r 回归
2022-04-04 23:28:49

我正在尝试绘制模型拟合曲线。我无法获得更平滑的拟合曲线。有什么建议吗?

XY <- data.frame(cbind(Values = c(91.8, 95.3,   99.8,   123.3,  202.9,  619.8,  1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1),
            Concn = c(1000, 300,    100,    30, 10, 3,  1,  0.3,    0.1,    0.03,   0.01,   0)))
nls.fit <- nls(Values ~ (ymax* Concn / (ec50 + Concn)) + Ns*XY$Concn + ymin, data=XY,
				   start=list(ymax=max(XY$Values), ymin = min(XY$Values), ec50 = 3, Ns = 0.2045514))
plot(XY$Values ~ XY$Concn , data = XY, col = 4,
     main = "XY Std curve", log = "x")
lines(XY$Concn, predict(nls.fit))

在此处输入图像描述

4个回答

这似乎是剂量反应模型的一个案例。Ritz 等人有一篇优秀的论文。(2015)描述了如何使用 R 进行这些分析。此处提供了介绍。

使用您的数据和 R 包drc(这是 Ritz 等人在论文中描述的包),我为数据拟合了一个 4 参数对数逻辑函数。

# Load package
library(drc)

# The data
XY <- structure(list(Values = c(91.8, 95.3, 99.8, 123.3, 202.9, 619.8, 
1214.2, 1519.1, 1509.2, 1523.3, 1595.2, 1625.1), Concn = c(1000, 
300, 100, 30, 10, 3, 1, 0.3, 0.1, 0.03, 0.01, 0)), .Names = c("Values", 
"Concn"), class = "data.frame", row.names = c(NA, -12L))    

# Fit a four-parameter log-logistic function to the data
fit <- drm(Values~Concn, data = XY, fct = LL.4())

# Plot the fit
plot(fit, type = "confidence", broken = TRUE, col = "grey50", lwd = 2)
plot(fit, type = "obs", broken = TRUE, pch = 1, lwd = 2, col = "blue", add = TRUE)

拟合剂量反应曲线

合身对我来说看起来很不错。

我也觉得原著剧情在某种程度上已经很流畅了。另一种方法是ggplot为您进行平滑处理。不确定这是否是您想要的。

ggplot(XY, aes(x=log(Concn), y = Values)) + geom_smooth(method="loess")

在此处输入图像描述

您已将曲线绘制为十一个数据点之间的线性插值。即使真正的底层曲线是平滑的,通过获取 11 个样本点并线性插值来绘制它也会看起来很尖。

绘制曲线时需要更多的采样点。创建一系列 x 值以用作样本点:

x <- seq(from = min(XY$Values), to = max(XY$Values), length.out = 250)

我的目标是创建 250 个样本点。然后将这些输入到您的预测函数中,您将获得(在人类感知范围内)平滑的曲线渲染。

你的功能对我来说看起来很流畅,我认为你想要的是更多的灵活性。

所以这是一个具有 8 个自由度的样条曲线:

library(splines)
my_glm <- glm(Values ~ ns(Concn, df = 8), data = XY)
plot(XY$Values ~ XY$Concn , data = XY, col = 4,
     main = "XY Std curve", log = "x")
lines(XY$Concn, predict(my_glm))

[暂时无法上传图片]

现在这很灵活,并且贯穿所有要点。但后来我看到你有这个很好的理论模型,它一定来自你的主题:

Values ~ (ymax* Concn / (ec50 + Concn)) + Ns*XY$Concn + ymin

我有点嫉妒。还有什么可以解释这个理论模型中的偏见(如果我们看到的差异确实是偏见)?即使你无法解释偏差,它肯定很简单,并且很好地解释了变化。事实上,R 平方高于 99.9%:

cor(XY$Values, predict(my_glm))^2