Skip to content

Commit b1d1f37

Browse files
committed
Calculate coefficients' tolerances and VIFs earlier
to use them when it cannot inverse a singular or near-singular matrix
1 parent 85a641e commit b1d1f37

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

v2/regression.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,32 @@ func (r *Regression) Run() (*Model, error) {
320320
// 回帰の標準誤差(推定値の標準偏差)
321321
standardError := math.Sqrt(residualsVariance)
322322

323+
// 許容度 及び 分散拡大係数(VIF)
324+
coeffsTolerances, coeffsVIFs := make([]float64, 0, bm.numOfExplanatoryVars), make([]float64, 0, bm.numOfExplanatoryVars)
325+
if bm.numOfExplanatoryVars < 2 {
326+
coeffsTolerances, coeffsVIFs = make([]float64, bm.numOfExplanatoryVars), make([]float64, bm.numOfExplanatoryVars)
327+
} else {
328+
for idx, explanatoryVars := range r.explanatoryVarsMatrix {
329+
if _, ok := r.disregardingExplanatoryVarsSet[idx]; ok {
330+
continue
331+
}
332+
r.disregardingExplanatoryVarsSet[idx] = struct{}{}
333+
bm, err := (&Regression{
334+
objectiveVars: explanatoryVars,
335+
explanatoryVarsMatrix: r.explanatoryVarsMatrix,
336+
disregardingExplanatoryVarsSet: r.disregardingExplanatoryVarsSet,
337+
}).run()
338+
if err != nil {
339+
panic(err) // Error should never happens
340+
}
341+
delete(r.disregardingExplanatoryVarsSet, idx)
342+
343+
tolerance := 1 - bm.r2
344+
coeffsTolerances = append(coeffsTolerances, tolerance)
345+
coeffsVIFs = append(coeffsVIFs, 1/tolerance)
346+
}
347+
}
348+
323349
// 説明変数の観測値の残差の行列
324350
explanatoryVarsResidualsDense := mat.NewDense(bm.numOfObservations, bm.numOfExplanatoryVars, nil)
325351
explanatoryVarsResidualsDense.Apply(func(i, j int, v float64) float64 {
@@ -441,32 +467,6 @@ func (r *Regression) Run() (*Model, error) {
441467
return corrs
442468
}()
443469

444-
// 許容度 及び 分散拡大係数(VIF)
445-
coeffsTolerances, coeffsVIFs := make([]float64, 0, bm.numOfExplanatoryVars), make([]float64, 0, bm.numOfExplanatoryVars)
446-
if bm.numOfExplanatoryVars < 2 {
447-
coeffsTolerances, coeffsVIFs = make([]float64, bm.numOfExplanatoryVars), make([]float64, bm.numOfExplanatoryVars)
448-
} else {
449-
for idx, explanatoryVars := range r.explanatoryVarsMatrix {
450-
if _, ok := r.disregardingExplanatoryVarsSet[idx]; ok {
451-
continue
452-
}
453-
r.disregardingExplanatoryVarsSet[idx] = struct{}{}
454-
bm, err := (&Regression{
455-
objectiveVars: explanatoryVars,
456-
explanatoryVarsMatrix: r.explanatoryVarsMatrix,
457-
disregardingExplanatoryVarsSet: r.disregardingExplanatoryVarsSet,
458-
}).run()
459-
if err != nil {
460-
panic(err) // Error should never happens
461-
}
462-
delete(r.disregardingExplanatoryVarsSet, idx)
463-
464-
tolerance := 1 - bm.r2
465-
coeffsTolerances = append(coeffsTolerances, tolerance)
466-
coeffsVIFs = append(coeffsVIFs, 1/tolerance)
467-
}
468-
}
469-
470470
logger.Info.Printf("Completed: Number of explanatory variables = %d", bm.numOfExplanatoryVars)
471471

472472
return newModel(&rawModel{

0 commit comments

Comments
 (0)