2

因子分析を実行するための統計factanalパッケージの関数を使用しています。

次のことを試しました。

library(mirt)
library(ltm)
library(psych)
library(stats)
data(SAT12)
data=SAT12
cor_mat=polychoric(data,  ML=TRUE, global=F)
 fit <- factanal(factors=2, n.obs=nrow(data), covmat=cor_mat$rho)


Divide_item_Factor_Loading(fit)

Divide_item_Factor_Loading(fit) を実行しようとすると、エラーと呼ばれる

   Error in a[[i]][[2]] : subscript out of bounds 

浮き出る。

Divide_item_Factor_Loading の私の完全なコード:

Divide_item_Factor_Loading=function(fit)
{
  a=list()
  items=NULL
  for(i in 1:nrow(fit$loadings)) ######corresponding to rows of loading matrix
  {
    k=which(fit$loadings[i,]==max(abs(fit$loadings[i,])))  
    a[[i]]=c(i,as.numeric(k))
  } 
  fact_item_mat=matrix(, nrow=nrow(fit$loadings), ncol=ncol(fit$loadings))
  for(j in 1:(ncol(fit$loadings)))
  {
    for(i in 1:(nrow(fit$loadings)))
    {
      if(a[[i]][[2]]==j) {fact_item_mat[i,j]=a[[i]][[1]]}
    }    
  }
  nam=names(fit$loadings[,1])
  factor=list()
  for(i in 1:ncol(fit$loadings))
  {
    factor[[i]]=sort(fact_item_mat[,i], decreasing = FALSE, na.last = NA)
    fac=factor[[i]]
    fac=nam[fac]
    factor[[i]]=fac
  }
  names(factor)=paste("factor", 1:ncol(fit$loadings), sep="")
  return(factor)
}

このエラーを回避するには、どのような手順を実行する必要がありますか?

4

3 に答える 3

1

負荷が出力される方法を変更するには、 へのcutoff引数を使用しますprint.loadings

次のようなことを試してください:

print(fit$loadings, cutoff=0)

実際の行列にはすべての値が含まれています。

print(loadings(fit), cutoff=0)

Loadings:
       Factor1 Factor2
Item 1 0.014   0.418  
Item 2 0.130   0.350  
Item 3 0.036   0.553  
Item 4 0.166   0.294  
Item 5 0.990   0.125  

               Factor1 Factor2
SS loadings      1.025   0.705
Proportion Var   0.205   0.141
Cumulative Var   0.205   0.346

を使用して、各因子の最大負荷を抽出しますapply()

apply(loadings(fit), 2, max)

  Factor1   Factor2 
0.9895743 0.5531770 
于 2015-02-04T12:32:11.290 に答える
0

コードを実行し、(関数を使用して) 関数をデバッグするdebugと、「添え字が境界外」エラーが発生する理由がわかります。

  • 変数の 15 番目の要素 (とりわけ) のa長さは 1 であるためR、到達しようとすると満足できませんa[[15]][2]...
  • この要素の長さが 2 ではなく 1 のみである理由は、負の値に対して factor の最大絶対値に達し、どの値 (絶対値ではない) がこの最大絶対値に等しいかを尋ねているため、答えはなし...


which(fit$loadings[i,]==max(abs(fit$loadings[i,])))したがって、行を次のように変更する必要がwhich(abs(fit$loadings[i,])==max(abs(fit$loadings[i,])))
あります。次のようになります。

Divide_item_Factor_Loading(fit)
#$factor1
 #[1] "Item.1"  "Item.4"  "Item.6"  "Item.7"  "Item.8"  "Item.9"  "Item.10" "Item.11" "Item.13" "Item.14" "Item.15"
#[12] "Item.17" "Item.19" "Item.20" "Item.24" "Item.26" "Item.27" "Item.28" "Item.29"

#$factor2
 #[1] "Item.2"  "Item.3"  "Item.5"  "Item.12" "Item.16" "Item.18" "Item.21" "Item.22" "Item.23" "Item.25" "Item.30"
#[12] "Item.31" "Item.32"

デバッグされた関数が機能するようになったとしても、これは必要以上に複雑なので、変更する必要があると思います。

代替機能の私の提案:

Divide_item_Factor_Loading_v2<-function(fit){
     a<-apply(fit$loadings,1,function(facs) which(abs(facs)==max(abs(facs))))
     return(list(factor1=names(a)[a==1],factor2=names(a)[a==2]))
}

これにより、fitオブジェクトに(デバッグされた)関数とまったく同じ結果が得られます。

Divide_item_Factor_Loading_v2(fit)
#$factor1
 #[1] "Item.1"  "Item.4"  "Item.6"  "Item.7"  "Item.8"  "Item.9"  "Item.10" "Item.11" "Item.13" "Item.14" "Item.15"
#[12] "Item.17" "Item.19" "Item.20" "Item.24" "Item.26" "Item.27" "Item.28" "Item.29"

#$factor2
 #[1] "Item.2"  "Item.3"  "Item.5"  "Item.12" "Item.16" "Item.18" "Item.21" "Item.22" "Item.23" "Item.25" "Item.30"
#[12] "Item.31" "Item.32"
于 2015-02-05T12:20:41.923 に答える
0

を確認すると、「これ(絶対値で)より小さい荷重は抑制される」という値を定義するパラメータ?loadingsがあることがわかります。cutoff

于 2015-02-04T12:32:56.947 に答える