跳轉到內容

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 檔案
華夏公益教科書