2017-07-20 28 views
1

かなり大きなデータフレームでフィッティング関数を実行しようとしましたが、"big_group"'small_group'という変数でグループ化されています。 特に、big_groupの内側にあるsmall_groupのすべての予測値とcoefs値を取得しようとしています。エラー:結果は位置のデータフレームではありません。

つまり、これらの新しい列をdo({関数の最後にある新しいdata.frameに追加しようとしています。

このデータのグループの中には、データポイントが不足している、または「初期パラメータ推定値で単数の勾配行列」エラーのために装着できないものがあります。

だから、私はhow-do-i-ignore-errors-and-continue-processing-list-itemsのこのポストからtryCatch方法を使用して、私は@Koshke

R : catching errors in `nls`

OTHの次の応答を使用し、この問題を解決した後、私はエラーに遭遇するようになっ

を言っています

Error: Results are not data frames at positions: 3

このエラーについては、discussionsがありますが、私の問題に実装する方法を理解できませんでした。

これは私の再現可能な例です。 (この例は私の実際のデータと似ているので、私はこのような例を作りました)

library(minpack.lm) 
library(dplyr) 


set.seed(100) 

data.list <- lapply(1:2, function(big_group) { 
    xx <- c(sort(runif(5,1,5)),sort(runif(5,-8,-2)), rep(5,2)) ##I intentionall added the last two 5 to get unfitted groups 

    yy<- sort(runif(12,0,10)) 

    small_group <- rep(c('a','b','c'),times=c(5,5,2)) ##small groups in under the big_group 

    df <- data.frame(xx,yy,small_group,big_group) 

    df <- df%>% 
    group_by(big_group,small_group)%>% 

    do({ 
    #fitting part 
    fit <- tryCatch(nlsLM(yy~k*xx/2+U, start=c(k=1,U=5), data = ., trace=T, 
          control = nls.lm.control(maxiter=100)),error=function(e) NULL) 

     if(!("NULL" %in% class(fit))){ 

    new.range<- data.frame(xx=seq(1,10,length.out=nrow(.))) 
    predicted <- predict(fit, newdata =new.range) 
    coefs <- data.frame(k=coef(fit)[1],U=coef(fit)[2]) 

    data.frame(., new.range,predicted,coefs,row.names=NULL) ##This is the part the error came from I guess! 

}}) 
}) 

これはデータのようです。 @RomanLuštrik

data.list <- lapply(1:2, function(big_group) { 
    xx <- c(sort(runif(5,1,5)),sort(runif(5,-8,-2)), rep(5,2)) ##I intentionall added the last two 5 to get unfitted groups 
    yy<- sort(runif(12,0,10)) 
    small_group <- rep(c('a','b','c'),times=c(5,5,2)) ##small groups in under the big_group 
    df <- data.frame(xx,yy,small_group,big_group) 
}) 


df <- bind_rows(data.list) 
> df 
      xx  yy small_group big_group 
1 1.685681 1.302889   a   1 
2 2.680406 1.804072   a   1 
3 3.153395 3.306605   a   1 
4 3.995889 3.486920   a   1 
5 4.081206 6.293909   a   1 
6 -6.333657 6.952741   b   1 
7 -5.070164 7.775844   b   1 
8 -4.705420 8.273034   b   1 
9 -2.708278 8.651205   b   1 
10 -2.428970 8.894535   b   1 
11 5.000000 9.541577   c   1 
12 5.000000 9.895641   c   1 
13 1.830856 1.234872   a   2 
14 2.964927 2.114086   a   2 
15 3.413297 2.299059   a   2 
16 4.121434 2.533907   a   2 
17 4.536908 3.577738   a   2 
18 -6.807926 4.451480   b   2 
19 -6.585834 4.637012   b   2 
20 -6.350680 5.913211   b   2 
21 -6.157485 5.975753   b   2 
22 -6.016821 6.471012   b   2 
23 5.000000 6.763982   c   2 
24 5.000000 9.605731   c   2 

答えて

1

どうやってですか?問題は伝統的なRコードをパイプ%>%で動作させるように強制されていたので、私はそれを回避しました。

It. 0, RSS = 44.4318, Par. =   1   5 
It. 1, RSS = 0.259895, Par. = 1.89421 1.00916 
It. 2, RSS = 0.259895, Par. = 1.89421 1.00916 
It. 0, RSS = 81.5517, Par. =   1   5 
It. 1, RSS = 0.256959, Par. = 0.912615 8.80728 
It. 2, RSS = 0.256959, Par. = 0.912615 8.80728 
It. 0, RSS = 1.76253, Par. =   1   5 
It. 1, RSS = 0.715381, Par. = -156.969 400.646 
It. 2, RSS = 0.715381, Par. = -156.969 400.646 
It. 0, RSS =  64.766, Par. =   1   5 
It. 1, RSS = 4.27941, Par. = 3.32947 -1.95395 
It. 2, RSS = 4.27941, Par. = 3.32947 -1.95395 
It. 0, RSS =  137.22, Par. =   1   5 
It. 1, RSS = 0.209219, Par. = 0.893139 10.0071 
It. 2, RSS = 0.209219, Par. = 0.893139 10.0071 
It. 0, RSS = 9.90713, Par. =   1   5 
It. 1, RSS = 0.0626808, Par. = -156.67 401.394 
It. 2, RSS = 0.0626808, Par. = -156.67 401.394 

# Libraries and Options --------------------------------------------------- 
library(minpack.lm) 
library(dplyr) 
set.seed(100) 

# Create the data --------------------------------------------------------- 
data.list <- lapply(1:2, function(big_group) { 
    xx <- c(sort(runif(5,1,5)),sort(runif(5,-8,-2)), rep(5,2)) ##I intentionall added the last two 5 to get unfitted groups 

    yy<- sort(runif(12,0,10)) 

    small_group <- rep(c('a','b','c'),times=c(5,5,2)) ##small groups in under the big_group 

    df <- data.frame(xx,yy,small_group,big_group) 
}) 

df <- bind_rows(data.list) 



# Fit the Model ----------------------------------------------------------- 
print("My understanding here is that you want a separate model fit for each combination of big group and small group") 

# Create fit-level groups 
df$big_small <- paste0(df$big_group, df$small_group) 

# Create results object 
df1 <- structure(list(xx = numeric(0), yy = numeric(0), small_group = structure(integer(0), .Label = c("a", 
         "b", "c"), class = "factor"), big_group = integer(0), big_small = character(0), 
         xx.1 = numeric(0), predicted = numeric(0), k = numeric(0), 
         U = numeric(0)), .Names = c("xx", "yy", "small_group", "big_group", 
                "big_small", "xx.1", "predicted", "k", "U"), row.names = integer(0), class = "data.frame") 

# Fit model, get results 
for(b_s in unique(df$big_small)){ 
    fit <- tryCatch(nlsLM(yy~k*xx/2+U, start=c(k=1,U=5), data = df[df$big_small==b_s,], trace=T, 
         control = nls.lm.control(maxiter=100)),error=function(e) NULL) 

    if(!("NULL" %in% class(fit))){ 

    new.range<- data.frame(xx=seq(1,10,length.out=nrow(df[df$big_small==b_s,]))) 
    predicted <- predict(fit, newdata =new.range) 
    coefs <- data.frame(k=coef(fit)[1],U=coef(fit)[2]) 

    df1 <- rbind(df1, data.frame(df[df$big_small==b_s,], new.range,predicted,coefs,row.names=NULL)) 
    } 
} 
df1 
  xx  yy small_group big_group big_small xx.1 predicted   k   U 
1 1.225533 2.046122   a   1  1a 1.00 1.9562669 1.8942075 1.009163 
2 2.030690 2.803538   a   1  1a 3.25 4.0872502 1.8942075 1.009163 
3 2.231064 3.575249   a   1  1a 5.50 6.2182336 1.8942075 1.009163 
4 2.874197 3.594751   a   1  1a 7.75 8.3492170 1.8942075 1.009163 
5 3.209290 3.984879   a   1  1a 10.00 10.4802004 1.8942075 1.009163 
6 -6.978428 5.358112   b   1  1b 1.00 9.2635844 0.9126145 8.807277 
7 -5.778077 6.249965   b   1  1b 3.25 10.2902757 0.9126145 8.807277 
8 -5.097376 6.690217   b   1  1b 5.50 11.3169671 0.9126145 8.807277 
9 -4.720648 6.902905   b   1  1b 7.75 12.3436585 0.9126145 8.807277 
10 -3.125584 7.108038   b   1  1b 10.00 13.3703498 0.9126145 8.807277 
11 1.685681 1.302889   a   2  2a 1.00 -0.2892182 3.3294688 -1.953953 
12 2.680406 1.804072   a   2  2a 3.25 3.4564342 3.3294688 -1.953953 
13 3.153395 3.306605   a   2  2a 5.50 7.2020866 3.3294688 -1.953953 
14 3.995889 3.486920   a   2  2a 7.75 10.9477390 3.3294688 -1.953953 
15 4.081206 6.293909   a   2  2a 10.00 14.6933913 3.3294688 -1.953953 
16 -6.333657 6.952741   b   2  2b 1.00 10.4536476 0.8931386 10.007078 
17 -5.070164 7.775844   b   2  2b 3.25 11.4584286 0.8931386 10.007078 
18 -4.705420 8.273034   b   2  2b 5.50 12.4632095 0.8931386 10.007078 
19 -2.708278 8.651205   b   2  2b 7.75 13.4679905 0.8931386 10.007078 
20 -2.428970 8.894535   b   2  2b 10.00 14.4727715 0.8931386 10.007078 
+0

感謝の男私は実際にそれをappriciate。私の実際のデータをさらにチェックしてみましょう。 – Alexander

+0

@Alexander確かにnpの歓声 –

+0

こんにちは私は私の実際のデータとこの再現可能な例についての問題を発見しました。期待しているのは 'group_by(big_group、small_group) 'なので、予測とフィッティングの係数は各小グループの内部で異なるはずです。私はこのコードはそれを提供していないと思う。 – Alexander

関連する問題