bugfix> r > 投稿

Rのファクタナールを使用して30個の変数データセットを7個の因子に減らし、lmプロセスで(fa $scoresから)このプロセスによって出力された因子スコアを使用しています。これまでのところ、とても簡単です。...

しかし、私が使用している独立変数は、(モデルが将来を予測することを期待しているので)1期間に対して依存期間が遅れています。これで、次の期間に依存するvarの値を予測する必要がある30個の入力変数がすべて揃ったので、私の質問はこれです。これら30の新しい変数から7つの因子スコアを計算するために、すでに行った作業からの事実の出力を使用するにはどうすればよいですか?これらを取得したら、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)

「new_data」と呼ばれるデータセットに最新の30個の独立変数があり、既に計算された因子負荷を使用して7つの因子スコアを計算しようとしていますが、どうしたらよいかわかりません。 。

どんな助けも大歓迎です。

回答 1 件
  • 解決策はこちら: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)
    
    

あなたの答え