Рисование диаграмм путей с помощью пакета R 'sem' с использованием Graphviz - PullRequest
2 голосов
/ 21 декабря 2011

Я использую пакет sem для анализа. Чтобы нарисовать диаграмму пути, я использую функцию pathDiagram в sem, чтобы получить код, а затем использую его в Graphviz, чтобы получить диаграмму. У меня два вопроса:

library(sem)

R.DHP <- readMoments(diag=FALSE, names=c('ROccAsp', 'REdAsp', 'FOccAsp', 
                'FEdAsp', 'RParAsp', 'RIQ', 'RSES', 'FSES', 'FIQ', 'FParAsp'))
    .6247                                                              
    .3269  .3669                                                        
    .4216  .3275  .6404                                      
    .2137  .2742  .1124  .0839                                
    .4105  .4043  .2903  .2598  .1839                          
    .3240  .4047  .3054  .2786  .0489  .2220                    
    .2930  .2407  .4105  .3607  .0186  .1861  .2707              
    .2995  .2863  .5191  .5007  .0782  .3355  .2302  .2950        
    .0760  .0702  .2784  .1988  .1147  .1021  .0931 -.0438  .2087  

model.dhp <- specifyModel()
    RParAsp  -> RGenAsp, gam11,  NA
    RIQ      -> RGenAsp, gam12,  NA
    RSES     -> RGenAsp, gam13,  NA
    FSES     -> RGenAsp, gam14,  NA
    RSES     -> FGenAsp, gam23,  NA
    FSES     -> FGenAsp, gam24,  NA
    FIQ      -> FGenAsp, gam25,  NA
    FParAsp  -> FGenAsp, gam26,  NA
    FGenAsp  -> RGenAsp, beta12, NA
    RGenAsp  -> FGenAsp, beta21, NA
    RGenAsp  -> ROccAsp,  NA,       1
    RGenAsp  -> REdAsp,  lam21,  NA
    FGenAsp  -> FOccAsp,  NA,       1
    FGenAsp  -> FEdAsp,  lam42,  NA
    RGenAsp <-> RGenAsp, ps11,   NA
    FGenAsp <-> FGenAsp, ps22,   NA
    RGenAsp <-> FGenAsp, ps12,   NA
    ROccAsp <-> ROccAsp, theta1, NA
    REdAsp  <-> REdAsp,  theta2, NA
    FOccAsp <-> FOccAsp, theta3, NA
    FEdAsp  <-> FEdAsp,  theta4, NA



sem.dhp <- sem(model.dhp, R.DHP, 329,
    fixed.x=c('RParAsp', 'RIQ', 'RSES', 'FSES', 'FIQ', 'FParAsp'))



pathDiagram(sem.dhp, min.rank='RIQ, RSES, RParAsp, FParAsp, FSES, FIQ', 
    max.rank='ROccAsp, REdAsp, FEdAsp, FOccAsp')
  1. Как нарисовать диаграмму пути непосредственно из R с помощью функции pathDiagram?
  2. Как включить график в файл Rnw для Sweave?

1 Ответ

3 голосов
/ 21 декабря 2011

Вам просто нужно указать имя файла (без расширения!), См. Аргумент file=.Как указано в документации, он сгенерирует как .dot, так и PDF-файл (но установите output.type="dot", если вы хотите только вывод graphviz).

Я бы использовал простую команду \includegraphics в Sweaveфайл, после вызова вышеуказанной команды.(Вам может понадобиться изменить путь, чтобы найти рисунок, если вы не генерируете диаграмму SEM в том же каталоге, что и ваш мастер .Rnw файл.)

Обновление

Учитывая ваш комментарий, да, похоже, что есть проблема с запуском внешней программы из вызова функции (pathDiagram).Так что вот не очень элегантное решение для генерации схемы пути и включения ее в ваш документ Sweave-> TeX.

Вот файл Sweave (sw.rnw):

\documentclass{article}
\usepackage{graphicx}
\begin{document}
<<echo=TRUE>>=
library(sem)
R.DHP <- readMoments("sem.cov", diag=FALSE, 
                     names=c('ROccAsp', 'REdAsp', 'FOccAsp', 
                       'FEdAsp', 'RParAsp', 'RIQ', 'RSES',  
                       'FSES', 'FIQ', 'FParAsp'))
model.dhp <- specifyModel(file="sem.mod")
sem.dhp <- sem(model.dhp, R.DHP, 329,
               fixed.x=c('RParAsp', 'RIQ', 'RSES', 'FSES', 'FIQ', 'FParAsp'))            
capture.output(pathDiagram(sem.dhp, min.rank='RIQ, RSES, RParAsp, FParAsp, FSES, FIQ', 
            max.rank='ROccAsp, REdAsp, FEdAsp, FOccAsp'), file="sem.dot")
@
<<echo=FALSE>>=
system("dot -Tpdf -o fig1.pdf  sem.dot")
@

And here is the path diagram.

\begin{center}
\includegraphics{fig1}
\end{center}

\end{document}

Файлы sem.cov и sem.mod содержат ковариационную матрицу и структурную модель, которые были введены вручную в вышеприведенном примере (простое копирование / вставка в текстовом файле).Я не очень рад использовать capture.output(), потому что не могу найти способ замаскировать его вызов из чанка.Возможно, вы найдете лучший способ сделать это (идея состоит в том, чтобы использовать system(), и это можно легко замаскировать с помощью echo=FALSE в параметрах чанка).

Я случайно скомпилировал вышеупомянутый документследующим образом:

$ R CMD Sweave sw.rnw
$ R CMD texi2pdf sw.tex

enter image description here

...