R - 黄土曲线未通过点正确拟合
R - loess curve not fitted correctly through points
我正在尝试过滤掉太接近或低于黄土曲线的点:
结果如下所示:
显然不是想要的结果。
但是,如果我使用 scatter.smooth 函数,我会得到一条看起来正确的曲线:
如何通过我的数据正确拟合黄土曲线?
主要是检查predict
函数是什么returns:
head(predict(afit))
[1] 0.8548271 0.8797704 0.8584954 0.8031563 0.9012096 0.8955874
它是一个向量,所以当我们将它传递给 lines
时,R
表示 "okay, you didn't specify an x value, so I'll just use the index for the x values"(尝试 plot(2:10)
了解我的意思)。
所以,我们需要做的是指定一个 2 列矩阵传递给 lines
,而不是:
cbind(sort(means), predict(afit, newdata = sort(means)))
应该可以解决问题。你的函数可以写成:
FilterByVariance<-function(dat, threshold = 0.90, span = 0.75){
means <- apply(dat,1,mean)
sds <- apply(dat,1,sd)
cv <- sqrt(sds/means)
afit<-loess(cv~means, span = span)
resids<-afit$residuals
# good<-which(resids >= quantile(resids, probs = threshold))
# points above the curve will have a residual > 0
good <- which(resids > 0)
#plots
plot(cv~means)
lines(cbind(sort(means), predict(afit, newdata = sort(means))),
col="blue",lwd=3)
points(means[good],cv[good],col="red",pch=19)
}
我正在尝试过滤掉太接近或低于黄土曲线的点:
结果如下所示:
显然不是想要的结果。
但是,如果我使用 scatter.smooth 函数,我会得到一条看起来正确的曲线:
如何通过我的数据正确拟合黄土曲线?
主要是检查predict
函数是什么returns:
head(predict(afit))
[1] 0.8548271 0.8797704 0.8584954 0.8031563 0.9012096 0.8955874
它是一个向量,所以当我们将它传递给 lines
时,R
表示 "okay, you didn't specify an x value, so I'll just use the index for the x values"(尝试 plot(2:10)
了解我的意思)。
所以,我们需要做的是指定一个 2 列矩阵传递给 lines
,而不是:
cbind(sort(means), predict(afit, newdata = sort(means)))
应该可以解决问题。你的函数可以写成:
FilterByVariance<-function(dat, threshold = 0.90, span = 0.75){
means <- apply(dat,1,mean)
sds <- apply(dat,1,sd)
cv <- sqrt(sds/means)
afit<-loess(cv~means, span = span)
resids<-afit$residuals
# good<-which(resids >= quantile(resids, probs = threshold))
# points above the curve will have a residual > 0
good <- which(resids > 0)
#plots
plot(cv~means)
lines(cbind(sort(means), predict(afit, newdata = sort(means))),
col="blue",lwd=3)
points(means[good],cv[good],col="red",pch=19)
}