我有这个data.frame:http://sprunge.us/TMGS,我想计算loess
的{{1}},所以我从整个数据集中得到一条曲线。但是每个小组(Intermediate.MAP.Score ~ x
)应该和其他小组一样,我不确定如果我在整个name
上调用loess
会发生什么。我是否需要每组呼叫一次并将它们组合起来?如果是,我该怎么做?
答案 0 :(得分:2)
如果你想平均我之前对另一个问题的答案中产生的'loess.fits'中的所有值,你会得到一个答案。如果你想在整个数据集上得到一个loess
拟合(至少在我解释那个短语时不符合你的“相等权重”规范),你会得到另一个答案。
这将在[0,1]范围内的'x'的51个等距数据值处产生平均'yhat'值。由于缺少值,它可能不是完全“同等加权”,而是仅在极端情况下。估计在其他地方很密集:
apply( as.data.frame(loess.fits), 1, mean, na.rm=TRUE)
早些时候回答: 我的标题是“黄土分数被分组”:
plot(dat$x, dat$Intermediate.MAP.Score, col=as.numeric(factor(dat$name)) )
如果继续使用loess(Intermediate.MAP.Score ~ x, data=dat)
,您将获得整体平均值,而不区分群组。并且黄土在其公式中不接受因子或字符参数。您需要按“名称”拆分并单独计算。另一个需要避免的是绘制默认限制,这将限制不同的数据范围:
loess.fits <- lapply(split(dat, dat$name), function(xdf) {
list( yhat=predict( loess(Intermediate.MAP.Score ~ x,
data=xdf[ complete.cases(
xdf[ , c("Intermediate.MAP.Score", "x") ]
),
] ) ,
newdata=data.frame(x=seq(0,1,by=0.02))))})
plot(dat$x, dat$Intermediate.MAP.Score,
col=as.numeric(factor(dat$name)),
ylim=c(0.2,1) )
lapply(loess.fits, function(xdf) { par(new=TRUE);
# so the plots can be compared to predictions
plot(x= seq(0,1,by=0.02), y=xdf$yhat,
ylab="", xlab="",
ylim=c(0.2,1), axes=FALSE) })