关于分组数据、数据转换和mlogit设置的R多项式logit模型

关于分组数据、数据转换和mlogit设置的R多项式logit模型,r,regression,mlogit,R,Regression,Mlogit,我想估计R中多项式logit模型的参数,并想知道如何正确构造数据。我用的是“mlogit”软件包 目的是模拟人们对交通方式的选择。但是,数据集是聚合级别的时间序列,例如: 必须将此数据从分组计数数据重塑为非分组数据。我的方法是为每个人创建三个新行,因此我最终得到的数据集如下所示: 对于每个人在分组数据中的选择,我创建了三个新行,并使用chid将这三行绑定起来 排在一起。我现在要运行: mlogit.data(MyData,choice=“choice”,chid.var=“chid”,alt

我想估计R中多项式logit模型的参数,并想知道如何正确构造数据。我用的是“mlogit”软件包

目的是模拟人们对交通方式的选择。但是,数据集是聚合级别的时间序列,例如:

必须将此数据从分组计数数据重塑为非分组数据。我的方法是为每个人创建三个新行,因此我最终得到的数据集如下所示:

对于每个人在分组数据中的选择,我创建了三个新行,并使用chid将这三行绑定起来 排在一起。我现在要运行: mlogit.data(MyData,choice=“choice”,chid.var=“chid”,alt.var=“mode”)


这是正确的方法吗?还是我误解了chid功能的目的

您试图将价格和时间变量作为模型的一部分吗

如果没有,那么您不需要“未聚合”该数据。直接使用结果计数(甚至使用协变量)是非常好的。我不知道在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)
#假设原始数据帧保存在下面的“df”中
图书馆(nnet)

响应您试图将价格和时间变量作为模型的一部分吗

如果没有,那么您不需要“未聚合”该数据。直接使用结果计数(甚至使用协变量)是非常好的。我不知道在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)
#假设原始数据帧保存在下面的“df”中
图书馆(nnet)

响应您试图将价格和时间变量作为模型的一部分吗

如果没有,那么您不需要“未聚合”该数据。直接使用结果计数(甚至使用协变量)是非常好的。我不知道在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)
#假设原始数据帧保存在下面的“df”中
图书馆(nnet)

响应您试图将价格和时间变量作为模型的一部分吗

如果没有,那么您不需要“未聚合”该数据。直接使用结果计数(甚至使用协变量)是非常好的。我不知道在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)
#假设原始数据帧保存在下面的“df”中
图书馆(nnet)

response很遗憾这是从中迁移过来的,因为你可能会在那里得到更好的答案

mlogit
包需要个人数据,可以接受“宽”或“长”数据。在前者中,每个人有一行指示选择的模式,模式特定变量(在您的示例中为时间和价格)的每个组合都有单独的列。在长格式中,每个个体有n行,其中n是模式数,第二列包含
TRUE
FALSE
,指示每个个体选择的模式,每个模式特定变量有一个附加列。在内部,
mlogit
使用长格式数据集,但您可以提供宽格式,并让
mlogit
为您转换它。在这种情况下,只有两个变量,这可能是更好的选择

由于
mlogit
需要个体,并且您有个体计数,因此处理此问题的一种方法是扩展数据,使每个模式具有适当的行数,用变量组合填充结果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
所以这表明减少1分钟的旅行时间大约值15美元

此分析忽略
month
变量。我不清楚你们将如何合并,因为月份既不是特定于模式,也不是特定于个人。您可以“假装”该月是特定于个人的,并使用如下模型公式:
mode~price+time | month
,但对于您的数据集,系统在计算上是单一的

要再现另一个答案的结果,您可以使用
模式~1 |月
reflevel=“car”
。这忽略了特定于模式的变量,只估计了月份的影响(相对于模式=汽车)


关于
mlogit

有一个很好的教程,很遗憾它是从中迁移来的,因为您可能会在那里得到更好的答案

mlogit
包需要个人数据,可以接受“宽”或“长”数据。在前者中,每个人有一行指示选择的模式,模式特定变量(在您的示例中为时间和价格)的每个组合都有单独的列。在长格式中,每个个体有n行,其中n是模式数,第二列包含
TRUE
FALSE
,指示每个个体选择的模式,每个模式特定变量有一个附加列。在内部,
mlogit
使用长格式数据集,但您可以提供宽格式,并让
mlogit
为您转换它。在这种情况下,只有两个变量,这可能是更好的选择

由于
mlogit
需要个体,并且您有个体计数,因此处理此问题的一种方法是扩展数据,使每个模式具有适当的行数,用变量组合填充结果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
所以这表明减少1分钟的旅行时间大约值15美元

此分析忽略
月份
变量