2013-05-28 12 views
3

У меня есть оценка MLE, написанная в GAUSS, которую я пытаюсь перекодировать в R. Я не использую и не использую сам GAUSS (и не имею доступа к Это). В коде есть строка, которая немного запутывает меня.Преобразование кода GAUSS в R

В проверенном коде GAUSS есть строка под «входами» (часть комментариев), который гласит:

invsig: scalar or m-by-m matrix with inverse of sigma 

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

Вот GAUSS сниппет, что меня смущает:

... 
local m, k, tobs, invsig 
m = rows(y);k = rows(x); tobs = rows(dat) 
invsig= eye(m)*invsig 
... 

Я понимаю, что это единичная матрица, умноженная на «входе» invsig, но в смоделированных примерах работы (из лог-файлов, прикрепленных к коду), программа может быть запущена с использованием скалярного значения invsig. IE: установка начального значения как invsig = 1

В R это не работает. Вот простой код «тест», чтобы попытаться получить это:

y.mat <- rep(rexp(3)) 
x.mat <- matrix(rexp(36), 12, 3) 
myfct <- function(x,invsig){ 
    m <- nrow(x) 
    invsig <- diag(m)%*%invsig 
    return(invsig) 
} 
t1 <- myfct(x.mat, 1)  ##Non-conformable error 
t2 <- myfct(x.mat, y.mat) ##Works 

Я понимаю, не сообразуясь ошибку, что я получаю в R. Вопрос я что-то отсутствует в преобразовании между GAUSS и R? При чтении справочных руководств в режиме онлайн, GAUSS выполняет операции с матрицей, используя отдельные символы (*/+ -) и делая вещи по-разному, вы добавляете «.». перед каждой операцией. Поэтому для меня код GAUSS говорит о необходимости умножения матрицы (%*% в R), и это то, что пытается выполнить простая функция.

Любые комментарии или предложения приветствуются!

+0

Это не проблема, о которой вы спрашиваете, но в GAUSS это выглядит так: 'm' определяется как количество строк в' y', но в R вы делаете 'm' количество строк в' x '. – Gregor

+0

Спасибо, да, функция выборки является адаптацией кода GAUSS (не слова для слова реплики). Они имеют несколько разных матриц, подобных этому в большой программе, поэтому я случайно смешанные переменные, но проблема остается, если я вернусь и изменил ее обратно с x на y. – Tony

ответ

3

Ваша проблема заключается в том, что матрица не может умножить матрицу 3x3 на матрицу 1x1. Я бы рекомендовал что-то вроде

myfct <- function(x,invsig){ 
    if (is.matrix(invsig)) return(invsig) 
    m <- nrow(x) 
    return(diag(invsig, nrow = m)) 
} 

Edited я оставил в умножении на diag(m) в первом случае, но, конечно, это не нужно, если invsig уже матрица.

+0

Спасибо, я попробую это. Я все еще запутался в различии между GAUSS и R в их матричном умножении. Я не понимаю, как в их коде GAUSS он может одновременно работать как матрица и скаляр, если я ничего не упускаю. Тот факт, что он может быть как скалярной, так и матрицей длины (m) и все еще решить оба пути, необычен. – Tony

+0

Я тоже не знаю GAUSS, но, возможно, у них есть «приятный» и запутанный по умолчанию, где матричное время ('% *%') скаляр возвращает матрицу, регулярную по времени скаляр. – Gregor

+0

Подход GAUSS действительно делает математический смысл; было бы целесообразно перегрузить '*' как значение элементарного умножения в случае (скалярной * матрицы) и стандартного умножения в случае (матрицы матрицы *), поскольку элементное умножение * есть * стандартная математическая интерпретация скалярно- матричное умножение. MATLAB, GAUSS, AD Model Builder кажутся более совместимыми с математическими обозначениями для меня, даже если обозначение продукта R's Hadamard более удобно для программирования ... –

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

  • Нет связанных вопросов^_^