gpt4 book ai didi

Python线性回归模型(Pandas、statsmodels)-值错误: endog exog matrices size mismatch

转载 作者:行者123 更新时间:2023-11-30 22:13:26 25 4
gpt4 key购买 nike

我的一个 friend 问我这个线性回归代码,我也无法解决,所以现在这也是我的问题。

我们收到错误:ValueError:endog 和 exog 矩阵大小不同

当我从 ind_names 中删除“Tech”时,它工作正常。这可能毫无意义,但为了消除语法错误的可能性,我尝试这样做。

科技和金融行业标签在 DataFrame 中的分布并不均匀,所以这可能会导致大小不匹配?但我无法进一步调试,所以决定问你们。

如果能得到有关错误和解决方案想法的确认,那就太好了。请在下面找到代码。

    #We have a portfolio constructed of 3 randomly generated factors (fac1, fac2, fac3). 
#Python code provides the following message
#ValueError: The indices for endog and exog are not aligned

import pandas as pd
from numpy.random import rand
import numpy as np
import statsmodels.api as sm

fac1, fac2, fac3 = np.random.rand(3, 1000) #Generate random factors

#Consider a collection of hypothetical stock portfolios
#Generate randomly 1000 tickers
import random; random.seed(0)
import string
N = 1000
def rands(n):
choices = string.ascii_uppercase
return ''.join([random.choice(choices) for _ in range(n)])


tickers = np.array([rands(5) for _ in range(N)])
ticker_subset = tickers.take(np.random.permutation(N)[:1000])

#Weighted sum of factors plus noise

port = pd.Series(0.7 * fac1 - 1.2 * fac2 + 0.3 * fac3 + rand(1000), index=ticker_subset)
factors = pd.DataFrame({'f1': fac1, 'f2': fac2, 'f3': fac3}, index=ticker_subset)

#Correlations between each factor and the portfolio
#print(factors.corrwith(port))
factors1=sm.add_constant(factors)


#Calculate factor exposures using a regression estimated by OLS
#print(sm.OLS(np.asarray(port), np.asarray(factors1)).fit().params)

#Calculate the exposure on each industry
def beta_exposure(chunk, factors=None):
return sm.OLS(np.asarray(chunk), np.asarray(factors)).fit().params


#Assume that we have only two industries – financial and tech

ind_names = np.array(['Financial', 'Tech'])
#Create a random industry classification

sampler = np.random.randint(0, len(ind_names), N)
industries = pd.Series(ind_names[sampler], index=tickers, name='industry')
by_ind = port.groupby(industries)



exposures=by_ind.apply(beta_exposure, factors=factors1)
print(exposures)
#exposures.unstack()

#Determinate the exposures on each industry

最佳答案

理解错误消息:

ValueError: endog and exog matrices are different sizes

好吧,还不错。内源基质和外源基质的大小不同。该模块提供了这个 page这说明内生是系统内部的因素外生是系统外部的因素

一些调试

检查我们得到的数组的形状。为此,我们需要拆开该 oneliner 并打印参数的 .shape,或者打印每个参数的前几个。另外,注释掉引发错误的行。因此,我们发现我们得到:

chunk [490]
factor [1000 4]
chunk [510]
factor [1000 4]

哦!就在那里。我们预计因子也会被分块。第一次应该是[490 4],第二次应该是[510 4]。注意:由于类别是随机分配的,因此每次都会有所不同。

所以基本上我们在该函数中拥有太多信息。我们可以使用 block 来查看要选择哪些因素,将因素过滤为这些因素,然后一切都会起作用。

查看文档中的函数定义:

class statsmodels.regression.linear_model.OLS(endog, exog=None, missing='none', hasconst=None, **kwargs)

我们只是传递两个参数,其余的都是可选的。让我们看看我们正在传递的两个。

endog (array-like) – 1-d endogenous response variable. The dependent variable.

exog (array-like) – A nobs x k array where nobs is the number of observations and k is the number of regressors...

啊,又是endogexogendog 类似于一维数组。到目前为止一切顺利,形状 490 有效。 exog nobs? 哦,它的观察数量。所以它是一个二维数组,在本例中,我们需要形状 490 by 4

这个具体问题:

beta_exposure 应该是:

def beta_exposure(chunk, factors=None):
factors = factors.loc[factors.index.isin(chunk.index)]
return sm.OLS(np.asarray(chunk), np.asarray(factors)).fit().params

问题是您将 beta_exposures 应用于列表的每个部分(它是随机的,所以假设 Financial 为 490 个元素,Tech 为 510 个元素),但是factors=factors1 始终为您提供 1000 个值(groupby 代码不会触及该值)。

参见http://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.htmlhttp://www.statsmodels.org/dev/endog_exog.html供我研究此问​​题时使用的引用资料。

关于Python线性回归模型(Pandas、statsmodels)-值错误: endog exog matrices size mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50776985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com