OpenClinica 用户手册/SAS
SAS 可以导入多种格式的数据。对于 OpenClinica 3.x 版本,由于其可移植性和 SAS 的导入功能,明显的选择是 CDISC ODM 1.3 XML。
CDISC ODM 1.3 XML 与 OpenClinica 扩展格式包括两种类型的数据
- CDISC ODM 1.3 规范数据(SAS 的 libname 知道如何导入)
- OpenClinica 扩展数据(可以使用映射文件告诉 SAS 如何获取)
大部分有用的数据是 CDISC ODM 1.3,但一些有用的数据“隐藏”在 OpenClinica 扩展部分(例如,出生日期、性别和事件开始日期)。
OpenClinica 扩展不是 CDISC ODM 1.3 规范的一部分,需要单独导入。下面的代码使用映射文件(extensions.xml)导入了一些扩展,但不是全部。可以通过适当修改映射文件来获取其他 OpenClinica 扩展——OpenClinica 扩展是数据文件中的标签和属性,它们具有 Openclinica 前缀,其中一些很重要。唯一获取研究受试者 ID 的地方是使用 OpenClinica:StudySubjectId——SubjectKey 指的是内部 OID,即使研究受试者 ID 发生更改,它也不会改变(即使研究受试者 ID 更改为 Test 2,OID 仍然是 SS_TEST)。OpenClinica 生成的 CDISC ODM 1.3 模式也记录在 Openclinica.com/tools/odm-doc 上。
下载 映射文件。
我们的 init.sas 文件包含指向包含以下内容的目录的指针:
- 要导入的数据
- 导入 OpenClinica 扩展数据的映射文件
%let orig=C:\Users\<user>\Documents\<study>\Original Data\;
%let maps=C:\Users\<user>\Documents\<study>\Map\;
我们使用 libname 命令(proc cdisc 在 SAS 9.2 及更高版本中已弃用)导入 CDISC ODM 1.3 XML。import.sas 文件首先导入 CDISC ODM 文件,然后导入 OpenClinica 扩展。
* Import Screening XML file;
filename odm0 "&orig.<filename>.xml";
libname odm0 xml xmltype=CDISCODM FormatActive=YES FormatNoReplace=NO FormatLibrary="WORK";
* Create ODM dataset;
data odm0blood;
set odm0.Blood;
run;
* Import OpenClinica extensions values from Screening XML file;
filename ex0 "&orig.<filename>.xml";
filename sx0emap "&maps.extensions.xml";
libname ex0 xml92 xmlmap=sx0emap access=READONLY;
* Create OpenClinica extensions dataset;
data studyeventdata0;
length __SUBJECTKEY $100.;
set ex0.Studyeventdata;
run;
CDISC ODM 1.3 包含一种名为部分日期的数据类型的规范,SAS 无法导入(当你尝试读取文件时,它会抛出一个错误)。您可以选择在您的研究中不使用部分日期,而是使用文本字段,并通过正则表达式进行验证。或者,您可以在导入之前修改 XML 导出,将部分日期更改为文本字段(见下文)。
SAS 将使用 ITEM_NAME 的缩短版本(截断为 8 个字符)作为字段名称,例如 DMHEIGHT(XML 中 ItemDef 标签的 SASFieldName 属性)。它将使用完整的 ITEM_NAME 本身作为字段标签(XML 中 ItemDef 标签的 Name 属性)。在某些情况下,最好将 DESCRIPTION_LABEL 作为字段标签(XML 中 ItemDef 标签的 Comment 属性)。下面的代码包含一个部分(可注释),它交换了 ItemDef 标签的 Name 和 Comment 属性,以便 DESCRIPTION_LABEL 作为标签导入。
SAS 不喜欢包含 OpenClinica 前缀的长度超过 32 个字符的字段名称(例如,I_HTBAS_BLD_1STDOSESTUDYMEDSGIVEN)。你可能希望使用 较短的名称(例如,8 个字符)用于新的研究,但如果你有一个旧的研究,你可能需要将长的字段名称替换为较短的版本。
OpenClinica 可以导出 DTD 中未定义的实体(见 此 issuetracker 错误——需要 OpenClinica 登录)。该脚本正确地转义了开头的&符号。
下面的脚本直接修改了 CDISC ODM XML。对于 CTIMP(涉及医药产品的临床试验),这会更改您一直在收集的宝贵数据,因此应谨慎操作,并对更改进行验证(确切的方法由您决定)。
- 下面的代码特定于 Windows,并在 Windows 7 上测试过
- Windows 不会运行未签名的 PowerShell 脚本,因此在创建签名的脚本版本之前,您必须手动运行这些命令。
- 如果您注意到 XML 文件的大小翻倍,请不要担心,这是因为 PowerShell 的输出文件使用 Unicode(每个原始字符两个字节)来处理国际字符。原始文件很可能是单字节编码(ASCII 或类似编码)。
- 可以在 Linux 下使用 Perl 重新实现这些正则表达式。
- 将下面的代码复制到记事本(或类似的文本编辑器)中
- 将 $extractdirectory 值更改为指向您的数据提取(路径可以从资源管理器工具栏中获得)。此脚本从现有 .xml 文件创建以 _new.xml 结尾的文件(并忽略以 _new.xml 结尾的现有文件)。
- 在 Windows 开始菜单搜索框中输入 cmd(这将打开一个终端)
- 然后将代码复制粘贴到终端中(右键单击终端将打开上下文菜单,您可以从中粘贴)。
powershell
#########################
#PowerShell script begin#
#########################
#Debug on:
$DebugPreference = "Continue"
#Filename - in single quotes, the inputfile and outputfile
#The outputfile will be overwritten. The inputfile will not be modified.
$extractdirectory = 'C:\Users\<user>\Documents\<Study>\Original Data\'
Get-Item ($extractdirectory + '*.xml') | ForEach-Object {
if (!($_.FullName).EndsWith("_new.xml")) {
#Get the file
$text = [System.IO.File]::ReadAllText($_.FullName)
#Remove datestamps from the filenames so that the import script doesn't change every export
$modifiedfilename = [regex]::Replace($_.FullName, "(^.+?)D\d+\+\d+.xml",'$1_new.xml')
Write-Host "Fullname: ($_.FullName); modifiedfilename:$modifiedfilename"
#Replaces partialDate with a text type of length 10
$text= [regex]::Replace($text, "(<ItemDef [^>]*?DataType="")partialDate("" SASFieldName[^>]*?>)",'$1text" Length="10$2')
#Switch Comment for Name
$text= [regex]::Replace($text, "(<ItemDef [^>]*? )Name(=""[^>]*?"" )Comment(=""[^>]*?"">)",'$1Comment$2Name$3')
#Replace badly encoded entities, e.g. ≥ (OC sometimes exports entities not in the DTD)
$text= [regex]::Replace($text, "&#(\d+);",'&#$1;')
#Optional: SAS likes names to be 32 characters or less.
#You can manually replace too long variable names with shorter versions:
#$text = $text -replace "I_HTBAS_BLD_1STDOSESTUDYMEDSGIVEN", "I_HTBAS_BLD_1STDOSESTUDYMEDSGIVE"
#Write new file
$text | Out-File $modifiedfilename
}
}
#########################
#PowerShell script end #
#########################
exit
这 OpenClinica 论坛主题 进一步讨论了将数据导入 SAS 的细节。
同样,对于那些对 Stata 感兴趣的人来说,这里有一个将 SPSS 转换为 Stata 的工具:http://openclinica.mcri.edu.au/DMTools/OpenClinica/SPSStoStata.aspx
当数据提取以 SPSS 格式导出时,zip 包含 2 个文件
- 数据,以制表符分隔的格式,命名为 .dat
- 一个 SPSS 语法文件,可以运行以向数据添加值和变量标签,命名为 .sps
大多数情况下,语法文件必须进行编辑,因为它假设 dat 文件位于默认的 SPSS 目录中。如果不是这样,
GET DATA /TYPE = TXT/FILE = 'SPSS_DAT2013-04-19-200700043.dat'
必须更改为类似于
GET DATA /TYPE = TXT/FILE = 'c:\temp\SPSS_DAT2013-04-19-200700043.dat'
还会出现引用日期的错误消息。日期无法正确导入的原因是 .dat 文件和 .sps 文件中的日期格式不同:.dat 文件包含可搜索格式的日期,而 .sps 文件则期望美国日期格式。如果将 spss 语法文件中的所有 ADATE 更改为 SDATE(搜索和替换),那么它应该可以工作。
Linas Silva 在 这个开发者列表主题 (也在这里提供) 提供了一些优秀的 xsl 转换文件。
这些转换可以在完整的 ODM 1.3 xml 提取物上运行,以及附带的 powershell 脚本。CSV powershell 脚本可能是最重要的,因为它将输出 csv 切割成一系列 csv。
或者,转换可以在没有 powershell 的情况下运行,而是使用 OpenClinica 附带的 saxon 库副本。示例语法(全部在一行上)
"path_to_java.exe" -cp "path_to_tomcat\webapps\OpenClinica3141\WEB-INF\lib\saxon-8.7.jar"
net.sf.saxon.Transform -o "output_file_path.ext" "input_xml_file.xml" "path_to_xsl.xsl"
每个 xsl 文件都引用了名为“xml_convert_dynamic_lookup”的重命名映射样式表,该样式表列出了 CRF 和 Item Group 名称组合以及它们在输出中应该重命名的内容。如果没有使用它,数据集名称将默认为 Item Group OID。
对于 SAS 转换,请使用标题为 powershell_perform_SAS_xsl_transforms.ps1 的脚本。这是一个 powershell 脚本,因此您应该以管理员身份打开命令提示符。更改到解压缩脚本和 *.xsl 文件的目录,然后启动 powershell。
cd Yourdrive:\YourPath\ExportODM
powershell
现在您有了 Powershell 提示符,首先您必须设置执行策略
Set-ExecutionPolicy Unrestricted -Scope Process
运行脚本是用一行大代码完成的,使用 7 个参数调用脚本
.\powershell_perform_SAS_xsl_transforms.ps1 "RDP001_ODM_20140311.xml" "xml_convert_sas_map.xsl" "sasmap_rdp001_20140310.map" "xml_convert_sas_data.xsl" "data_rdp1_20140311.xml" "xml_convert_sas_format.xsl" "formatout_20140310.sas"
参数是
- "RDP001_ODM_20140311.xml",这必须是您的 ODM1.3 格式数据提取的名称
- "xml_convert_sas_map.xsl" 是 zip 中的 *.xsl 文件之一,因此不要更改它
- "sasmap_rdp001_20140310.map" 是创建的映射文件,您可以随意命名它
- "xml_convert_sas_data.xsl" 是 zip 中的 *.xsl 文件之一,因此再次:不要更改它
- "data_rdp1_20140311.xml" 是生成的 sas 数据文件
- "xml_convert_sas_format.xsl" 是 zip 中的 *.xsl 文件之一:不要更改它
- "formatout_20140310.sas" 是一个包含关于单选和单选选项信息的 SAS 文件