我在R中使用factanal将30个变量数据集减少到7个因子,然后使用lm模型中此过程输出的因子分数(来自fa $ scores)。到目前为止,如此直截了当......
然而,我使用的自变量滞后一段时间而不是依赖(因为模型有望预测未来)。我现在有所有30个输入变量,我需要预测下一个时期依赖var的值,所以我的问题是这个。我如何使用我已经完成的工作中的事实输出来计算这30个新变量的7个因子得分?有了这些,我可以使用lm模型来预测下一个时期。
我在下面使用的代码示例(目标var位于mydata的第一列):
#extract factors
fitted_data <- factanal(mydata[,-1],7,rotation="varimax",lower=0.05,scores="regression")
#add factor scores back to main dataset
mydata <- cbind(mydata,fitted_data$scores)
'#inear regression model to predict my target_variable using factors I've extracted
mod1 <- lm(Target_Var ~ Factor1+ Factor2 + Factor3 + Factor4 + Factor5 + Factor6 + Factor7,data=mydata)
我在一个名为“new_data”的数据集中有最新的30个独立变量,我只是想用已经计算过的因子载荷来计算7个因子得分,但是在我的生活中不能弄清楚如何。 ....
非常感谢任何帮助。
答案 0 :(得分:0)
解决方案在这里:https://stat.ethz.ch/pipermail/r-help/2002-April/020278.html
我在下面测试过,似乎工作正常:)
# variables, factors, dimension of data
vars <- 5
f <- 2
N <- 10
# function from https://stat.ethz.ch/pipermail/r-help/2002-April/020278.html
newFactors <- function(model_data, new_data, fitted_data){
coef <- solve(fitted_data$correlation) %*% fitted_data$loadings
means <- apply(model_data, 2, mean)
sds <- apply(model_data, 2, sd)
scale(new_data, means, sds) %*% coef
}
# sample data
mydata <- as.data.frame(do.call(cbind, lapply(1:vars, function(i){
runif(N)
})))
target_data <- data.frame(y = runif(N))
# extract factors
fitted_data <- factanal(mydata,f,rotation="varimax",lower=0.05,scores="regression")
factor_data <- fitted_data$scores
# check scores with new function
check <- newFactors(mydata, mydata, fitted_data)
max(abs(check-factor_data)) # float issue
# new data sample
N2 <- 3
new_data <- as.data.frame(do.call(cbind, lapply(1:vars, function(i){
runif(N2)
})))
# the factor loadings for new data
new_factor_data <- newFactors(mydata, new_data, fitted_data)