2016-05-21 11 views
2

filter()をpredict.gam()の の結果に、次にggplot()の予測のサブセットに使用できない理由を突き止めています。私は 予測ステップが実際に問題の一部であるとは確信していませんが、それはエラーを引き起こすのにかかるのですか です。ただfilter() %>% ggplot()と のdataframeがうまくいきます。filter()からggplot()にpredict()出力をパイプすることができません。

library(dplyr) 
library(ggplot2) 
library(mgcv) 

gam1 <- gam(Petal.Length~s(Petal.Width) + Species, data=iris) 

nd <- expand.grid(Petal.Width = seq(0,5,0.05), 
       Species = levels(iris$Species), 
       stringsAsFactors = FALSE) 
predicted <- predict(gam1,newdata=nd) 
predicted <- cbind(predicted,nd) 
filter(tbl_df(predicted), Species == "setosa") %>% 
    ggplot(aes(x=Petal.Width, y = predicted)) + 
    geom_point() 

## Error: length(rows) == 1 is not TRUE 

しかし:

filter(tbl_df(predicted), Species == "setosa") 

## Source: local data frame [101 x 3] 
## 
## predicted Petal.Width Species 
## (dbl[10])  (dbl) (chr) 
## 1 1.294574  0.00 setosa 
## 2 1.327482  0.05 setosa 
## 3 1.360390  0.10 setosa 
## 4 1.393365  0.15 setosa 
## 5 1.426735  0.20 setosa 
## 6 1.460927  0.25 setosa 
## 7 1.496477  0.30 setosa 
## 8 1.533949  0.35 setosa 
## 9 1.573888  0.40 setosa 
## 10 1.616810  0.45 setosa 
## ..  ...   ...  ... 

そしてので問題はfilter()です:私もオブジェクトにフィルタの結果を保存し、使用してみました

pick <- predicted$Species == "setosa" 
ggplot(predicted[pick,],aes(x=Petal.Width, y = predicted)) + 
    geom_point() 

Nice plot of gam prediction

それは直接ggplot()にありますが、それは同じエラーがあります。

回避策があるので、明らかに危機ではありませんが、私の精神的な の使用方法のモデルは明らかに間違っています!どんな洞察力も多く に感謝します。

編集:私が最初に投稿したとき、私はまだR 3.2.3を使用していましたが、ggplot2とdplyrから警告を受けていました。だから私は3.3.0にアップグレードし、それはまだ起こっている。

## R version 3.3.0 (2016-05-03) 
## Platform: x86_64-w64-mingw32/x64 (64-bit) 
## Running under: Windows 10 x64 (build 10586) 
## 
## locale: 
## [1] LC_COLLATE=English_United States.1252 
## [2] LC_CTYPE=English_United States.1252 
## [3] LC_MONETARY=English_United States.1252 
## [4] LC_NUMERIC=C       
## [5] LC_TIME=English_United States.1252  
## 
## attached base packages: 
## [1] stats  graphics grDevices utils  datasets methods base  
## 
## other attached packages: 
## [1] mgcv_1.8-12 nlme_3.1-127 ggplot2_2.1.0 dplyr_0.4.3 
## 
## loaded via a namespace (and not attached): 
## [1] Rcpp_0.12.3  knitr_1.11  magrittr_1.5  munsell_0.4.2 
## [5] colorspace_1.2-6 lattice_0.20-33 R6_2.1.1   stringr_1.0.0 
## [9] plyr_1.8.3  tools_3.3.0  parallel_3.3.0 grid_3.3.0  
## [13] gtable_0.1.2  DBI_0.3.1  htmltools_0.2.6 lazyeval_0.1.10 
## [17] yaml_2.1.13  assertthat_0.1 digest_0.6.8  Matrix_1.2-6  
## [21] formatR_1.2  evaluate_0.7.2 rmarkdown_0.9.5 labeling_0.3  
## [25] stringi_1.0-1 scales_0.3.0 

答えて

4

predict()呼び出しが数値ベクトルではなく名前付き配列を生成するため、問題が発生します。

class(predicted$predicted) 
# [1] "array" 

最初filter()は、あなたの表面上の正しい出力が得られますが、あなたが出力を調べる場合は、列predictedはまだネストされた配列のいくつかの並べ替えであることがわかります。これとは対照的に

str(filter(tbl_df(predicted), Species == "setosa")) 
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 101 obs. of 3 variables: 
$ predicted : num [1:303(1d)] 1.29 1.33 1.36 1.39 1.43 ... 
    ..- attr(*, "dimnames")=List of 1 
    .. ..$ : chr "1" "2" "3" "4" ... 
$ Petal.Width: num 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 ... 
$ Species: chr "setosa" "setosa" "setosa" "setosa" ... 

、古き良き論理サブセットは、すべての次元で仕事をしていません:

str(predicted[pick,]) 
'data.frame': 101 obs. of 3 variables: 
$ predicted : num [1:101(1d)] 1.29 1.33 1.36 1.39 1.43 ... # Now 101 obs here too 
    ..- attr(*, "dimnames")=List of 1 
    .. ..$ : chr "1" "2" "3" "4" ... 
$ Petal.Width: num 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 ... 
$ Species : chr "setosa" "setosa" "setosa" "setosa" ... 

ですから、数値へpredicted列強制いずれか:

library(dplyr) 
library(ggplot2) 

predicted %>% mutate(predicted = as.numeric(predicted)) %>% 
    filter(Species == "setosa") %>% 
    ggplot(aes(x = Petal.Width, y = predicted)) + 
    geom_point() 

それともsubset()filter()を交換します:

predicted %>% 
    subset(Species == "setosa") %>% 
    ggplot(aes(x = Petal.Width, y = predicted)) + 
    geom_point() 
+0

しかし、なぜfilter()は結果をうまく印刷しますが、それをggplot()に渡すことができませんか? ggplot()は結果が配列b/cクラス(predict [pick、 "predicted"])であることを気にしません)配列であり、私はそのプロットを作ることができます。 – atiretoo

+0

詳細情報を追加して更新してください。 – mtoto

+0

はい、そうです - それはfilter()のバグだと思います。 – atiretoo

関連する問題