Ошибка интерпретации категорийных данных: все элементы должны быть хэшируемыми [statsmodel]

Я пытаюсь использовать линейную модель смешанных эффектов из statsmodel. И я получаю сообщение об ошибке:

Error interpreting categorical data: all items must be hashable
    fc ~ group * session
    ^^

Где fc — это столбец в моем фрейме данных, который содержит массив 1D (1x2346). Фрейм данных выглядит так:

      subj group session                                                 fc
0      0     1       1  [0.2922897321426426, 0.8889104138397078, 0.716...
1      0     1       2  [0.2900923963035335, 0.8475482137619675, 0.713...
2      1     1       1  [0.5929015237174594, 0.24248656443213046, 0.26...
3      1     1       2  [0.20802496215095026, 0.9411248464107547, 0.93...

Код:

my_model_fit = smf.mixedlm("fc ~ group * session", df, groups=df["subj"]).fit()
my_model_fit.random_effects
my_model_fit.summary()

Буду признателен за любую помощь :)

сообщение об ошибке и код


person Anastasia Lado    schedule 30.10.2020    source источник
comment
Похоже, вы пытаетесь подобрать векторы (fc) на основе значений группы и сеанса. Я не уверен, что statsmodels может это сделать, но вам может быть проще разбить fc на отдельные столбцы и подогнать каждый из них по отдельности. Это даст тот же эффект, что и установка всего вектора fc.   -  person Matthias Fripp    schedule 30.10.2020


Ответы (1)


Вы должны знать, что списки нельзя хэшировать, потому что они изменяемы. Вы можете использовать кортежи вместо списков, тогда это должно работать. Но я сомневаюсь, что использование категории в качестве типа данных в любом случае является хорошей идеей, потому что, скорее всего, ваши векторы не будут повторяться (у вас вряд ли будет точно такой же вектор в двух строках), и поэтому категория здесь не имеет большого смысла.

Короче говоря, проверьте, действительно ли ваши массивы повторяются, чтобы несколько строк использовали одинаковые значения массива. Если это не так, лучше используйте обычный столбец объектов вместо категории. Тогда также не имеет большого значения, храните ли вы их в виде списков или кортежей. Но если они повторяются несколько раз, вы можете использовать категорию для сохранения пространства, но тогда вместо этого вам следует использовать кортежи.

Проверять:

hash(list([1,2,3]))
hash(tuple([1,2,3]))
person jottbe    schedule 30.10.2020
comment
Большое спасибо за ответ! Похоже, это помогает с начальной ошибкой. Но теперь я получаю новый: endog has evaluated to an array with multiple columns that has shape (52, 52). This occurs when the variable converted to endog is non-numeric (e.g., bool or str). - person Anastasia Lado; 31.10.2020
comment
Я не знаю, что такое эндог, но, возможно, эта статья поможет: stackoverflow.com/questions/64584416/ - person jottbe; 31.10.2020