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} --> 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]) ---> 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]) ---> 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
相关产品推荐
相关产品推荐

