我使用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')
R
功能直接从pathDiagram
绘制路径图?Rnw
的<{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.cov
和sem.mod
包含协方差矩阵和结构模型,它们都是在上面的示例中手动输入的(简单复制/粘贴在纯文本文件中)。我不是很高兴不得不使用capture.output()
,因为我无法找到一种方法来掩盖其来自块的调用。也许你会找到一个更好的方法(想法是使用system()
,并且可以在块参数中使用echo=FALSE
轻松掩盖。
我碰巧按以下方式编译了上述文件:
$ R CMD Sweave sw.rnw
$ R CMD texi2pdf sw.tex