2015-02-04 2 views
1

При использовании factanal функция от Статистика пакет для анализа факторов.Подкатегория из связанной ошибки в R

Я попробовал следующее.

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 (подходит) ошибка называется

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) 
} 

Какие шаги я должен предпринять сейчас, чтобы избежать этой ошибки?

+0

Как Андрей говорит, что это просто метод печати - все значения находятся в матрице нагрузок. Посмотрите на 'loadings (fit)' и 'loadings (fit) []'. Они выглядят по-разному из-за метода печати, но матрицы нагрузок одинаковы. Проверьте 'str (загрузки (fit))' и 'str (loadings (fit) [])'. Другая проверка 'loadings (fit) [] == loadings (fit)' – user20650

+0

@Irri, передача вашего кода из данных LSAT не дает мне никакой ошибки (просто предупреждение, хотя «опция ML была удалена из полихрической функции в пакете psych. Исправьте вызов ") и выполните' Divide_item_Factor_Loading (fit) ', я получаю' $ factor1 [1] "Пункт 5" $ factor2 [1] "Пункт 1" "Пункт 2" "Пункт 3 «Пункт 4». Итак, извините, но я не очень понимаю ваш вопрос ... – Cath

+0

@CathG, можете ли вы предоставить мне свой адрес электронной почты i.d. так что я могу дать вам набор проблемных данных. –

ответ

0

Запуск кода и отладки функции (с помощью функции debug) Я могу понять, почему вы испытываете «подстрочный из связанного» Ошибка:

  • 15-го элемента (среди прочих) в вашей переменной a имеет длину 1, поэтому R недовольна тем, что вы пытаетесь достичь a[[15]][2] ...
  • Причина, по которой этот элемент имеет длину только один, а не 2, состоит в том, что достигается максимальное абсолютное значение коэффициента для отрицательного значения и вы спрашиваете, какое значение (не абсолютное) равно этому максимальному абсолютному значению, поэтому ответ не будет ...

Следовательно, вам нужно изменить строку
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" 
+0

Спасибо за тонну! :) –

+1

@Irri, приветствую вас, держите функцию 'debug' в виду, это очень полезно, когда у вас есть функция, создающая ошибку ;-) – Cath

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 
+0

Благодарим вас за ответ. Я не хочу его печатать. Мне нужно сохранить эту матрицу загрузки в объекте и использовать ее для вычисления максимальной величины загрузки для элемента среди факторов, как я показал в приведенном выше коде в отредактированном вопросе. –

+0

Ну, все загрузки сохранены. При печати они просто подавляются. Я отредактирую свой ответ. – Andrie

+0

Спасибо, ответ Андри. Но мне нужно сохранить Factor с максимальной загрузкой для каждого элемента. Вот что делает список «а». Не один максимум от каждого фактора. Но, к сожалению, он не сравнивает значения (И я думал, что значения невидимы, поэтому он не может сравниться). Я отредактирую свой вопрос снова. Пожалуйста, смотрите. –

0

Проверить ?loadings, что вы узнаете, что есть cutoff параметр, который определяет значение, которое «нагрузки меньше это (по абсолютной величине) подавляется ».

Смежные вопросы