РЕДАКТИРОВАТЬ: исправить ошибку в ковариационной матрице
Крест опубликован с здесь
Хорошо, поэтому я пытаюсь сделать 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'