2 votes

Calcul d'une ligne de régression à partir d'un quantile donné de valeurs selon la catégorie

J'ai un cadre de données assez énorme (près de 100 000 observations avec environ 40 variables) à partir duquel je veux que ggplot dessine des diagrammes de dispersion avec des lignes lm ou loess. Mais les lignes doivent être calculées uniquement sur la base d'un certain quantile des valeurs des variables de chaque date d'observation. Et je voudrais faire le filtrage ou le sous-ensemble directement dans ggplot sans créer un nouvel objet de données ou un sous-cadre de données à l'avance.

Comme mon cadre de données "réel" serait trop grand, j'ai créé un exemple fictif avec un cadre de données de 144 observations appelé df_Bandvals (Code à la fin de l'article).
Voici la structure suivante, les 25 premières lignes et un nuage de points avec une ligne de loess basée sur TOUTES les observations

> str(df_Bandvals)
'data.frame':   144 obs. of  5 variables:
 $ obsdate      : int  190101 190101 190101 190101 190101 190101 190101 190101 190101 190101 ...
 $ transsect    : chr  "A" "A" "A" "A" ...
 $ PointNr      : num  1 2 3 4 5 6 1 2 3 4 ...
 $ depth        : num  31 31 31 31 31 31 31 31 31 31 ...
 $ Band12plusmin: num  169 241 229 159 221 196 188 216 233 149 ...

> df_Bandvals
    obsdate transsect PointNr depth Band12plusmin
1    190101         A       1    31           169
2    190101         A       2    31           241
3    190101         A       3    31           229
4    190101         A       4    31           159
5    190101         A       5    31           221
6    190101         A       6    31           196
7    190101         B       1    31           188
8    190101         B       2    31           216
9    190101         B       3    31           233
10   190101         B       4    31           149
11   190101         B       5    31           169
12   190101         B       6    31           181
13   190102         A       1     3           356
14   190102         A       2     3           368
15   190102         A       3     3           293
16   190102         A       4     3           261
17   190102         A       5     3           313
18   190102         A       6     3           374
19   190102         B       1     3           327
20   190102         B       2     3           409
21   190102         B       3     3           369
22   190102         B       4     3           334
23   190102         B       5     3           376
24   190102         B       6     3           318
25   190103         A       1    25           183

enter image description here

Le graphique montre profondeur vs. Bande 12plusmin avec une ligne de loess correspondante. Les couleurs des points sont attribuées à la date d'observation respective ( date d'obsolescence ). Chaque date d'observation comprend 12 observations.
Maintenant, ma question de base était : Comment obtenir une ligne de loess basée uniquement sur le quantile inférieur de 50 % ? Bande 12plusmin -valeurs de chaque date d'observation ? Ou en d'autres termes, en se référant au graphique : ggplot ne devrait utiliser que les 6 points inférieurs de chaque couleur pour calculer la ligne.

Et comme mentionné précédemment, j'aimerais effectuer le filtrage ou le sous-ensemble directement dans ggplot sans créer un nouvel objet de données ou un sous-cadre de données à l'avance.

J'ai essayé d'utiliser des sous-ensembles, mais mon problème dans ce cas est que je ne peux pas simplement spécifier une valeur universelle. Bande 12plusmin -car, bien entendu, le seuil de 50 % diffère individuellement pour chaque entreprise. date d'obsolescence -groupe. Je suis assez novice en matière de R et de ggplot, donc, pour l'instant, je n'ai pas réussi à trouver une solution pour ce filtrage de type class-individual-derived-threshold-conditionned. Quelqu'un peut-il m'aider ?

Voici le code du dataframe et du plot

obsdate<-rep(c(190101:190112),each=12, mode=factor)
transsect<-rep(rep(c("A","B"), each=6), 12)
PointNr<-rep(c(1,2,3,4,5,6), times=24)
depth<-rep(c(31,3,25,-9,13,18,7,-10,3,-4,11,21),each=12)
Band12<-rep(c(199,349,225,844,257,231,301,875,378,521,210,246), each=12)
set.seed(13423)
plusminRandom<-round(rnorm(144, mean=0, sd=33))
plusminRandom
Band12plusmin<-Band12+plusminRandom
df_Bandvals<-data.frame(obsdate, transsect, PointNr, depth, Band12plusmin)
str(df_Bandvals)
head(df_Bandvals, 20)

library (ggplot2)

ggplot(data=df_Bandvals, aes(x=depth, y=Band12plusmin))+
  scale_x_continuous(limits = c(-15, 35))+
  scale_y_continuous(limits = c(120, 960))+
  geom_point(aes(color=factor(obsdate)), size=1.5)+
  geom_smooth(method="loess")

1voto

Harrison Jones Points 476

Vous devriez être en mesure d'utiliser le data argument au sein de geom_smooth()

ggplot(data = df_Bandvals, aes(x = depth, y = Band12plusmin)) +
  scale_x_continuous(limits = c(-15, 35)) +
  scale_y_continuous(limits = c(120, 960)) +
  geom_point(aes(color = factor(obsdate)), size = 1.5) +
  geom_smooth(
    data = df_Bandvals %>% 
      group_by(obsdate) %>%
      filter(Band12plusmin < median(Band12plusmin)), 
    method = "loess"
  )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X