分组黄土分数

时间:2012-03-28 19:48:36

标签: r

我有这个data.frame:http://sprunge.us/TMGS,我想计算loess的{​​{1}},所以我从整个数据集中得到一条曲线。但是每个小组(Intermediate.MAP.Score ~ x)应该和其他小组一样,我不确定如果我在整个name上调用loess会发生什么。我是否需要每组呼叫一次并将它们组合起来?如果是,我该怎么做?

1 个答案:

答案 0 :(得分:2)

如果你想平均我之前对另一个问题的答案中产生的'loess.fits'中的所有值,你会得到一个答案。如果你想在整个数据集上得到一个loess拟合(至少在我解释那个短语时不符合你的“相等权重”规范),你会得到另一个答案。

这将在[0,1]范围内的'x'的51个等距数据值处产生平均'yhat'值。由于缺少值,它可能不是完全“同等加权”,而是仅在极端情况下。估计在其他地方很密集:

apply( as.data.frame(loess.fits), 1, mean, na.rm=TRUE)

enter image description here

早些时候回答: 我的标题是“黄土分数被分组”:

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) })

enter image description here