построить линию средней у для каждого х в г - PullRequest
0 голосов
/ 16 ноября 2018
Например,

, давайте использовать данные по озону из airquality У меня есть дискретные значения x (Ветер) и y (Озон).некоторые из значений y в озоне имеют одинаковые значения x, поэтому я хочу взять среднее значение этих значений y и построить график.например,

(5, 10)

(5, 20)

(5, 40)

мы бы построили (5, 23,33).Я сделал бы это для всех значений x и соединил бы их все.

Я пробовал это, но я почему-то не вижу строки ..

data(airquality)
plot(Ozone ~ Wind, data = airquality)
lines(weighted.mean(airquality$Ozone, airquality$Wind))

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я не совсем уверен, что это то, что вы ищете.

Поскольку Wind является непрерывным, если мы хотим сгруппировать его, нам придется как-то его дискретизировать.Я решил сделать это, сгруппировав Wind по квантилю, или, точнее, по децилям.Затем я вычислил среднее значение Ozone, сгруппированное по этим Wind квантилям.

data(airquality)

br <- quantile(airquality$Wind, seq(0, 1, length=11))

mid <- br[-length(br)] + diff(br)/2

wind.bin <- cut(airquality$Wind, breaks=br)

agg.oz <- aggregate(airquality$Ozone, list(wind.bin), mean, na.rm=TRUE)

colnames(agg.oz) <- c("Wind.mean", "Ozone.mean")
agg.oz[1] <- mid

plot(Ozone ~ Wind, data=airquality, pch=16, cex=0.6)
abline(v=br, col="#00000022", lty=2)
lines(agg.oz, col="red", type="o", pch=16)
legend("topright", legend="Mean ozone by \nwind quantile", 
  col="red", lwd=1.1, bty="n", cex=0.8)

enter image description here

Если вы настаиваете на лечении Windв качестве дискретных значений вы можете сделать это следующим образом

data(airquality)

airquality <- airquality[complete.cases(airquality),]

agg.oz <- aggregate(Ozone ~ Wind, data=airquality, mean, na.rm=TRUE)

colnames(agg.oz) <- c("Wind.mean", "Ozone.mean")

plot(Ozone ~ Wind, data=airquality, pch=16, cex=0.6)
lines(agg.oz, col="red", type="o", pch=16)

enter image description here

0 голосов
/ 16 ноября 2018

Непонятно, почему вы используете weighted.mean.Однако вы можете понять, почему нет строки:

weighted.mean(airquality$Ozone, airquality$Wind)
[1] NA

При добавлении аргумента na.rm = TRUE будет возвращено только одно значение:

weighted.mean(airquality$Ozone, airquality$Wind, na.rm = TRUE)
[1] 34.99825

Возможно, мы будем придерживаться mean длятеперь, пока мы не поймем данные лучше.

Построение сводки по среднему значению довольно просто в ggplot2 с использованием stat_summary:

library(ggplot2)

ggplot(airquality, aes(Wind, Ozone)) + 
  stat_summary(geom = "point", fun.y = mean)

Я бы предложил несколько улучшений:

  • Отображение исходных точек данных, чтобы мы знали, сколько наблюдений вошло в среднее значение
  • с добавлением сглаженной линии

    ggplot(airquality, aes(Wind, Ozone)) + 
      geom_point(color = "grey90") + 
      stat_summary(geom = "point", 
                   fun.y = mean, 
                   color = "red") + 
      geom_smooth()
    

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...