【问题标题】:Plotting exponential function returns excess lines绘制指数函数返回多余的线
【发布时间】:2019-07-31 04:39:29
【问题描述】:

我正在尝试对一组数据进行非线性回归。但是,绘制时,R 返回许多不同的线,而这些线应该只有一条。

这个问题只能在一组数据中重现,我看不出这个数据和其他数据有什么明显的区别。

这是我的情节的代码:

plot(df$logFC, df$log_pval, 
  xlim=c(0,11.1), ylim=c(0,11),
  xlab = "logFC", ylab = "p_val")

c <- df$logFC
d <- df$log_pval

model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))

lines(c, predict(model), col = "dodgerblue", lty = 2, lwd = 2)

这是我的数据样本 (df):

logFC   log_pval
4.315   2.788
6.724   9.836
2.925   4.136
5.451   10.836
2.345   1.486
4.219   7.618

我已将问题缩小到模型,但我不确定从那里去哪里。非常感谢任何帮助!

【问题讨论】:

    标签: r plot line nls


    【解决方案1】:

    1) ggplot 方法

    我尝试使用ggplot2 绘制数据图表,我认为输出更符合您的预期...

    library(tibble)
    library(ggplot2)
    library(dplyr)
    
    # Create dataset
    df <- tibble::tribble(~logFC, ~log_pval,
                          4.315,   2.788,
                          6.724,   9.836,
                          2.925,   4.136,
                          5.451,   10.836,
                          2.345,   1.486,
                          4.219,   7.618)
    
    
    # Extract some vectors
    c <- df$logFC
    d <- df$log_pval
    
    # Your model
    model <-  nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
    
    # Create second dataset for new plotting
    df2 <- tibble(logFC = c, log_pval =predict(model))
    
    # Plot output
    ggplot() + 
      geom_line(data = df2, aes(x = logFC, y = log_pval)) + 
      geom_point(data = df, aes(x =logFC, y =log_pval)) +
      theme_classic()
    

    2) base 方法

    如果您想坚持使用base,请尝试在绘制线条之前在数据框中排序x 变量:

    plot(df$logFC, df$log_pval, 
         xlab = "logFC", ylab = "p_val")
    
    df3 <- tibble(x = df$logFC, y = predict(model)) %>% dplyr::arrange(x)
    lines(df3$x, df3$y, col = "dodgerblue", lty = 1, lwd = 1)
    

    【讨论】:

      【解决方案2】:

      可以通过ggplot实现。如果需要,可以在绘图中添加更多自定义。

      library(ggplot2)
      ggplot(df) + aes(x = logFC, y = log_pval) + geom_point() + 
          geom_line(aes(x = c, y = predict(model)))
      

      数据

      df <- structure(list(logFC = c(4.315, 6.724, 2.925, 5.451, 2.345, 4.219
      ), log_pval = c(2.788, 9.836, 4.136, 10.836, 1.486, 7.618)), class = 
      "data.frame", row.names = c(NA, -6L))
      
      c <- df$logFC
      d <- df$log_pval
      model = nls(d ~ a*exp(b*c), start = list(a = 2,b = 0.1))
      

      【讨论】:

        【解决方案3】:

        感谢 Klink 和 Ronak 的帮助,

        事实证明,问题在于数据没有按大小排序,因此“点”通过预测的 y 轴绘制了无序的 x 轴,导致预测数据之间出现锯齿形。

        因为 ggplot 大概会在绘图前重新排序数据,所以这个问题已经解决了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-21
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-20
          • 2020-04-29
          相关资源
          最近更新 更多