Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:黄土回归在值10之后生成阶梯状图形,而不是平滑_R_Ggplot2_Regression_Loess - Fatal编程技术网

R:黄土回归在值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

发生这种情况的可能原因是什么?它总是发生在值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

    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)