2

ggplot2 メーリング リストで誰かの質問に答えようとしているのですが、わかりません: https://groups.google.com/forum/#!topic/ggplot2/YgCqQX8JbPM

OP は、nls モデルのデータのサブセットに異なる開始パラメーターを適用したいと考えています。私の考えでは、彼は dplyr と purrr を読むべきだったのですが、数時間自分自身を試してみた後、私は壁にぶつかりました。それがバグなのか、それとも私の経験不足なのかは不明です。

library(tidyverse)

# input dataset
df <- data.frame(Group = c(rep("A", 7), rep("B", 7), rep("C", 7)),
                 Time = c(rep(c(1:7), 3)),
                 Result = c(100, 96.9, 85.1, 62.0, 30.7, 15.2, 9.6, 
                            10.2, 14.8, 32.26, 45.85, 56.25, 70.1, 100,
                            100, 55.61, 3.26, -4.77, -7.21, -3.2, -5.6))

# nest the datasets for computing models
df_p <-
df %>%
group_by(Group) %>%
nest

# add model parameters as rows/columns
df_p$starta = c(-3, 4,-3)
df_p$startb = c(85, 85, 85)
df_p$startc = c(4, 4, 4)
df_p$startd = c(10,10,10)

# compute models using nls
df_p %>%
mutate(model2 = map(data, ~nls(Result ~ a+(b-a)/(1+(Time/c)^d), data = ., start = c(a = starta, b = startb, c = startc, d = startd)))
        )

#Error in mutate_impl(.data, dots) : 
#  parameters without starting value in 'data': a, b, d

このバグに関連しているように感じますが、これはしばらくの間修正されています... https://github.com/hadley/dplyr/issues/1447

私が知る限り、ネストされた tibble のスコープ内で変数を探していますが、mutate 呼び出しのスコープ内にしたいのです。これを回避する方法があるかどうかはわかりません。

4

2 に答える 2

2

設定したモデルを生成するための一連のパラメーターを見つけることができませんが、モデル フィッティング プロセスを設定する限り、これができることだと思います。基本的に、すべてのパラメーターstarta, startb .. etcをデータResultTime列にラップできます。その後、 を使用してパラメーターにアクセスできます。この場合、ネスト解除時に値がブロードキャストされているため、関数で 1 つの値を選択.$する必要があることに注意してください。unique単純なモデル式 を使用a + b*Timeすると、列にモデルが生成されmodel2ます。このルートに従って、 に渡される初期パラメーターを微調整して、指定しnlsたより複雑な式に適合させることができます。

library(tidyverse)

df_p %>% unnest %>% group_by(Group) %>% nest %>%
         mutate(model2 = map(data, ~nls(Result ~ a + b*Time, data = ., 
                                        start = c(a = unique(.$starta), 
                                                  b = unique(.$startb))
                                       )
                             )
               )

# A tibble: 3 × 3
#   Group             data    model2
#  <fctr>           <list>    <list>
#1      A <tibble [7 × 6]> <S3: nls>
#2      B <tibble [7 × 6]> <S3: nls>
#3      C <tibble [7 × 6]> <S3: nls>
于 2016-12-29T03:06:37.177 に答える