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

我认为最好知道您将哪种平滑方法传递给 ggplot2 统计引擎。

例如:

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 回答