1

ggplot2 の国勢調査データから、年齢対人口規模 (性別別) の棒グラフを作成しました。同様に、fitdistrplus パッケージの「fitdist」関数を使用して、正規化された (すべての年齢ビンで観測された最大人口による) 人口データのワイブル パラメーターを導き出しました。

私がやりたいことは、プロットされたデータを線プロットとして分布に重ねることです。私が試してみました

+ 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 
4

1 に答える 1

1

これは、私が上で提起した元の質問に対する答えです。質問に投稿されたデータと併せて、最初から最後までのソリューション (つまり、プロットする生データ) です。

南アフリカの年齢人口データ (性別による) のワイブル分布への当てはめ (Theresa Cain and Ben Small)

ライブラリをロード

library(MASS)
library(ggplot2)  

データセットのインポート

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

性別ごとの総人口サイズを定義します。これは、すべての年齢ビンにわたる男性/女性の人口全体を合計し、それぞれ「total.male」および「total.female」オブジェクトに配置します

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」は、age_gender2 df の「Age」列の年齢ビン (カテゴリ) から抽出された最小年齢範囲を記述する 1 行 18 列の空の行列です。

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

次の行は、各年齢グループの最初の列の行列 (1 X 18) の各要素に最小年齢を割り当てます。したがって、「for」ループは行列の各列を年齢として割り当てます (HELP: for ループを R に記述します)。

'for' ループの構造 # RULE (かっこ() で指定): 各要素に対して (i) 2 から 'age.groups' オブジェクトで提示された値 (つまり 18) までループする # コマンド (中括弧 { で指定) }): 'age.male' マトリックスの各要素 (i) を取得し、最初の行 (つまり [1、各要素 (つまり [1,i]) ごとに ([1,i]) を実行 / 割り当て ('<-')操作: ((5 X (i 番目の要素 - 1)) - 2.5). この操作は、ビンの「中間」年齢を提供します。

これにより、「age.all」マトリックスの最初の要素 (行、列) に値 2.5 が割り当てられます。

age.all[1,1] <- 2.5 

for(i in 2:age.groups){ 

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

}

この次のコマンド「rep」は、特定のビン内のすべての年齢の (1 X 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 であり、すべての年齢の累積確率を求めるため、現在のビンから前の年齢ビンを減算して、そのビンの確率を求める必要があります。 ) そのビンの予想人口。

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 x 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))
于 2014-01-30T13:22:51.713 に答える