使用Graphviz绘制R包'sem'的路径图

时间:2011-12-21 04:33:11

标签: r latex sweave sem

我使用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的<{1}}文件中?

1 个答案:

答案 0 :(得分:3)

您只需指定文件名(不带扩展名!),请参阅file=参数。如文档中所述,它将生成.dot和PDF文件(但如果您只想要graphviz输出,则设置output.type="dot"。)

在调用上面的命令后,我会在Sweave文件中使用一个简单的\includegraphics命令。 (如果不在与主.Rnw文件相同的目录中生成SEM图,则可能需要调整路径以查找图形。)

<强>更新

鉴于您的评论,是的,似乎在函数调用(pathDiagram)内运行外部程序时出现问题。因此,这是一个非常优雅的解决方案,用于生成路径图并将其包含在您的Sweave-&gt; 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.covsem.mod包含协方差矩阵和结构模型,它们都是在上面的示例中手动输入的(简单复制/粘贴在纯文本文件中)。我不是很高兴不得不使用capture.output(),因为我无法找到一种方法来掩盖其来自块的调用。也许你会找到一个更好的方法(想法是使用system(),并且可以在块参数中使用echo=FALSE轻松掩盖。

我碰巧按以下方式编译了上述文件:

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

enter image description here