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 檔案