在R

时间:2017-02-03 01:26:23

标签: r curve-fitting glm nls sigmoid

我想一次拟合多条曲线,并根据它们的3个估计参数进行统计比较 - 渐近线,斜率和x0。 这是要建模的数据的理想化图像: enter image description here

大多数可搜索的页面都会调整方法以适合单个曲线,如下所示: http://kyrcha.info/2012/07/08/tutorials-fitting-a-sigmoid-function-in-r/ 和这里 http://rstudio-pubs-static.s3.amazonaws.com/7812_5327615eb0044cf29420b955ddaa6173.html

就我而言,我想测试(统计上)改变变量水平对sigmoid 的三个参数的影响。也就是说,当我适应这个模型时:

model <- nls(y ~ asym / (1 + exp( -slope * (x – x0) ) ), start = c(…), data = my_data)

我想将两个因素(例如“factorA”和“factorB”)的交互添加到asym,slope和x0术语中,我们可以使用{{{ 1}}或lm(),如下所示:

glm()

这样,我可以看到这三个参数在不同级别的factorA(以及可能的多个其他因素,从图像中可以看到)是否在统计上是不同的。例如,我们可以看到“条件”对曲线的渐近线有影响。

我之前使用虚拟编码完成了每个交互变量的每个级别,但这不是直接测试这些变量的方法,而且模型更加冗长。它看起来像这样:

model_int <- nls(y ~ asym*factorA / (1 + exp( -(slope*factorA) * (x – (x0*factorA) ) ), start = c(…), data = my_data)

正如您可能猜到的,这种方法在整洁和缺乏可解释性方面存在明显的缺点。

是否有人知道如何拟合一组sigmoids,其中参数与数据集中的变量相互作用,以生成略有不同形状的曲线?

1 个答案:

答案 0 :(得分:0)

好吧,我不确定这是不是你在找什么,但nls函数中的这个例子可以帮助你:

> head(muscle)
   Strip Conc Length
3    S01    1   15.8
4    S01    2   20.8
5    S01    3   22.6
6    S01    4   23.8
9    S02    1   20.6
10   S02    2   26.8
# get some initial values
musc.1 <- nls(Length ~ cbind(1, exp(-Conc/th)), muscle,
              start = list(th = 1), algorithm = "plinear")
summary(musc.1)

# and now with factor Strip
b <- coef(musc.1)
musc.2 <- nls(Length ~ a[Strip] + b[Strip]*exp(-Conc/th), muscle,
              start = list(a = rep(b[2], 21), b = rep(b[3], 21), th = b[1]))
summary(musc.2)

所以在你的情况下,它将是这样的:

fit <- nls(y ~ asym[Factor]/ (1 + exp(-slope[Factor]*(x –x0[Factor]))), start = c(…), data = my_data)

希望这有帮助