拟合 ggplot2、geom_smooth 和 nls [英] Fitting with ggplot2, geom_smooth and nls
问题描述
我试图用方程拟合指数衰减函数(RC 类系统)上的数据:
I am trying to fit data on an exponential decay function (RC like system) with equation:
我的数据位于以下数据框中:
My data are on the following dataframe:
dataset <- data.frame(Exp = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), t = c(0, 0.33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10, 0, 33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10, 0, 0.33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10), fold = c(1, 0.957066345654286, 1.24139015724819, 1.62889151698633, 1.72008539595879, 1.82725412314402, 1.93164365299958, 1.9722929538061, 2.15842019312484, 1.9200507796933, 1.95804730344453, 1, 0.836176542548747, 1.07077717914707, 1.45471712491441, 1.61069357875771, 1.75576377806756, 1.89280913889538, 2.00219054189937, 1.87795513639311, 1.85242493827193, 1.7409346372629, 1, 0.840498729335292, 0.904130905000499, 1.23116185602517, 1.41897551928886, 1.60167656534099, 1.72389226836308, 1.80635095956481, 1.76640786872057, 1.74327897001172, 1.63581509884482))
我有 3 个实验(Exp:4、5 和 6)数据,我想将每个实验拟合到给定的方程上.
I have 3 experiment (Exp: 4, 5 and 6) data I want to fit each experiment on the given equation.
通过对数据进行子集化并使用 nls 计算的参数,我设法为实验做到了这一点
I have managed to do it for of the experiment by subsetting my data and using the parameter calculated by nls
test <- subset(dataset,Exp==4)
fit1 = nls(fold ~ 1+(Vmax*(1-exp(-t/tau))),
data=test,
start=c(tau=0.2,Vmax=2))
ggplot(test,aes(t,fold))+
stat_function(fun=function(t){1+coef(fit1)[[2]]*(1-exp(-t/coef(fit1)[[1]]))})+
geom_point()
但是如果我尝试使用此代码直接在完整数据集上使用 geom_smooth 函数
But if I try to use the geom_smooth function directly on the full dataset with this code
d <- ggplot(test,aes(t,fold))+
geom_point()+
geom_smooth(method="nls",
formula='fold~1+Vmax*(1-exp(-t/tau))',
start=c(tau=0.2,Fmax=2))
print(d)
我收到以下错误:
Error in model.frame.default(formula = ~fold, data = data, weights = weight) :
variable lengths differ (found for '(weights)')
In addition: Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
我的语法有问题吗?我会让这个工作,以便在 dataset
上使用相同的功能,并使用 group 使每个 Exp 级别都适合.
Is there anything wrong with my syntax? I would have this one working in order to use the same function on the dataset
and using group to have one fit per Exp level.
推荐答案
有几个问题:
formula
是nls
的一个参数,你需要给它传递一个公式对象而不是一个字符.- ggplot2 将
y
和x
传递给nls
而不是fold
和t
. - 默认情况下,
stat_smooth
会尝试获取置信区间.这在predict.nls
中没有实现.
formula
is a parameter ofnls
and you need to pass a formula object to it and not a character.- ggplot2 passes
y
andx
tonls
and notfold
andt
. - By default,
stat_smooth
tries to get the confidence interval. That isn't implemented inpredict.nls
.
总结:
d <- ggplot(test,aes(x=t, y=fold))+
#to make it obvious I use argument names instead of positional matching
geom_point()+
geom_smooth(method="nls",
formula=y~1+Vmax*(1-exp(-x/tau)), # this is an nls argument,
#but stat_smooth passes the parameter along
start=c(tau=0.2,Vmax=2), # this too
se=FALSE) # this is an argument to stat_smooth and
# switches off drawing confidence intervals
在 ggplot2 主要更新到版本 2 后,您需要:
After the major ggplot2 update to version 2, you need:
geom_smooth(method="nls",
formula=y~1+Vmax*(1-exp(-x/tau)), # this is an nls argument
method.args = list(start=c(tau=0.2,Vmax=2)), # this too
se=FALSE)
这篇关于拟合 ggplot2、geom_smooth 和 nls的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!