2016-03-14 79 views
2

我希望使用dplyr包中的group_by来适应多个nls函数,但我不确定如何传递多个起始值。我们举一个更简单的例子(见?nls为灵感)。用dplyr拟合多个nls函数

DNase1 <- subset(DNase, Run == 1) 
modelDNase1 <- DNase1 %>% 
    do(model = nls(density ~ 1/(1 + exp((xmid - log(conc))/scal)), 
      data = ., 
      start = list(xmid = 0, scal = 1), 
      algorithm = "plinear")) 

所以我在这里适合一个单一的模型。但是,如果我想延长这个,所以我安装了以下内容:

DNase$Run <- factor(DNase$Run) 
modelDNase <- DNase %>% 
    group_by(Run) %>% 
    do(model = nls(density ~ 1/(1 + exp((xmid - log(conc))/scal)), 
      data = ., 
      start = list(xmid = 0, scal = 1), 
      algorithm = "plinear")) 

我将如何通过对多个start参数? purrr包是否有用?

+0

莫非您将组的起始值添加到您的数据框中,然后执行类似'start = list(xmid =。$ xmid [1] ...)'? – Gregor

+0

嗯,我不这么认为。数据是长格式的(请参阅'data(DNase,package =“datasets”)') – nathaneastwood

+0

让我们改述一下:如果将起始值添加到数据框(每个组内重复的常量),我认为您可以使用方法在我的第一条评论中提出。我不确定'。$'语法是否可以工作,这可能是一个语法问题。如果你的列被称为'xmid',你甚至可以做'start = list(xmid = xmid [1],...)' – Gregor

回答

3

(评论回答。)我的第一个猜测是正确的,.$语法似乎工作。

作为拾取起始值的便捷方式,请在新列中创建一个具有唯一组值和所需起始值的表格。知道任何关于这个数据,我分配他们随机:

starts = data.frame(Run = unique(DNase$Run), 
      xmid_start = rnorm(11, sd = 0.1), 
      scale_start = 1 + rnorm(11, sd = 0.1)) 

然后我们就可以加入这个以数据和进行,从每个分组给予模型拉出第一起始值:

mods = DNase %>% 
    left_join(starts) %>% 
    group_by(Run) %>% 
    do(model = nls(density ~ 1/(1 + exp((xmid - log(conc))/scal)), 
      data = ., 
      start = list(xmid = first(.$xmid_start), 
          scal = first(.$scale_start)), 
      algorithm = "plinear")) 
+0

这是一个很好的解决方案。谢谢。我会留下来看看是否有其他方式,但除此之外,我对此感到满意。 – nathaneastwood