我喜欢在我的数据集上运行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) :
答案 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
打印出警告消息。