1
votes

Le traçage d'une fonction exponentielle renvoie les lignes en excès

J'essaie d'ajuster une régression non linéaire à un ensemble de données. Cependant, lorsqu'il est tracé, R renvoie de nombreuses lignes différentes là où il ne devrait y en avoir qu'une.

Ce problème n'est reproductible que dans un seul ensemble de données et je ne vois aucune différence évidente entre ces données et d'autres.

Voici le code de mon tracé:

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

Et voici un échantillon de mes données (df):

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)

J'ai réduit le problème au modèle, mais je ne le suis pas sûr où aller à partir de là. Toute aide est grandement appréciée!


0 commentaires

3 Réponses :


1
votes

Cela peut être réalisé avec ggplot . Plus de personnalisation peut être ajoutée au tracé si nécessaire.

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

entrez la description de l'image ici

données

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


0 commentaires

2
votes

1) Méthode ggplot

J'ai essayé de représenter graphiquement les données en utilisant ggplot2 et je pense que le résultat est plus ce que vous attendiez ...

XXX

 <code> ggplot </code> output

2) Méthode base

Si vous voulez vous en tenir à la base essayez de classer les variables x dans le bloc de données avant de tracer les lignes:

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

0 commentaires

1
votes

Merci pour votre aide Klink et Ronak,

Il s'avère que le problème était que les données n'étaient pas classées par taille, et donc, les "points" ont tracé l'axe des x non ordonné par l'axe des y prédit, entraînant un zigzag entre les données prévues.

Étant donné que ggplot réorganise vraisemblablement les données avant le traçage, ce problème a été résolu.


0 commentaires