【发布时间】:2018-04-22 14:47:34
【问题描述】:
这个问题与 Python 3 statsmodels 及其一般线性模型类有关。
每当我的内生变量有一个值数组,使得这些值之间的距离超过一个数量级时,GLM 不会收敛并引发异常。这是我的意思的一个编码示例。
import pandas as pd
import pyarrow.parquet as pq
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import math
col = ["a", \
"b", \
"c", \
"d", \
"e", \
"f", \
"g", \
"h"]
df = pd.DataFrame(np.random.randint(low=1, high=100, size=(20, 8)), columns=col)
df["a"] = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
df2 = pd.DataFrame(np.random.randint(low=1, high=100, size=(20, 8)), columns=col)
df2["a"] = np.random.randint(low=10000, high=99999, size=(20, 1))
df3 = pd.DataFrame(np.random.randint(low=1, high=100, size=(20, 8)), columns=col)
df3["a"] = [0.01, \
0.01, \
0.01, \
0.01, \
0.01, \
0.01, \
np.random.randint(low=10000, high=99999), \
0.01, \
0.01, \
0.01, \
0.01, \
0.01, \
np.random.randint(low=10000, high=99999), \
0.01, \
0.01, \
0.01, \
0.01, \
0.01, \
0.01, \
0.01]
try:
actual = df[["a"]]
fml1 = "a ~ log(b) + c + d + e + f + g"
data1 = df[["b", "c", "d", "e", "f", "g"]]
model = sm.GLM(actual, data1, formula=fml1, family=sm.families.Tweedie(link_power=1.1)).fit()
model_pred = model.predict()
print("SUCCESS")
except:
print("FAILURE")
try:
actual = df2[["a"]]
fml1 = "a ~ log(b) + c + d + e + f + g"
data1 = df2[["b", "c", "d", "e", "f", "g"]]
model = sm.GLM(actual, data1, formula=fml1, family=sm.families.Tweedie(link_power=1.1)).fit()
model_pred = model.predict()
print("SUCCESS")
except:
print("FAILURE")
try:
actual = df3[["a"]]
fml1 = "a ~ log(b) + c + d + e + f + g"
data1 = df3[["b", "c", "d", "e", "f", "g"]]
model = sm.GLM(actual, data1, formula=fml1, family=sm.families.Tweedie(link_power=1.1)).fit()
model_pred = model.predict()
print("SUCCESS")
except:
print("FAILURE")
如果您运行此代码,您应该只在最后一组数据上获得异常。为什么是这样?如何让 GLM 收敛?有替代品吗?
【问题讨论】:
标签: python pandas numpy matplotlib statsmodels