如果您想对我之前对另一个问题的回答中产生的“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 在其公式中不接受因子或字符参数。您需要按“名称”拆分并单独计算。另一个要避免的问题是绘制默认限制,这些限制将驱动不同的数据范围:
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) })