|
| 1 | +package regression |
| 2 | + |
| 3 | +import ( |
| 4 | + "errors" |
| 5 | + "math" |
| 6 | + |
| 7 | + "gonum.org/v1/gonum/mat" |
| 8 | +) |
| 9 | + |
| 10 | +var ( |
| 11 | + ErrNearSingular = &ConditionError{isExactlySingular: false} |
| 12 | + ErrExactlySingular = &ConditionError{isExactlySingular: true} |
| 13 | + |
| 14 | + matConditionError = mat.Condition(0) // matrix singular or near-singular |
| 15 | + matConditionErrorInf = mat.Condition(math.Inf(1)) // matrix exactly singular |
| 16 | +) |
| 17 | + |
| 18 | +type ConditionError struct { |
| 19 | + err error |
| 20 | + isExactlySingular bool |
| 21 | + Hint *ConditionErrorHint |
| 22 | +} |
| 23 | + |
| 24 | +func (e ConditionError) Error() string { |
| 25 | + if e.err == nil { |
| 26 | + return "" |
| 27 | + } |
| 28 | + return e.err.Error() |
| 29 | +} |
| 30 | + |
| 31 | +func (e ConditionError) Is(err error) bool { |
| 32 | + if condErr, ok := err.(*ConditionError); ok { |
| 33 | + return e.isExactlySingular == condErr.isExactlySingular |
| 34 | + } |
| 35 | + return false |
| 36 | +} |
| 37 | + |
| 38 | +func (e ConditionError) Unwrap() error { |
| 39 | + return e.err |
| 40 | +} |
| 41 | + |
| 42 | +func wrapAsConditionError(err error, hint *ConditionErrorHint) *ConditionError { |
| 43 | + return &ConditionError{ |
| 44 | + err: err, |
| 45 | + isExactlySingular: errors.Is(err, matConditionErrorInf), |
| 46 | + Hint: hint, |
| 47 | + } |
| 48 | +} |
| 49 | + |
| 50 | +type ConditionErrorHint struct { |
| 51 | + ExplanatoryVars []ExplanatoryVarHint |
| 52 | +} |
| 53 | + |
| 54 | +type ExplanatoryVarHint struct { |
| 55 | + OriginalIndex int // 元々のインデックス |
| 56 | + Label string // 名称 |
| 57 | + Coeff float64 // 偏回帰係数 B |
| 58 | + VIF float64 // 共線性の統計量 VIF |
| 59 | +} |
| 60 | + |
| 61 | +func newExplanatoryVarHints(basicRawModel *basicRawModel, vifs []float64) []ExplanatoryVarHint { |
| 62 | + hints := make([]ExplanatoryVarHint, basicRawModel.numOfExplanatoryVars) |
| 63 | + |
| 64 | + for i := 0; i < basicRawModel.numOfExplanatoryVars; i++ { |
| 65 | + hints[i] = ExplanatoryVarHint{ |
| 66 | + OriginalIndex: basicRawModel.indexesTable[i], |
| 67 | + Label: basicRawModel.explanatoryVarsLabels[i], |
| 68 | + Coeff: basicRawModel.coeffs[i], |
| 69 | + VIF: vifs[i], |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + return hints |
| 74 | +} |
0 commit comments