0

ビン化された国勢調査データを使用してジニ係数を計算しようとすると、いくつかの問題が発生します。助けていただければ幸いです。

私のデータはこのように少し見えます (ただし、13 変数の 14,000 の観測があります)。

location <- c('A','B','C', 'D', 'E', 'F')  
no_income <- c(20, 1, 40, 79, 12, 2)
income1 <- c(13, 4, 56, 17, 9, 4)
income2 <- c(27, 39, 49, 12, 19, 0)
income3 <- c(0, 1, 4, 3, 27, 0)

df <- data.frame(location, no_income, income1, income2, income3)

したがって、観測ごとに場所が指定され、次に、その地域で指定された所得区分内で稼いでいる世帯数を示す一連の列があります (つまり、場所 A では、20 世帯の収入は 0 ドル、13 世帯の収入は 1、27 世帯の収入は 2、0 収入は 3 です)。 )。

結果を返す空の列を作成しました。

df$gini = 0

次に、各収入ビンに使用する収入額を含む数値ベクトル (x) を作成しました。

x <- c(0, 300, 1000, 2000)

私は reldist パッケージ内でジニ関数を使用しようとしており、次の for ループを記述して、データの各行を循環し、ジニ関数を適用して、出力を新しい列に返します。

for (i in 1:nrow(samp)){ 
     w <- samp[i,2:5] 
     df$gini <- gini(x, w=rep(1, length=length(x)))
     }

問題は、返される出力が現在各行で同一であることです。これは明らかに正しくありません。私はこれに比較的慣れていませんが、何が間違っているのかわかりません...

4

1 に答える 1

0

R は操作をベクトル化するため、多くの場合、ループを記述する必要はありません。この場合、関数がどのように機能するかによってそうします。また、コンテナーを初期化する必要がないこともよくあります (必要になる場合もありますが、めったにありません)。

apply を使用して行をループする実際の例を次に示します。

# setup
install.packages("reldist")
library(reldist)

# dummy data
df = data.frame(ID=letters,
    Bin1=rpois(26, 3),
    Bin2=rpois(26, 8),
    Bin3=rpois(26, 1))

inc = c(0, 300, 1000)

# new column with gini
df$gini = apply(df[, 2:4], 1, function(i){
    gini(inc, i)
})

注目に値するのは、引数gini()のデフォルトがであるため、それが必要な場合は、定義する必要はありません。weights=rep(1, length=length(x))

編集: マニュアルで読んだ内容に基づいて、重みを含めることを追加しました: https://cran.r-project.org/web/packages/reldist/reldist.pdf

于 2015-12-02T10:35:03.040 に答える