NHANES数据库数据清洗实操指南

官方
阅读 38 0 收藏 0 2025-07-02 10:01:00

数据获取与准备

 数据下载 

访问NHANES官方网站,根据研究目的,确定暴露指标、结局指标和协变量。

选择所需年份的调查周期,下载相关人口统计学、问卷、检查、实验室和饮食数据文件,同一调查周期文件下载至同一文件夹,路径最好不要出现中文。建议同时下载数据文档和代码本。

根据暴露指标、结局指标和协变量各个组成变量,整理所需NHANES数据库中的变量名在Excel表中,方便提取所需变量。

 数据导入 

▶ NHANES数据库下载的数据集为.XPT格式文件,同一周期数据基于SEQN进行合并。

读取示例:

library(foreign)
demo.d <-read_xpt("demo_d.xpt")

▶ 读取并合并同一周期所有数据集

###2005-2006-----

▶ 设置工作路径至周期数据所在文件夹

setwd("NHANESDATA/2005")

▶ 批量读取数据集,并根据SEQN进行合并

filename <-list.files()
 
data05 <-read.xport(filename[1])
 
for(i in2:length(filename)){
 
  file<-read.xport(filename[i], na.strings ="NULL")
 
  data05 <-merge(data05, file, by ='SEQN'all=TRUE) # 修正变量名和参数
 
 
data05$cycle<-"2005-2006"
 

注意:有时候同一变量在不同周期的名字不一样,这个时候就需要改变变量名方便不同周期数据的合并。

names(data05)[names(data05)=="DID070"]<-"DIQ070"

▶ 读取其他周期数据

###2007-2008-----
setwd("NHANESDATA/2007")
filename <-list.files()
data07 <-read.xport(filename[1])
for(i in2:length(filename)){
  file<-read.xport(filename[i], na.strings ="NULL")
  data07 <-merge(data07, file, by ='SEQN'all=TRUE) # 修正变量名和参数
data07$cycle<-"2007-2008"
names(data07)[names(data07)=="DID070"]<-"DIQ070"
###2009-2010-----
setwd("NHANESDATA/2009")
filename <-list.files()
data09 <-read.xport(filename[1])
for(i in2:length(filename)){
  file<-read.xport(filename[i], na.strings ="NULL")
  data09 <-merge(data09, file, by ='SEQN'all=TRUE) # 修正变量名和参数
data09$cycle<-"2009-2010"
 
#2011-2012-----
setwd("NHANESDATA/2011")
filename <-list.files()
data11 <-read.xport(filename[1])
for(i in2:length(filename)){
  file<-read.xport(filename[i], na.strings ="NULL")
  data11 <-merge(data11, file, by ='SEQN'all=TRUE) # 修正变量名和参数
data11$cycle<-"2011-2012"
 
 
#2013-2014-----
setwd("NHANESDATA/2013")
filename <-list.files()
data13 <-read.xport(filename[1])
for(i in2:length(filename)){
  file<-read.xport(filename[i], na.strings ="NULL")
  data13 <-merge(data13, file, by ='SEQN'all=TRUE) # 修正变量名和参数
data13$cycle<-"2013-2014"
 
#2015-2016-----
setwd("NHANESDATA/2015")
filename <-list.files()
data15 <-read.xport(filename[1])
for(i in2:length(filename)){
  file<-read.xport(filename[i], na.strings ="NULL")
  data15 <-merge(data15, file, by ='SEQN'all=TRUE) # 修正变量名和参数
data15$cycle<-"2015-2016"

读取自定义的表格

▶ 内含所需变量在NHANES数据集中变量的code

Var <-readxl::read_xlsx("variable_new.xlsx",sheet=2)
 
var$code
 
提取所需变量
 
data05_cbind<-cbind(data05[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data05))],
 
                   data05[,colnames(data05) %in%var$code])
 
data07_cbind<-cbind(data07[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data07))],
 
                   data07[,colnames(data07)%in%var$code])
 
data09_cbind<-cbind(data09[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data09))],
 
                   data09[,colnames(data09)%in%var$code])
 
data11_cbind<-cbind(data11[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data11))],
 
                   data11[,colnames(data11)%in%var$code])
 
data13_cbind<-cbind(data13[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data13))],
 
                   data13[,colnames(data13)%in%var$code])
 
data15_cbind<-cbind(data15[,grepl('SEQN|SDMVPSU|SDMVSTRA|^WT',colnames(data15))],
 
                   data15[,colnames(data15)%in%var$code])

合并数据

data<-bind_rows(data05_cbind,data07_cbind,data09_cbind,data11_cbind,data13_cbind,data15_cbind)

变量清洗

▶ 已有变量重命名,如年龄、性别、种族等

names(data)[names(data)=="RIDAGEYR"]<-"AGE"
names(data)[names(data)=="RIAGENDR"]<-"GENDER"
names(data)[names(data)=="RIDRETH1"]<-"RACE"

▶  根据参考文献对变量进行定义和分类

如教育程度、吸烟等

#教育程度
 
data$EDU<-ifelse(data$DMDEDUC2==1|data$DMDEDUC2==2,1,
 
                 ifelse(data$DMDEDUC2==3,2,
 
                        ifelse(data$DMDEDUC2==4|data$DMDEDUC2==5,3,NA)))
 
data$EDU<-factor(data$EDU,labels=c("lesshigh","high","abovehigh"))
 
table(data$EDU)
 
##吸烟--------
 
data$smoke<-ifelse(data$SMQ020==2,1,
 
                   ifelse(data$SMQ020==1&data$SMQ040==3,2,
 
                          ifelse(data$SMQ020==1&(data$SMQ040==1| data$SMQ040==2),3,NA)))
 
table(data$smoke)

▶ 根据参考文献对变量进行计算

#如计算SHR
 
data <-data %>%mutate(
 
    SHR =LBDGLUSI/(1.59*LBXGH-2.59))

人群筛选

▶ 根据研究目的选择数据

#如本研究需要下面这些变量
dat1<-select(data,SEQN,SDMVPSU,SDMVSTRA,WTMEC2YR,AGE,RACE,GENDER,EDU,smoke,BMI,SHR)

▶ 根据研究目的选择人群

如年龄大于等于20岁,不存在BMI和SHR缺失的变量

data<-subset(data,AGE>=20)
data<-data[!is.na(data$BMI)&!is.na(data$SHR),]

▶ 根据研究需求对缺失数据进行插补

使用mice包进行多重插补,以随机森林方法为例

library(mice)
dat<-mice(data, #数据集
            method ="rf"#采用随机森林插补
            m=5# 5次插补
            printFlag =FALSE, #不显示历史记录
            seed=1234)

评论列表

发表评论