class尝试在ggplot中返回错误

时间:2012-12-14 16:36:30

标签: r ggplot2

我喜欢在我的数据集上运行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)  :

2 个答案:

答案 0 :(得分:4)

我认为最好知道传递给ggplot2 stat引擎的平滑方法。

例如:

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)

答案 1 :(得分: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打印出警告消息。