绘制指数函数会返回多余的行

时间:2019-07-31 04:39:29

标签: r plot line nls

我正在尝试将非线性回归拟合到一组数据。但是,在绘制时,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

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

3 个答案:

答案 0 :(得分:2)

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

<code>ggplot</code> output

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)

baseplot

答案 1 :(得分:1)

可以使用ggplot实现。如果需要,可以向该图添加更多自定义。

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

enter image description here

数据

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

答案 2 :(得分:1)

感谢您的帮助Klink和Ronak,

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

由于ggplot可能在绘图之前对数据进行了重新排序,因此此问题已得到解决。