0

R で多項ロジット モデルのパラメーターを推定したいのですが、データを正しく構造化する方法を知りたいと思っています。「mlogit」パッケージを使用しています。

目的は、人々の交通手段の選択をモデル化することです。ただし、データセットは集計レベルの時系列です。たとえば、次のようになります。

ここに画像の説明を入力

このデータは、グループ化されたカウント データからグループ化されていないデータに再形成する必要があります。私のアプローチは、個人ごとに 3 つの新しい行を作成することなので、最終的には次のようなデータセットになります。

ここに画像の説明を入力

グループ化されたデータの個々の選択ごとに、3 つの新しい行を作成し、chid を使用してこれらの 3 つの行を結合します。私は今実行したい:mlogit.data(MyData、choice = "choice"、chid.var = "chid"、alt.var = "mode")。

これは正しいアプローチですか?または、chid 関数の目的を誤解していますか?

4

2 に答える 2

4

これがstats.stackexchange.comから移行されたのは残念です。なぜなら、おそらくそこでより良い答えが得られたからです。

このmlogitパッケージは、個人に関するデータを想定しており、「ワイド」または「ロング」データのいずれかを受け入れることができます。前者では、選択されたモードを示す個人ごとに 1 つの行があり、モード固有の変数 (例では時間と価格) の組み合わせごとに個別の列があります。長い形式では、すべての個体に対して n 行があり、n はモードの数であり、2 番目の列には各個体に対して選択されたモードが含まれているTRUEFALSE示され、モード固有の変数ごとに 1 つの追加の列があります。内部的にmlogitは、長いフォーマットのデータセットを使用しますが、ワイド フォーマットを提供して、mlogitそれを変換することができます。この場合、変数が 2 つしかないため、これがより適切なオプションである可能性があります。

個人が期待されており、個人の数があるためmlogit、これに対処する 1 つの方法は、データを拡張して各モードに適切な行数を持ち、結果の data.frame に変数の組み合わせを入力することです。以下のコードはそれを行います:

df.agg <- data.frame(month=1:4,car=c(3465,3674,3543,4334),bus=c(1543,2561,2432,1266),bicycle=c(453,234,123,524))
df.lvl <- data.frame(mode=c("car","bus","bicycle"), price=c(120,60,0), time=c(5,10,30))

get.mnth <- function(mnth) data.frame(mode=rep(names(df.agg[2:4]),df.agg[mnth,2:4]),month=mnth)
df <- do.call(rbind,lapply(df.agg$month,get.mnth))
cols <- unlist(lapply(df.lvl$mode,function(x)paste(names(df.lvl)[2:3],x,sep=".")))
cols <- with(df.lvl,setNames(as.vector(apply(df.lvl[2:3],1,c)),cols))
df <- data.frame(df, as.list(cols))
head(df)
#   mode month price.car time.car price.bus time.bus price.bicycle time.bicycle
# 1  car     1       120        5        60       10             0           30
# 2  car     1       120        5        60       10             0           30
# 3  car     1       120        5        60       10             0           30
# 4  car     1       120        5        60       10             0           30
# 5  car     1       120        5        60       10             0           30
# 6  car     1       120        5        60       10             0           30

今、私たちは使用することができますmlogit(...)

library(mlogit)
fit <- mlogit(mode ~ price+time|0 , df, shape = "wide", varying = 3:8)
summary(fit)
#...
# Frequencies of alternatives:
#  bicycle      bus      car 
# 0.055234 0.323037 0.621729 
# 
# Coefficients :
#         Estimate Std. Error t-value  Pr(>|t|)    
# price  0.0047375  0.0003936  12.036 < 2.2e-16 ***
# time  -0.0740975  0.0024303 -30.489 < 2.2e-16 ***
# ...
coef(fit)["time"]/coef(fit)["price"]
#      time 
# -15.64069 

これは、移動時間を 1 (分?) 短縮することは、約 15 (ドル) の価値があることを示唆していますか?

この分析では、month変数は無視されます。月はモード固有でも個人固有でもないため、それをどのように組み込むかは私にはわかりません。その月が個人固有であると「ふりをして」、 :mode ~ price+time|monthのようなモデル式を使用することもできますが、データセットを使用すると、システムは計算上特異になります。

mode ~ 1|month他の回答の結果を再現するには、 withを使用できますreflevel="car"。これは、モード固有の変数を無視し、月の効果を推定するだけです (モード = 車に相対的)。

mlogit ここに素敵なチュートリアルがあります。

于 2015-09-12T21:25:11.553 に答える
0

モデルの一部にしようとしている価格と時間は実際の変数ですか?

そうでない場合は、そのデータを「集計解除」する必要はありません。結果のカウントを直接 (共変量を使用しても) 操作してもまったく問題ありません。mlogitでそれを行う詳細はわかりませんが、multinomを使用すると簡単で、mlogitで可能だと思います:

# Assuming your original data frame is saved in "df" below
library(nnet)
response  <- as.matrix(df[,c('Car', 'Bus', 'Bicycle')])
predictor <- df$Month

# Determine how the multinomial distribution parameter estimates
# are changing as a function of time
fit <- multinom(response ~ predictor)

上記の場合、結果のカウントは、1 つの共変量「月」で直接使用されます。共変量を気にしない場合は、単に使用することもできますmultinom(response ~ 1)が、実際に何をしようとしているのかを言うのは困難です。

ただし、mlogit パッケージの "TravelMode" データとその例をいくつか見てみると、1 人あたりの個別のレコードを本当に使用したい場合は、選択したオプションが正しいと思います。

于 2015-09-12T12:11:33.883 に答える