如何在 R 中将 x 轴拆分为十分位数并制作 ggplot
How to split x-axis as decile in R and make ggplot
您好,我想知道如何在 R 中将 x 轴拆分为十分位数并制作 ggplot?
我目前有年龄范围数据和二氧化氮污染数据。这两个数据集共享名为 ward 的相同地理参考。我希望将我的人口统计数据绘制成病房数量相等的分位数(总计 298)。
我在 R 中尝试了分位数回归,其中我使用了以下内容:
library(SparseM)
library(quantreg)
mydata<- read.csv("M:/Desktop10/Test2.csv")
attach(mydata)
Y <- cbind(NO2.value)
X <- cbind(age.0.to.4, age..5.to.9, age.10.to.14, age.15.to.19, age.20.to.24, age.25.to.29, age.30.to.44, age.45.to.59, age.60.to.64, age.65.to.74, age.75.to.84, age.85.to.89, age.above.90)
quantreg.all <- rq(Y ~ X, tau = seq(0.05, 0.95, by = 0.05), data=mydata)
quantreg.plot <- summary(quantreg.all)
plot(quantreg.plot)
但是我得到的不是我期望的,因为y轴不是NO2数据。
附上理想剧情:
非常感谢您的帮助和建议。
如果我理解你的问题,我认为 cut
函数与 quantile
函数相结合将创建十分位数。这是一个假数据的例子。
在下面的代码中,我们使用 cut
函数将数据分成十分位数,并使用 quantile
函数为 cut
设置 breaks
参数.这告诉 cut
将数据分成大小相等的 10 组,从 NO2
的最小值到最大值。
group_by(age)
表示我们为每个 age
组分别创建十分位数。这意味着在给定年龄组的每个十分位内有相同数量的受试者,但每个十分位的 NO2 临界值对于不同的年龄组是不同的。要在整个数据上创建十分位数,只需删除 group_by(age)
。这将导致所有年龄组的每个十分位具有相同的 NO2 临界值,但在给定年龄组内,每个十分位的受试者数量将不同。
library(tidyverse)
# Fake data
set.seed(2)
dat = data.frame(NO2=c(runif(600, 0, 10), runif(400, 1, 11)),
age=rep(c("0-10","11-20"), c(600,400)))
# Create decile groups
dat = dat %>%
group_by(age) %>%
mutate(decile = cut(NO2, breaks=quantile(NO2, probs=seq(0,1,0.1)),
labels=10:1, include.lowest=TRUE),
decile = fct_rev(decile))
现在我们使用 ggplot2
绘图。 stat_summary
函数 returns 每个 age
组中每个 decile
的平均值。
ggplot(dat, aes(decile, NO2, colour=age, group=age)) +
stat_summary(fun.y=mean, geom="line") +
stat_summary(fun.y=mean, geom="point") +
expand_limits(y=0) +
theme_bw()
您好,我想知道如何在 R 中将 x 轴拆分为十分位数并制作 ggplot?
我目前有年龄范围数据和二氧化氮污染数据。这两个数据集共享名为 ward 的相同地理参考。我希望将我的人口统计数据绘制成病房数量相等的分位数(总计 298)。
我在 R 中尝试了分位数回归,其中我使用了以下内容:
library(SparseM)
library(quantreg)
mydata<- read.csv("M:/Desktop10/Test2.csv")
attach(mydata)
Y <- cbind(NO2.value)
X <- cbind(age.0.to.4, age..5.to.9, age.10.to.14, age.15.to.19, age.20.to.24, age.25.to.29, age.30.to.44, age.45.to.59, age.60.to.64, age.65.to.74, age.75.to.84, age.85.to.89, age.above.90)
quantreg.all <- rq(Y ~ X, tau = seq(0.05, 0.95, by = 0.05), data=mydata)
quantreg.plot <- summary(quantreg.all)
plot(quantreg.plot)
但是我得到的不是我期望的,因为y轴不是NO2数据。
附上理想剧情:
非常感谢您的帮助和建议。
如果我理解你的问题,我认为 cut
函数与 quantile
函数相结合将创建十分位数。这是一个假数据的例子。
在下面的代码中,我们使用 cut
函数将数据分成十分位数,并使用 quantile
函数为 cut
设置 breaks
参数.这告诉 cut
将数据分成大小相等的 10 组,从 NO2
的最小值到最大值。
group_by(age)
表示我们为每个 age
组分别创建十分位数。这意味着在给定年龄组的每个十分位内有相同数量的受试者,但每个十分位的 NO2 临界值对于不同的年龄组是不同的。要在整个数据上创建十分位数,只需删除 group_by(age)
。这将导致所有年龄组的每个十分位具有相同的 NO2 临界值,但在给定年龄组内,每个十分位的受试者数量将不同。
library(tidyverse)
# Fake data
set.seed(2)
dat = data.frame(NO2=c(runif(600, 0, 10), runif(400, 1, 11)),
age=rep(c("0-10","11-20"), c(600,400)))
# Create decile groups
dat = dat %>%
group_by(age) %>%
mutate(decile = cut(NO2, breaks=quantile(NO2, probs=seq(0,1,0.1)),
labels=10:1, include.lowest=TRUE),
decile = fct_rev(decile))
现在我们使用 ggplot2
绘图。 stat_summary
函数 returns 每个 age
组中每个 decile
的平均值。
ggplot(dat, aes(decile, NO2, colour=age, group=age)) +
stat_summary(fun.y=mean, geom="line") +
stat_summary(fun.y=mean, geom="point") +
expand_limits(y=0) +
theme_bw()