【问题标题】:How do you test the significance of regression estimated parameters (fitting data)?您如何测试回归估计参数(拟合数据)的显着性?
【发布时间】:2022-01-05 03:01:24
【问题描述】:

我创建了一个回归模型,试图拟合我的数据(x:年份,y:汽车数量)。而现在我感到很沮丧。如何评估估计的参数(p = 0.0001695867,q = 0.349592505)是否显着?如何执行一些统计测试(估计 p 和 q 的 p 值,t 统计量)以测试 p 和 q 的显着性。也许是回归分析中总体显着性的 F 检验。出于某种原因,我对找到 p 和 q 的置信区间不感兴趣。但是 p 值或 t 统计量或我计算更感兴趣的任何东西。这样

Ho:p 统计上不显着 H1:p 统计上显着。 q 也一样。

还有一个 F 检验:

Ho: p & q = 0 同时。 H1:p 或 q 不等于 0

import pandas as pd
x = pd.read_excel('fitting_data.xlsx', sheet_name="bevshyb cars (2)", index_col=None, dtype={'Name': str, 'Value': float})
import numpy as np
#regression function
def fit(t,p,q):
    return 22500000*(((p*p*p+2*p*p*q+p*q*q)*np.exp(-p*t-q*t))/(((p+q*np.exp(-p*t-q*t))*(p+q*np.exp(-p*t-q*t)))))
#initial values
g = [0.000001,0.000001]
import scipy.optimize
t = x['t'].values
carsfact = x['BEVSHYB'].values
c, cov = scipy.optimize.curve_fit(fit,t,carsfact,g)
print(round(c[0],10))
print(round(c[1],10))

估计参数:p & q 分别 == 0.0001695867, 0.349592505

import sklearn.metrics 
print('R^2: ',sklearn.metrics.r2_score(x['BEVSHYB'],y))
print('explained_variance_score: ', sklearn.metrics.explained_variance_score(x['BEVSHYB'], y))

评估回归模型中的拟合优度: R^2:0.9143477744061798 解释变量分数:0.9168457427666166

将不胜感激任何帮助)))

【问题讨论】:

    标签: python scipy sklearn-pandas non-linear-regression p-value


    【解决方案1】:

    请查阅此链接中发布的问题的答案:它显示了一种评估优化参数重要性的方法:

    https://stats.stackexchange.com/questions/362520/how-to-know-if-a-parameter-is-statistically-significant-in-a-curve-fit-estimat

    这是那里的示例代码;注意 scipy.stats 的用法:

    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()
    ```
    

    【讨论】:

    • 我有一个愚蠢的问题是这行代码 t_df = scipy.stats.t.ppf(0.975, df_e) 表示 97.5% 的 conf 间隔,所以如果我将其更改为 0.95 会起作用吗?
    • 在 alpha = 0.05 的情况下,必须使用 ppf 方法计算 2 尾 t 检验的 t 值,概率为 0.0975 = 1 - 0.05/2 作为第一个参数。
    • 哦,谢谢,这已经是 95% 的 conf 间隔
    • 不客气。请考虑选择我的答案,以防它对您有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 2019-04-29
    • 1970-01-01
    • 2015-07-04
    • 2013-12-13
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多