Оценка новых данных с использованием старых коэффициентов в R - PullRequest
0 голосов
/ 25 мая 2018

Я использую factanal в R, чтобы уменьшить набор переменных с 30 переменными до 7 факторов, а затем использую оценки факторов, выведенные этим процессом (из fa $ scores) в модели lm.Пока все просто ...

Однако независимые переменные, которые я использую, отстают на один период от моего иждивенца (поскольку, как мы надеемся, модель будет предсказывать будущее).Теперь у меня есть все 30 входных переменных, которые мне нужны, чтобы предсказать значение следующих периодов, зависящих от var, поэтому мой вопрос таков.Как я могу использовать фактические результаты работы, которую я уже проделал, для вычисления 7-факторных баллов по этим 30 новым переменным?Получив эти данные, я могу использовать модель lm для прогнозирования следующего периода.

Пример кода, который я использую ниже (целевая переменная находится в первом столбце 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) 

У меня есть последние 30 независимых переменных в наборе данных с именем "new_data", и я просто рассчитываю рассчитать 7-факторные оценки с использованием уже рассчитанных факторных нагрузок, но пока не могу понять, как это сделать.....

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 26 мая 2018

Решение здесь: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...