You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

semopy中使用分类数据拟合模型时出现IndexError的问题咨询

semopy中使用分类数据拟合模型时出现IndexError的问题咨询

我是第一次使用semopy(之前更熟悉R语言里的lavaan工具)。我已经能在连续正态分布的数据上顺利使用predict方法处理缺失值(不管是单个还是多个缺失值),用的是semopy官网提供的示例代码。但现在在处理分类数据时,使用predict方法遇到了瓶颈。

我用了一个示例数据集,尝试把其中的x1、x2和x3变量当作分类变量来处理,具体代码如下:

import semopy
import pandas as pd
dat = semopy.examples.political_democracy.get_data()
dat = dat.round() # make all scores integers

# Convert ordinal variables to categories
ordinal_vars = ['x1', 'x2', 'x3']
for col in ordinal_vars:
    dat[col] = dat[col].astype('category')

# model syntax
mod = '''# measurement model
ind60 =~ x1 + x2 + x3
dem60 =~ y1 + y2 + y3 + y4
dem65 =~ y5 + y6 + y7 + y8
# regressions
dem60 ~ ind60
dem65 ~ ind60 + dem60
# residual correlations
y1 ~~ y5
y2 ~~ y4 + y6
y3 ~~ y7
y4 ~~ y8
y6 ~~ y8
# DEFINE(ordinal) y1 y2 y3 y4 y5 y6 y7 y8 x1 x2 x3 # i only treat x1-3 as ordinal instead
DEFINE(ordinal) x1 x2 x3
'''

# generate missing value
i, v = 0, 'x1'
x = dat[v].values[i]

dat[v].values[i] = float('nan')

# fit model
fitmod = semopy.Model(mod)
fitmod.fit(dat, method = 'DWLS')

运行后我收到了如下错误信息:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[1], line 42
     38 # print(dat)
     39 
     40 # fit model
     41 fitmod = semopy.Model(mod)
---> 42 fitmod.fit(dat, method = 'DWLS')
     43 preds = fitmod.predict(dat)
     44 print(preds)

File /opt/anaconda3/lib/python3.11/site-packages/semopy/model.py:1097, in Model.fit(self, data, cov, obj, solver, groups, clean_slate, regularization, n_samples, **kwargs)
   1054 def fit(self, data=None, cov=None, obj='MLW', solver='SLSQP', groups=None,
   1055         clean_slate=False, regularization=None, n_samples=None, **kwargs):
   1056     """
   1057     Fit model to data.
   1058 
   (...)
   1095 
   1096     """
-> 1097     self.load(data=data, cov=cov, groups=groups,
   1098               clean_slate=clean_slate, n_samples=n_samples)
   1099     if obj == 'FIML':
   1100         if not hasattr(self, 'mx_data'):

File /opt/anaconda3/lib/python3.11/site-packages/semopy/model.py:1038, in Model.load(self, data, cov, groups, clean_slate, n_samples)
   1036     raise KeyError('Variables {} are missing from data.'.format(t))
   1037 if data is not None:
-> 1038     self.load_data(data, covariance=cov, groups=groups)
   1039 else:
   1040     self.load_cov(cov)

File /opt/anaconda3/lib/python3.11/site-packages/semopy/model.py:901, in Model.load_data(self, data, covariance, groups)
    899 else:
    900     inds = [obs.index(v) for v in self.vars['ordinal']]
--> 901     self.load_cov(hetcor(self.mx_data, inds))
    902 self.n_samples, self.n_obs = self.mx_data.shape

File /opt/anaconda3/lib/python3.11/site-packages/semopy/polycorr.py:267, in hetcor(data, ords, nearest)
    265 c_z = {v: (data[v] - c_means[v]) / c_vars[v] for v in conts}
    266 c_pdfs = {v: norm.logpdf(data[v], c_means[v], c_vars[v]) for v in conts}
--> 267 o_ints = {v: estimate_intervals(data[v]) for v in ords}
    269 for c, o in product(conts, ords):
    270     cov[c][o] = polyserial_corr(data[c], data[o], x_mean=c_means[c],
    271                                 x_var=c_vars[c], x_z=c_z[c],
    272                                 x_pdfs=c_pdfs[c], y_ints=o_ints[o])

File /opt/anaconda3/lib/python3.11/site-packages/semopy/polycorr.py:267, in <dictcomp>(.0)
    265 c_z = {v: (data[v] - c_means[v]) / c_vars[v] for v in conts}
    266 c_pdfs = {v: norm.logpdf(data[v], c_means[v], c_vars[v]) for v in conts}
--&gt; 267 o_ints = {v: estimate_intervals(data[v]) for v in ords}
    269 for c, o in product(conts, ords):
    270     cov[c][o] = polyserial_corr(data[c], data[o], x_mean=c_means[c],
    271                                 x_var=c_vars[c], x_z=c_z[c],
    272                                 x_pdfs=c_pdfs[c], y_ints=o_ints[o])

File /opt/anaconda3/lib/python3.11/site-packages/semopy/polycorr.py:95, in estimate_intervals(x, inf)
     93 sz = len(x_f)
     94 cumcounts = np.cumsum(counts[:-1])
---&gt; 95 u = [np.where(u == sample)[0][0] + 1 for sample in x]
     96 return list(chain([-inf], (norm.ppf(n / sz) for n in cumcounts), [inf])), u

File /opt/anaconda3/lib/python3.11/site-packages/semopy/polycorr.py:95, in <listcomp>(.0)
     93 sz = len(x_f)
     94 cumcounts = np.cumsum(counts[:-1])
---&gt; 95 u = [np.where(u == sample)[0][0] + 1 for sample in x]
     96 return list(chain([-inf], (norm.ppf(n / sz) for n in cumcounts), [inf])), u

IndexError: index 0 is out of bounds for axis 0 with size 0

我不太理解这个错误的具体含义,虽然查过相关问题,但还是没能解决我的情况。而且我对Python相对陌生,会不会是我忽略了一些基础的语法错误?或者是不是semopy目前还不支持对分类数据使用predict方法?

备注:内容来源于stack exchange,提问作者ambiguditi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:00:33