跳转到内容

OpenClinica 用户手册/SAS

来自维基教科书,开放世界中的开放书籍

使用 CDISC ODM 1.3 与 OpenClinica 扩展导出到 SAS

[编辑 | 编辑源代码]

SAS 可以导入多种格式的数据。对于 OpenClinica 3.x 版本,由于其可移植性和 SAS 的导入功能,明显的选择是 CDISC ODM 1.3 XML。

CDISC ODM 1.3 XML 与 OpenClinica 扩展格式包括两种类型的数据

  1. CDISC ODM 1.3 规范数据(SAS 的 libname 知道如何导入)
  2. OpenClinica 扩展数据(可以使用映射文件告诉 SAS 如何获取)

大部分有用的数据是 CDISC ODM 1.3,但一些有用的数据“隐藏”在 OpenClinica 扩展部分(例如,出生日期、性别和事件开始日期)。

SAS 默认情况下不导入 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 上。

如何将 CDISC ODM 1.3 XML 与 OpenClinica 扩展导入到 SAS

[编辑 | 编辑源代码]

下载 映射文件

我们的 init.sas 文件包含指向包含以下内容的目录的指针:

  1. 要导入的数据
  2. 导入 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 不喜欢部分日期

[编辑 | 编辑源代码]

CDISC ODM 1.3 包含一种名为部分日期的数据类型的规范,SAS 无法导入(当你尝试读取文件时,它会抛出一个错误)。您可以选择在您的研究中不使用部分日期,而是使用文本字段,并通过正则表达式进行验证。或者,您可以在导入之前修改 XML 导出,将部分日期更改为文本字段(见下文)。

SAS 不导入标签

[编辑 | 编辑源代码]

SAS 将使用 ITEM_NAME 的缩短版本(截断为 8 个字符)作为字段名称,例如 DMHEIGHT(XML 中 ItemDef 标签的 SASFieldName 属性)。它将使用完整的 ITEM_NAME 本身作为字段标签(XML 中 ItemDef 标签的 Name 属性)。在某些情况下,最好将 DESCRIPTION_LABEL 作为字段标签(XML 中 ItemDef 标签的 Comment 属性)。下面的代码包含一个部分(可注释),它交换了 ItemDef 标签的 Name 和 Comment 属性,以便 DESCRIPTION_LABEL 作为标签导入。

字段名称对 SAS 太长

[编辑 | 编辑源代码]

SAS 不喜欢包含 OpenClinica 前缀的长度超过 32 个字符的字段名称(例如,I_HTBAS_BLD_1STDOSESTUDYMEDSGIVEN)。你可能希望使用 较短的名称(例如,8 个字符)用于新的研究,但如果你有一个旧的研究,你可能需要将长的字段名称替换为较短的版本。

OpenClinica (至少 3.0.3) 导出编码错误的实体

[编辑 | 编辑源代码]

OpenClinica 可以导出 DTD 中未定义的实体(见 此 issuetracker 错误——需要 OpenClinica 登录)。该脚本正确地转义了开头的&符号。

清理部分日期、标签和实体的脚本

[编辑 | 编辑源代码]

下面的脚本直接修改了 CDISC ODM XML。对于 CTIMP(涉及医药产品的临床试验),这会更改您一直在收集的宝贵数据,因此应谨慎操作,并对更改进行验证(确切的方法由您决定)。

  • 下面的代码特定于 Windows,并在 Windows 7 上测试过
  • Windows 不会运行未签名的 PowerShell 脚本,因此在创建签名的脚本版本之前,您必须手动运行这些命令。
  • 如果您注意到 XML 文件的大小翻倍,请不要担心,这是因为 PowerShell 的输出文件使用 Unicode(每个原始字符两个字节)来处理国际字符。原始文件很可能是单字节编码(ASCII 或类似编码)。
  • 可以在 Linux 下使用 Perl 重新实现这些正则表达式。

如何运行代码

[编辑 | 编辑源代码]
  1. 将下面的代码复制到记事本(或类似的文本编辑器)中
  2. 将 $extractdirectory 值更改为指向您的数据提取(路径可以从资源管理器工具栏中获得)。此脚本从现有 .xml 文件创建以 _new.xml 结尾的文件(并忽略以 _new.xml 结尾的现有文件)。
  3. 在 Windows 开始菜单搜索框中输入 cmd(这将打开一个终端)
  4. 然后将代码复制粘贴到终端中(右键单击终端将打开上下文菜单,您可以从中粘贴)。
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. &#8805; (OC sometimes exports entities not in the DTD)
		$text= [regex]::Replace($text, "&#(\d+);",'&amp;#$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 的细节。

OpenClinica SPSS 到 Stata

[编辑 | 编辑源代码]

同样,对于那些对 Stata 感兴趣的人来说,这里有一个将 SPSS 转换为 Stata 的工具:http://openclinica.mcri.edu.au/DMTools/OpenClinica/SPSStoStata.aspx


导入 SPSS 时出现错误

[编辑 | 编辑源代码]

当数据提取以 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(搜索和替换),那么它应该可以工作。

SAS、R 和 CSV xsl 转换

[编辑 | 编辑源代码]

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 脚本

[编辑 | 编辑源代码]

对于 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 文件
华夏公益教科书