2

私は自分のデータセットでmethod="loess"を実行するのが好きで、エラーが発生した場合はlmメソッドを試すのが好きです。以下はこれを行うための私のコードですが、それでも失敗しています、何かアイデアはありますか?

df

Date  Duration  Athlete
1/1/2012  60    A
1/2/2012  30    A
1/3/2012  10    B
1/1/2012  5     C
1/2/2012  5     C
1/4/2012  4     C

ggplot(df, aes(Date, Duration, group=Athlete)) + geom_point(position="jitter", size=0.5) +theme_solarized(light = FALSE) +  geom_smooth(method=ifelse(class(try(loess(Duration~Date, df)))=="try-error", "lm","loess"), se=T)

このエラーが発生します:

Error in simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize,  :
  NA/NaN/Inf in foreign function call (arg 2)
In addition: Warning message:
In simpleLoess(y, x, w, span, degree, parametric, drop.square, normalize,  :
  NAs introduced by coercion
Error in function (el, elname)  :
4

2 に答える 2

4

ggplot2statエンジンに渡す平滑化方法を知っておく方がよいと思います。

例えば:

mym <- "loess"
tryCatch(loess(Duration~Date, dat), 
         error = function(e) mym <<- "lm")

それで

ggplot(dat, aes(Date, Duration, group=Athlete)) + 
  geom_point(position="jitter", size=0.5) + 
  geom_smooth(method=mym, se=T)
于 2012-12-14T17:00:06.463 に答える
3

ggplot2内でこれを実行しようとしてはいけません。geom_smooth実際のモデルフィッティングツールの代わりになることを意図したものではありません。これは、すばやく汚い視覚化を行うための探索ツールです。

代わりに、ggplotの外部でモデルを適合させてから、適合した値をデータフレームに追加し、それをggplotに渡すことができます。

サンプルデータは小さすぎて実際に適切な値を生成できないため、これを実行する方法のスケッチを次に示します。

library(plyr)
dat <- read.table(text = "Date  Duration  Athlete
1/1/2012  60    A
1/2/2012  30    A
1/3/2012  10    B
1/1/2012  6     C
1/2/2012  5     C
1/4/2012  4     C
1/5/2012  3     C
1/6/2012  2.5   C",header = TRUE,sep = "")

dat$Date <- as.Date(dat$Date)
dat$Date1 <- as.integer(dat$Date)
foo <- function(x){
    m <- try(loess(Duration~Date1,data = x),silent = TRUE)
    if (inherits(m,"try-error")){
        m <- lm(Duration~Date,data = x)
    }
    return(m)
}

dlply(dat,.(Athlete),foo)

dlplyを使用する代わりddplyに、単純に近似モデルを返す代わりにx、近似値を含む列をに追加してから、変更されたを返す必要がありxます。

loessその方法が機能しない場合でも、警告メッセージが出力される可能性があります。

于 2012-12-14T17:17:35.850 に答える