2013-10-15 139 views
1

我已经根据ggplot2中的人口普查数据创建了年龄对人口大小(按性别)的barplot。同样,我已经使用fitdistrplus包中的'fitdist'函数来导出Weibull参数,用于归一化(通过所有年龄段中最大观察人群)人口数据。在geom_bar(ggplot2)分类图中添加拟合的威布尔分布(fitdistr)

我想要做的是将绘制的数据与分布叠加为一条线图。我试过

+ geom_line (denscomp(malefit.w)) 

加上其他许多(不成功)的策略。

任何可以提供的帮助将不胜感激!请找语法附在下面:

数据结构

Order  Age Male Female Total male.norm 
1  1 0 - 5 2870000 2820000 5690000 1.00000000 
2  2 5 - 9 2430000 2390000 4820000 0.84668990 
3  3 10 - 14 2340000 2250000 4590000 0.81533101 
4  4 15 - 19 2500000 2500000 5000000 0.87108014 
5  5 20 - 24 2690000 2680000 5370000 0.93728223 
6  6 25 - 29 2540000 2520000 5060000 0.88501742 
7  7 30 - 34 2040000 1990000 4030000 0.71080139 
8  8 35 - 39 1710000 1760000 3470000 0.59581882 
9  9 40 - 44 1400000 1550000 2950000 0.48780488 
10 10 45 - 49 1200000 1420000 2620000 0.41811847 
11 11 50 - 54 1010000 1210000 2220000 0.35191638 
12 12 55 - 59 812000 985000 1800000 0.28292683 
13 13 60 - 64 612000 773000 1390000 0.21324042 
14 14 65 - 69 402000 556000 958000 0.14006969 
15 15 70 - 74 293000 455000 748000 0.10209059 
16 16 75 - 79 165000 316000 481000 0.05749129 
17 17 80 - 84 101000 222000 323000 0.03519164 
18 18 85 plus 75500 180000 256000 0.02630662 
    female.norm 
1 1.00000000 
2 0.84751773 
3 0.79787234  
4 0.88652482  
5 0.95035461  
6 0.89361702  
7 0.70567376  
8 0.62411348 
9 0.54964539  
10 0.50354610  
11 0.42907801  
12 0.34929078  
13 0.27411348 
14 0.19716312  
15 0.16134752 
16 0.11205674  
17 0.07872340 
18 0.06382979 
+0

,而不是依赖于我们阅读你的心灵有关csv文件是如何构建的。您应该改为使用代码构建一个类似的数据集,以便我们可以看到您在哪里得到错误。 –

+0

谢谢你的建议。我已经通过添加geom_smooth来解决我的原始问题,但已经揭示了另一个问题 - 与我在此提出的问题无关。 –

+1

考虑将您在答案字段中提供给自己问题的“答案”移动的假设。 TKS –

回答

1

这是回答我上面提出的原题。结合在问题中发布的数据,它是一个开始到结束的解决方案(即绘制原始数据)。

配件南非的年龄人口数据(按性别),以威布尔分布(特里萨该隐和Ben小)

加载库

library(MASS) 
library(ggplot2) 

导入数据集

age_gender2 <- read.csv("age_gender2.csv", sep=",", header = T) 

的根据性别确定总人口规模 - 即将所有年龄段的整个男性/女性人口的总和分别放在一个物体“男性”和“女性总人数”中。

total.male <- sum(age_gender2$Male) 
total.female <- sum(age_gender2$Female) 

对象“age.groups”是描述年龄段的数目为“age_gender2” DF

age.groups <- length(age_gender2$Age) 

对象“age.all”是一个单行,单个列向量1行,18列空矩阵,将描述从年龄仓(类别)提取出来的最小年龄范围在“年龄”列从age_gender2 DF

age.all <- matrix(0,1,age.groups) 

下一行分年龄分配给矩阵的每个元素(1 X 18)fo每个年龄组的第一列。因此'for'循环将矩阵的每一列分配为一个年龄(帮助:writing a for loop in R)。对于每个元素(i),从2循环到'age.groups'对象中提供的值(即18)#COMMAND(给定的在大括号{}中):将'age.male'矩阵中的每个元素(i)从第一行开始(即[1,由每个元素(即[1,i])执行/ assign('< - ')执行以下操作:((5 X(iith element - 1)) - 2.5)。此操作提供了“年龄”中的第一个元素(行,列)的“中间”年龄

。''矩阵值2。5

age.all[1,1] <- 2.5 

for(i in 2:age.groups){ 

age.all[1,i] <- ((5*(i)) - 2.5) 

} 

这下一个命令“代表”一个特定箱柜内创建所有年龄段的(1×25190500)矢量

male.data <- rep(age.all,age_gender2$Male) 
female.data <- rep(age.all,age_gender2$Female) 

适合威布尔分布至年龄为男性和女性

male.weib <- fitdistr(male.data, "weibull") 
female.weib <- fitdistr(female.data, "weibull") 


male.shape <- male.weib$estimate[1] 
male.scale <- male.weib$estimate[2] 

female.shape <- female.weib$estimate[1] 
female.scale <- female.weib$estimate[2] 

将中位年龄段的“Age_Median”添加到“age_gender2”df列。需要转置为'age.all'是1行X 18列向量。

age_gender2["Age_Median"] <- t(age.all) 

适合威布尔分布

函数“pweibull”是PDF,发现在所有年龄段的累积概率,因此,我们需要从本斌减去先前的年龄仓(S)找到该箱的概率,并因此(通过乘以总的男性人口)该箱的预期人口。

male.p.weibull <- matrix(0,1,age.groups) 
female.p.weibull <- matrix(0,1,age.groups) 

for (i in 1:age.groups){ 

male.p.weibull[1,i] <- pweibull(age.all[1,i]+2.5, male.shape, male.scale) - pweibull(age.all[1,i]-2.5, male.shape, male.scale) 

} 

for (i in 1:age.groups){ 

female.p.weibull[1,i] <- pweibull(age.all[1,i]+2.5, female.shape, female.scale) - pweibull(age.all[1,i]-2.5, female.shape, female.scale) 

} 

添加栏列出每个年龄仓计算人口 - '转' 到1×18 - > 18 x行1列向量

age_gender2["male.prob"] <- t(male.p.weibull * total.male) 
age_gender2["female.prob"] <- t(female.p.weibull * total.female) 

创建条曲线描述年龄,性别的人口分布

男性(实际数据)以及超强加曲线表示威布尔计算的概率(GGPLOT2)

agp.male <- ggplot(age_gender2, aes(x=reorder(Age, Order), y=Male, fill=Male)) + geom_bar(stat="identity") + theme (axis.text.x=element_text(angle=45, hjust=1)) + xlab("Age Group (5 yr bin)") + ylab("Male Population (M)") + geom_smooth(aes(age_gender2$Age,age_gender2$male.prob, group=1)) 

女性(实际数据)和显示威布尔计算出的机率(GGPLOT2)超级强加的曲线

agp.female <- ggplot(age_gender2, aes(x=reorder(Age, Order), y=Female, fill=Female)) + geom_bar(stat="identity") + theme (axis.text.x=element_text(angle=45, hjust=1)) + xlab("Age Group (5 yr bin)") + ylab("Female Population (M)") + geom_smooth(aes(age_gender2$Age,age_gender2$female.prob, group=1))