mlogit 给出错误:这两个索引没有定义唯一的观察

Ank*_*wal 5 r mlogit

我的数据框命名longData如下:

  ID Set Choice Apple Microsoft IBM Google Intel HewlettPackard Sony Dell Yahoo Nokia
1  1   1      0     1         0   0      0     0              0    0    0     0     0
2  1   2      0     0         1   0      0     0              0    0    0     0     0
3  1   3      0     0         0   1      0     0              0    0    0     0     0
4  1   4      1     0         0   0      1     0              0    0    0     0     0
5  1   5      0     0         0   0      0     0              0    0    0     0     1
6  1   6      0    -1         0   0      0     0              0    0    0     0     0
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过以下方式在其上运行 mlogit:

logitModel = mlogit(Choice ~ Apple+Microsoft+IBM+Google+Intel+HewlettPackard+Sony+Dell+Yahoo+Nokia | 0, data = longData, shape = "long")
Run Code Online (Sandbox Code Playgroud)

它给出了以下错误:

Error in dfidx::dfidx(data = data, dfa$idx, drop.index = dfa$drop.index,  : 
  the two indexes don't define unique observations
Run Code Online (Sandbox Code Playgroud)

寻找了一段时间后,我发现,这个错误被赋予dfidx在看到这里如下:

z <- data[, c(posid1[1], posid2[1])]
if (nrow(z) != nrow(unique(z)))
    stop("the two indexes don't define unique observations")
Run Code Online (Sandbox Code Playgroud)

但是在调用以下代码时,它运行时没有错误,并给出了两个 idx 的名称,它们可以唯一地标识数据帧中的一行:

dfidx(longData)$idx
Run Code Online (Sandbox Code Playgroud)

这给出了预期的输出:

~~~ indexes ~~~~
   ID Set
1   1   1
2   1   2
3   1   3
4   1   4
5   1   5
6   1   6
7   1   7
8   1   8
9   1   9
10  1  10
indexes:  1, 2 
Run Code Online (Sandbox Code Playgroud)

那么我做错了什么,我看到了一些相关的问题12但找不到我遗漏的东西。

小智 1

看起来您的示例来自这里:https ://docs.displayr.com/wiki/MaxDiff_Analysis_Case_Study_Using_R

该代码似乎已经过时了,我记得它对我有用,但现在不再有效了。

该错误消息是有效的,因为每对(ID,Set)出现多次,每个替代项出现一次。

然而这有效:

# there will be complaint that choice can't be coerced to logical otherwise
longData$Choice <- as.logical(longData$Choice)
# create alternative number (nAltsPerSet is 5 in this example)
longData$Alternative <- 1+( 0:(nrow(longData)-1) %% nAltsPerSet)
# define dataset
mdata <- mlogit.data(data=longData,shape="long", choice="Choice",alt.var="Alternative",id.var="ID")
# model
logitModel = mlogit(Choice ~ Microsoft+IBM+Google+Intel+HewlettPackard+Sony+Dell+Yahoo+Nokia | 0,
                    data = mdata
)

summary(logitModel)

Run Code Online (Sandbox Code Playgroud)