R: Используя MLE, чтобы сделать CFA вручную - PullRequest
2 голосов
/ 13 марта 2012

РЕДАКТИРОВАТЬ: исправить ошибку в ковариационной матрице

Крест опубликован с здесь

Хорошо, поэтому я пытаюсь сделать cfa вручную. Я делаю учебник нашел здесь

Центральным уравнением является модель подразумеваемой ковариационной матрицы:

Сигма = LL ^ T + E

Где L - матрица нагрузок, а E - матрица ошибок. Идея состоит в том, чтобы использовать максимальное правдоподобие, чтобы получить оценки для L и E, которые минимизируют различие между подразумеваемой и наблюдаемой ковариационной матрицей. Минимизируемая функция дескрипции:

F = log | Сигма | + tr (S * Sigma ^ -1) - log | S | - р

, где sigma - подразумеваемая ковариационная матрица, S - наблюдаемая ковариационная матрица, а p - количество элементов индикатора.

Хорошо, поэтому наблюдаемая ковариационная матрица вырезана и вставлена ​​из ссылки выше, но помещена в матрицу R cov следующим образом:

дата <- '.804 .399 .500 .367 .451 .510 .487 .833 .433 .283 .372 .377 .621 .529 .805 .339> .551 .543 .478 .362 .441 .733 .332 .341 .570 .461 .695 .438 .780 .556 .626 .455 .667 .438> .693 .825 '

dat <- strsplit (dat, '') </p>

Дат <-as.numeric (unlist (Даты)) </p>

covar1 <- матрица (дата, nrow = 6, ncol = 6, byrow = FALSE) </p>

covar1 <-t (covar1) </p>

covar1 <-as.matrix (forceSymmetric (covar1)) </p>

Начальные значения и функции для ML:

L1<- rep(.7,6)#starting values for loadings

E1<- diag(.3, 6, 6)#starting values for error

discrepency<- function(covar, L, E){
  #descrepency function 
  # I need to apply ML to this to find L and E
  sigma<- L%*%t(L)+E
  log(det(sigma))+
  sum(diag(covar%*%solve(sigma)))-
  log(det(covar))-
  nrow(covar)}

Мой вопрос заключается в том, как получить оценки ML для L и E. Другими словами, как получить оценки для L (вектор столбца) и E (диагональная матрица), которые минимизируют значение дескрипции. Я пробовал stats4 ::: mle с базы, но безуспешно. Очевидно, я хотел бы использовать мои начальные значения для L и E, как отмечено выше.

Большое спасибо!

EDIT: Вот где я дошел до сих пор. Я пробовал функцию mle следующим образом:

stats4 ::: mle (дискретность, фиксированная = список (covar = covar1), старт = список (L = L1, E = E1))

Я получаю ошибку:

Ошибка в optim (start, f, method = method, hessian = TRUE, ...): (список) объект не может быть приведен к типу 'double'

1 Ответ

0 голосов
/ 15 марта 2012

Успех:

discrepency<- function(covar, L1,L2,L3,L4,L5,L6, E1,E2,E3,E4,E5,E6){
  #descrepency function 
  # I need to apply ML to this to find L and E
  sigma<- c(L1,L2,L3,L4,L5,L6)%*%t(c(L1,L2,L3,L4,L5,L6))+diag(c(E1,E2,E3,E4,E5,E6))
  log(det(sigma))+
  sum(diag(covar%*%solve(sigma)))-
  log(det(covar))-
  nrow(covar)}

С:

out<-stats4:::mle(discrepency, start = list(L1=.07, L2=.07, L3=.07, L4=.07, L5=.07,L6=.07,
      E1=.03,E2=.03,E3=.03,E4=.03,E5=.03,E6=.03), 
      fixed= list(covar=covar1), method="L-BFGS-B", 
      control=list(maxit=10000))

str(out)
out1<-round(matrix(out@coef, 6, 2),3)
colnames(out1)<- c('loadings', 'errors')

Дает оценки MLE, которые очень похожи на MPlus и AMOS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...