R:黄土回归在值10之后生成阶梯状图形,而不是平滑
发生这种情况的可能原因是什么?它总是发生在值10之后 应用回归之前和之后感兴趣区域周围的数据集子集:R:黄土回归在值10之后生成阶梯状图形,而不是平滑,r,ggplot2,regression,loess,R,Ggplot2,Regression,Loess,发生这种情况的可能原因是什么?它总是发生在值10之后 应用回归之前和之后感兴趣区域周围的数据集子集: 这是我用来生成图形的ggplot2调用。使用的平滑范围为0.05 dat <- read.csv("before_loess.csv", stringsAsFactors = FALSE) smoothed.data <- applyLoessSmooth(dat, 0.05) # dat is the dataset before being smoothed
ggplot2
调用。使用的平滑范围为0.05
dat <- read.csv("before_loess.csv", stringsAsFactors = FALSE)
smoothed.data <- applyLoessSmooth(dat, 0.05) # dat is the dataset before being smoothed
scan.plot.data <- melt(smoothed.data, id.vars = "sample.diameters", variable.name = 'series')
scan.plot <- ggplot(data = scan.plot.data, aes(sample.diameters, value)) +
geom_line(aes(colour = series)) +
xlab("Diameters (nm)") +
ylab("Concentration (dN#/cm^2)") +
theme(plot.title = element_text(hjust = 0.5))
dat第一个问题很简单,您的数据被四舍五入到三位有效数字。低于10时,x轴上的值scan.plot.data$sample.diameters
以0.01的增量增加,这会在图表上生成平滑的曲线,但在10后,它们以0.1的增量增加,在图表上显示为可见的步长
第二个问题是,您应该根据sample.diameters
的值进行回归,而不是根据行号id
进行回归。我认为这会导致x的每个不同值都有多个平滑值,因此需要执行步骤。下面是对您的函数的一些建议小修改
applyLoessSmooth <- function(raw.data, smoothing.span) {
raw.data <- raw.data[complete.cases(raw.data),]
vars <- colnames(raw.data)
vars <- vars[vars != "sample.diameters"] #you are regressing against this, so exclude it from vars
loess.filter <- function (x, given.data, span) loess(
formula = as.formula(paste(x, "sample.diameters", sep = "~")), #not 'id'
data = given.data,
degree = 1,
span = span)$fitted
loess.graph.data <- as.data.frame(lapply(vars, loess.filter, given.data = raw.data,
span = smoothing.span),
col.names = vars) #final argument edited
loess.graph.data$sample.diameters <- raw.data$sample.diameters #simplified
return(loess.graph.data)
}
ApplyLessSmooth之前和之后的数据完全相同,因此根本没有平滑或转换…抱歉!我复制粘贴了错误的数据集。请再次检查。我还添加了一个指向.csv文件的链接,以获取可用于复制图形的可用数据集。您使用的span
?0.05的值是多少。我会把它添加到帖子中。谢谢你的详细解释!
applyLoessSmooth <- function(raw.data, smoothing.span) {
raw.data <- raw.data[complete.cases(raw.data),]
vars <- colnames(raw.data)
vars <- vars[vars != "sample.diameters"] #you are regressing against this, so exclude it from vars
loess.filter <- function (x, given.data, span) loess(
formula = as.formula(paste(x, "sample.diameters", sep = "~")), #not 'id'
data = given.data,
degree = 1,
span = span)$fitted
loess.graph.data <- as.data.frame(lapply(vars, loess.filter, given.data = raw.data,
span = smoothing.span),
col.names = vars) #final argument edited
loess.graph.data$sample.diameters <- raw.data$sample.diameters #simplified
return(loess.graph.data)
}
dat.melt <- melt(dat, id.vars = "sample.diameters", variable.name = 'series')
ggplot(data = dat.melt, aes(sample.diameters, value, colour=series)) +
geom_smooth(method="loess", span=0.05, se=FALSE)