generate_fa_funcs {lazy.fa}R Documentation

Generate Objective Functions and Others for Factor Analysis

Description

Generate Objective Functions and Others for Factor Analysis

Usage

generate_fa_funcs(S, print = 1)

Arguments

S

The Observed Dispersion Matrix

print

= 1 to print the summary

Value

This function generates the following functions as a list:

 critfa       因子分析の目的関数:パラメタは Lambda と psi or log(psi)
 critfapsi    因子分析の目的関数:パラメタは psi or log(psi) のみ
 gradfa_a     因子分析の目的関数の解析的一次微分:パラメタは Lambda と psi or log(psi)
 gradfa       因子分析の目的関数の数値的一次微分:パラメタは Lambda と psi or log(psi)
 HessQfa_a    因子分析の目的関数の数値的2次微分の近似:パラメタは Lambda と psi or log(psi)
 gradfapsi_a  因子分析の目的関数の解析的一次微分:パラメタは psi or log(psi) のみ
 gradfapsi    因子分析の目的関数の数値的一次微分:パラメタは psi or log(psi) のみ
 residfa      LS 因子分析の残差:パラメタは Lambda と psi or log(psi)
 Jacfa_a      LS 因子分析の解析的 Jacobian:パラメタは Lambda と psi or log(psi)
 residfapsi      LS 因子分析の残差:パラメタは psi or log(psi)
 Jacfapsi_a      LS 因子分析の解析的 Jacobian:パラメタは psi or log(psi)

The arguments to the functions:

 critfa       param, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 critfapsi    psi, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 gradfa_a     param, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 gradfa       param, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 HessQfa_a    param, ndim, Phi = diag(ndim), logpsi = 0, method = "LS", LH = 0
 gradfapsi_a  psiorlogpsi, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 gradfapsi    psiorlogpsi, ndim, Phi = diag(ndim), logpsi = 0, method = "ML", LH = 0
 residfa      param, ndim, Phi = diag(ndim), LH = 0, logpsi = 0, switch = 0, attrib = 0
 Jacfa_a      param, ndim, Phi = diag(ndim), logpsi = 0, LH = 0, switch = 0, attrib = 0
 residfapsi      param, ndim, Phi = diag(ndim), LH = 0, logpsi = 0, switch = 0, attrib = 0
 Jacfapsi_a      param, ndim, Phi = diag(ndim), logpsi = 0, LH = 0, switch = 0, attrib = 0

where

param        c( c(Lambda),psi ) or  c( c(Lambda),log(psi) )
psiorlogpsi  psi or log(psi)
ndim         # of factors
Phi          The factor correlation matrix
logpsi       = 1 if log(psi) is used as the parameter
method       = "ML" or "LS"
LH           = 1 to use lower triangular part of S to calculate LS criterion
switch       = 1 to define residual as 'model - data' for nlsr::nlfb
attrib       = 1 to return Jacobian as the attribute

Examples

#
# generate data
seed <- 1701
set.seed(seed)

nvar <- 20;  ndim0 <- 3
ps <- 0.2
df <- 500

A <- matrix(runif(nvar*ndim0),nvar)
Sigma <- A%*%t(A)
Sigma <- Sigma+ps*diag(nvar)
dS <- sqrt(diag(Sigma))
Sigma <- diag(1/dS)%*%Sigma%*%diag(1/dS)

# correlation matrix from Wishart random matrix
S <- rWishart( 1, df, Sigma )
S <- S[,,1]/df
dS <- sqrt(diag(S))
S <- diag(1/dS)%*%S%*%diag(1/dS)

# # of dimensions to be used
ndim <- 2

# generate objective functions and others
funcs <- generate_fa_funcs( S )
critfa <- funcs$critfa
critfapsi <- funcs$critfapsi
gradfa_a <- funcs$gradfa_a
gradfa <- funcs$gradfa
HessQfa_a <- funcs$HessQfa_a
gradfapsi_a <- funcs$gradfapsi_a
gradfapsi <- funcs$gradfapsi
residfa <- funcs$residfa
Jacfa_a <- funcs$Jacfa_a
residfapsi <- funcs$residfapsi
Jacfapsi_a <- funcs$Jacfapsi_a


# S or vech(S)
LH <- 0


# initial values by pca
ev <- eigen( S )
Lambda0 <- ev$vectors[,1:ndim]%*%diag(sqrt(ev$values[1:ndim]), nrow=ndim)
psi0 <- pmax(0.001, diag(S-Lambda0%*%t(Lambda0)) )

# initial value
param0 <- c(c(Lambda0),psi0)
param00 <- c(c(Lambda0),log(psi0))


# ML 因子分析: NR を利用:微分はお任せ
# ML fa by NR:  param=c( c(Lambda),psi )
resNR <- NR( param0, critfa, ndim=ndim, logpsi=0, maxiter=50, flipd=1 )
critNR <- resNR$objective
param <- resNR$par
Lambda <- matrix(param[1:(nvar*ndim)],nvar)
psi <- param[-(1:(nvar*ndim))]
Print(Lambda,psi)
gradNRa <- gradfa_a( param, ndim=ndim )
gradNRn <- gradfa( param, ndim=ndim )
Print(critNR,gradNRa, gradNRn)


# ML 因子分析: NR を利用:解析的1次微分を利用
# ML fa by NR with analytic gradient:  param=c( c(Lambda),psi )
resNR <- NR( param0, critfa, ndim=ndim, logpsi=0, maxiter=50, flipd=1
          , gradient=gradfa_a)
critNR <- resNR$objective
param <- resNR$par
Lambda <- matrix(param[1:(nvar*ndim)],nvar)
psi <- param[-(1:(nvar*ndim))]
Print(Lambda,psi)
gradNRa <- gradfa_a( param, ndim=ndim )
gradNRn <- gradfa( param, ndim=ndim )
Print(critNR,gradNRa, gradNRn)



[Package lazy.fa version 1.0.0.20250913 ]