statsmodels:关于 add_constant 的问题
statsmodels: Questions regarding add_constant
我一直在尝试进入 Python 并且一直在使用一些在线课程(我正在使用 Jupyter Notebooks,如果这很重要,以及 Python 3)。其中之一是关于统计模型和回归。据我的统计课程告诉我,你想包括一个拦截(我相信有理由不这样做,但 afaik 这是例外)。
1) 我试着问 google 并偶然发现了一个我不太明白的例子:这是一个 example from the statsmodels site:
import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
results.params
我明白他们在这里做什么。但是,只是为了尝试一些事情,我想我应该省略拦截:
import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
model = sm.OLS(Y,X)
results = model.fit()
results.params
问题一:这returns一个错误:ValueError Traceback (most recent call last) <ipython-input-3-c8dfe3eb8b44> in <module>
。它指向第 model = sm.OLS(Y,X)
行的错误 - 为什么?
2a) 这是课程中的代码:
这是关于根据多个变量(里程、气缸、车门)预测汽车的价格
import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)
print (X)
est = sm.OLS(y, X).fit()
est.summary()
问题二:这个好像可以,但是也returns报错:"A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead" -这意味着什么?它只是来自 pandas 的警告,以警告潜在的语法错误,as this discussion seems to suggest?
2b) 带有截距的相同代码:
import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X = sm.tools.tools.add_constant(X)
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)
print (X)
est = sm.OLS(y, X).fit()
est.summary()
问题 3: 与未添加常量的模型相比,系数没有变化 - 我做错了什么?另外,当执行 print(X)
时,常量被列为 1
观察,那是因为它基本上是一个占位符吗?但是为什么不为0呢?
问题 4: 继续讨论我不理解的话题:当标准化应用 scale.fit_transform
, 常量加在它之前还是之后有关系吗?
如果有人可以帮助我解决这些问题中的任何一个,我将不胜感激。
我认为这个答案会有所帮助,如果有任何遗漏或错误,请告诉我。
问题 1 - 在 python 范围内是一个不可变的可迭代对象,可让您迭代它们,它不会生成列表。
>>> range(1)
range(0, 1)
>>> type(range(1))
<class 'range'>
您可以在 for loop.But 中使用范围,您不能将其用作列表 object.You 需要从范围对象获取列表并适合 OLS。
X = list(range(1,8))
问题 2 - 这意味着当你有一个数据帧的子集,你想修改原始数据帧的特定值,但它会更新子集而不是原始数据框或副 versa.read 更多 link
https://www.dataquest.io/blog/settingwithcopywarning/
问题 3 - 常量表示直线与 y-axis.For 交叉的位置 假设您有 3 个线性函数。
1) y = 3x + 5
2) y = 3x - 5
3) y = 3x + 0
在这 3 个函数中,系数为 3,常量为 +5、-5,0.Which 表示所有函数的斜率相同,但与 y 轴的交叉点不同。
问题 4 - 标准化中心和 0 周围的特征,标准偏差为 1.If 你标准化一个常量数组它将是 zero.because均值等于 constant.So 我认为您应该在标准化后添加常量。
Xchanged=(X−μ)/σ
例子
from sklearn.preprocessing import StandardScaler
x = np.asarray([5]*10, dtype=np.float64)
standardized_data = StandardScaler().fit_transform(x.reshape(-1,1))
输出
array([[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.]])
我一直在尝试进入 Python 并且一直在使用一些在线课程(我正在使用 Jupyter Notebooks,如果这很重要,以及 Python 3)。其中之一是关于统计模型和回归。据我的统计课程告诉我,你想包括一个拦截(我相信有理由不这样做,但 afaik 这是例外)。
1) 我试着问 google 并偶然发现了一个我不太明白的例子:这是一个 example from the statsmodels site:
import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
results.params
我明白他们在这里做什么。但是,只是为了尝试一些事情,我想我应该省略拦截:
import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
model = sm.OLS(Y,X)
results = model.fit()
results.params
问题一:这returns一个错误:ValueError Traceback (most recent call last) <ipython-input-3-c8dfe3eb8b44> in <module>
。它指向第 model = sm.OLS(Y,X)
行的错误 - 为什么?
2a) 这是课程中的代码:
这是关于根据多个变量(里程、气缸、车门)预测汽车的价格
import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)
print (X)
est = sm.OLS(y, X).fit()
est.summary()
问题二:这个好像可以,但是也returns报错:"A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead" -这意味着什么?它只是来自 pandas 的警告,以警告潜在的语法错误,as this discussion seems to suggest?
2b) 带有截距的相同代码:
import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')
%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X = sm.tools.tools.add_constant(X)
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)
print (X)
est = sm.OLS(y, X).fit()
est.summary()
问题 3: 与未添加常量的模型相比,系数没有变化 - 我做错了什么?另外,当执行 print(X)
时,常量被列为 1
观察,那是因为它基本上是一个占位符吗?但是为什么不为0呢?
问题 4: 继续讨论我不理解的话题:当标准化应用 scale.fit_transform
, 常量加在它之前还是之后有关系吗?
如果有人可以帮助我解决这些问题中的任何一个,我将不胜感激。
我认为这个答案会有所帮助,如果有任何遗漏或错误,请告诉我。
问题 1 - 在 python 范围内是一个不可变的可迭代对象,可让您迭代它们,它不会生成列表。
>>> range(1)
range(0, 1)
>>> type(range(1))
<class 'range'>
您可以在 for loop.But 中使用范围,您不能将其用作列表 object.You 需要从范围对象获取列表并适合 OLS。
X = list(range(1,8))
问题 2 - 这意味着当你有一个数据帧的子集,你想修改原始数据帧的特定值,但它会更新子集而不是原始数据框或副 versa.read 更多 link
https://www.dataquest.io/blog/settingwithcopywarning/
问题 3 - 常量表示直线与 y-axis.For 交叉的位置 假设您有 3 个线性函数。
1) y = 3x + 5
2) y = 3x - 5
3) y = 3x + 0
在这 3 个函数中,系数为 3,常量为 +5、-5,0.Which 表示所有函数的斜率相同,但与 y 轴的交叉点不同。
问题 4 - 标准化中心和 0 周围的特征,标准偏差为 1.If 你标准化一个常量数组它将是 zero.because均值等于 constant.So 我认为您应该在标准化后添加常量。
Xchanged=(X−μ)/σ
例子
from sklearn.preprocessing import StandardScaler
x = np.asarray([5]*10, dtype=np.float64)
standardized_data = StandardScaler().fit_transform(x.reshape(-1,1))
输出
array([[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.],
[0.]])