@@ -88,7 +88,7 @@ function regife(df::AbstractDataFrame, f::FormulaTerm;
88
88
has_absorb_intercept = true
89
89
end
90
90
fes = FixedEffect[FixedEffectModels. _subset (fe, esample) for fe in fes]
91
- pfe = FixedEffectModels. FixedEffectMatrix (fes, sqrtw, Val{:lsmr })
91
+ feM = FixedEffectModels. FixedEffectMatrix (fes, sqrtw, Val{:lsmr })
92
92
end
93
93
94
94
has_intercept = ConstantTerm (1 ) ∈ FixedEffectModels. eachterm (formula. rhs)
@@ -123,10 +123,8 @@ function regife(df::AbstractDataFrame, f::FormulaTerm;
123
123
formula_schema = apply_schema (formula, schema (formula, subdf, contrasts), StatisticalModel)
124
124
125
125
y = convert (Vector{Float64}, response (formula_schema, subdf))
126
- y .= y .* sqrtw
127
126
oldy = copy (y)
128
127
X = convert (Matrix{Float64}, modelmatrix (formula_schema, subdf))
129
- X .= X .* sqrtw
130
128
131
129
# change default if has_regressors
132
130
has_regressors = size (X, 2 ) > 0
@@ -147,9 +145,11 @@ function regife(df::AbstractDataFrame, f::FormulaTerm;
147
145
148
146
149
147
if has_absorb
150
- FixedEffectModels. solve_residuals! (y, pfe )
151
- FixedEffectModels. solve_residuals! (X, pfe )
148
+ FixedEffectModels. solve_residuals! (y, feM )
149
+ FixedEffectModels. solve_residuals! (X, feM )
152
150
end
151
+ y .= y .* sqrtw
152
+ X .= X .* sqrtw
153
153
154
154
155
155
@@ -191,9 +191,13 @@ function regife(df::AbstractDataFrame, f::FormulaTerm;
191
191
# y ~ x + γ1 x factors + γ2 x loadings
192
192
# if not, this means fit! ended up on a a local minimum.
193
193
# restart with randomized coefficients, factors, loadings
194
- newpfe = FixedEffectModels. FixedEffectMatrix (getfactors (fp, fs), sqrtw, Val{:lsmr })
195
- FixedEffectModels. solve_residuals! (ym, newpfe, tol = tol, maxiter = maxiter)
196
- FixedEffectModels. solve_residuals! (Xm, newpfe, tol = tol, maxiter = maxiter)
194
+ newfeM = FixedEffectModels. FixedEffectMatrix (getfactors (fp, fs), sqrtw, Val{:lsmr })
195
+ ym .= ym ./ sqrtw
196
+ Xm .= Xm ./ sqrtw
197
+ FixedEffectModels. solve_residuals! (ym, newfeM, tol = tol, maxiter = maxiter)
198
+ FixedEffectModels. solve_residuals! (Xm, newfeM, tol = tol, maxiter = maxiter)
199
+ ym .= ym .* sqrtw
200
+ Xm .= Xm .* sqrtw
197
201
ydiff = Xm * (fs. b - Xm \ ym)
198
202
if iterations >= maxiter || norm (ydiff) <= 0.01 * norm (y)
199
203
break
@@ -285,7 +289,7 @@ function regife(df::AbstractDataFrame, f::FormulaTerm;
285
289
subtract_factor! (fp, fs)
286
290
axpy! (- 1.0 , residuals, oldresiduals)
287
291
# get fixed effect
288
- newfes, b, c = FixedEffectModels. solve_coefficients! (oldresiduals, pfe ; tol = tol, maxiter = maxiter)
292
+ newfes, b, c = FixedEffectModels. solve_coefficients! (oldresiduals, feM ; tol = tol, maxiter = maxiter)
289
293
for j in 1 : length (fes)
290
294
augmentdf[! , ids[j]] = Vector {Union{Float64, Missing}} (missing , length (esample))
291
295
augmentdf[esample, ids[j]] = newfes[j]
0 commit comments