我只对一个常数(一列1s)进行稳健的线性回归,而没有外生变量。我可以通过从下面的代码片段中输入等于'xi_list'大小的1的列表来计算模型。
def sigma_and_miu(gvkey, statevar_dict):
statevar_list = statevar_dict[gvkey]
xi_list = [np.log(statevar_list[i]) - np.log(statevar_list[i-1]) for i in range(1, len(statevar_list))]
x = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
y = np.array(xi_list)
rlm_model = sm.RLM(y, x, M=sm.robust.norms.HuberT())
rlm_results = rlm_model.fit()
sigma = np.std(rlm_results.resid * rlm_results.weights)
miudelta = rlm_results.params[0] + (0.5 * sigma ** 2)
return miudelta, sigma
使用以下输入运行此功能。
dict = {1004:[1796.6, 1938.6, 2085.4, 2009.4, 1906.1, 2002.2, 2164.9, 2478.8, 2357.4, 2662.1, 2911.2, 2400.4, 2535.9, 2812.3, 2873.1, 2775.5, 3374.2, 3345.5, 3466.3, 2409.4]}
key = 1004
miu, sigma = sigma_and_miu(key,dict)
但是,我正在寻找一种更具可扩展性的方法。我认为一个解决方案可能是包含一个循环,该循环追加xi_list变量的长度1,但这似乎不是非常有效。
我知道有sm.add_constant(),我试图将这个常量添加到我的'y'变量中,并在sm.RLM()函数中留下'x'空白。这导致无法运行模型。
所以我的问题是,是否有更好的方法来创建1的列表,还是我应该去循环?
答案 0 :(得分:0)
使用基本的numpy向量化计算
e.g。
statevar = np.asarray(statevar_list)
y = np.log(statevar[1:]) - np.log(statevar[:-1])
x = np.ones(len(y))
除此之外:rlm_results
应该具有对估算中使用的标准差的稳健估计作为比例属性。