【问题标题】:Co variance matrix of a model in pythonpython中模型的协方差矩阵
【发布时间】:2019-02-05 11:41:29
【问题描述】:

在python中求一个拟合模型的协方差矩阵(相当于python中的vcov()(R函数))

lmfit <- lm(formula = Y ~ X, data=Data_df)
lmpred <- predict(lmfit, newdata=Data_df, se.fit=TRUE, interval = "prediction")
std_er <- sqrt(((X0) %*% vcov(lmfit)) %*% t(X0))

试图在 python 中转换上述代码。为此,我需要找到拟合模型的协方差矩阵,即 vcov。 我将无法使用 np.cov() 作为我试图找到模型的协方差矩阵。

我已经使用了 statsmodels.regression.linear_model.OLSResults.cov_params(),但我没有得到与 R 中相同的值。

【问题讨论】:

标签: python r linear-regression statsmodels


【解决方案1】:

scipy ODR代码可以独立计算参数协方差矩阵,这里是摘自我的zunzun.com在线曲线拟合器源码中的一个例子:

from scipy.optimize import curve_fit
import numpy as np
import scipy.odr
import scipy.stats

x = np.array([5.357, 5.797, 5.936, 6.161, 6.697, 6.731, 6.775, 8.442, 9.861])
y = np.array([0.376, 0.874, 1.049, 1.327, 2.054, 2.077, 2.138, 4.744, 7.104])

def f(x,b0,b1):
    return b0 + (b1 * x)


def f_wrapper_for_odr(beta, x): # parameter order for odr
    return f(x, *beta)

parameters, cov= curve_fit(f, x, y)

model = scipy.odr.odrpack.Model(f_wrapper_for_odr)
data = scipy.odr.odrpack.Data(x,y)
myodr = scipy.odr.odrpack.ODR(data, model, beta0=parameters,  maxit=0)
myodr.set_job(fit_type=2)
parameterStatistics = myodr.run()
df_e = len(x) - len(parameters) # degrees of freedom, error
cov_beta = parameterStatistics.cov_beta # parameter covariance matrix from ODR
sd_beta = parameterStatistics.sd_beta * parameterStatistics.sd_beta
ci = []
t_df = scipy.stats.t.ppf(0.975, df_e)
ci = []
for i in range(len(parameters)):
    ci.append([parameters[i] - t_df * parameterStatistics.sd_beta[i], parameters[i] + t_df * parameterStatistics.sd_beta[i]])

tstat_beta = parameters / parameterStatistics.sd_beta # coeff t-statistics
pstat_beta = (1.0 - scipy.stats.t.cdf(np.abs(tstat_beta), df_e)) * 2.0    # coef. p-values

for i in range(len(parameters)):
    print('parameter:', parameters[i])
    print('   conf interval:', ci[i][0], ci[i][1])
    print('   tstat:', tstat_beta[i])
    print('   pstat:', pstat_beta[i])
    print()

print('Covariance matrix:')    
print(cov_beta)

【讨论】:

  • 这里可以包含一个参数多于1个的模型吗?
  • @aerijman 这个模型有两个参数,“b0”和“b1”。所以我的答案是肯定的。
【解决方案2】:

请提供您使用的具体细节。

假设您对数据使用 numpy 数组,则有 numpy.cov estimator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2016-12-08
    • 2012-12-09
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多