基于nhanes数据及survey包进行权重数据的分析演示(翻译)

https://stats.oarc.ucla.edu/r/seminars/survey-data-analysis-with-r/

该文由UCLA推出,使用R包survey及美国nhanes数据进行分析演示。

使用 R 进行调查数据分析

1.为什么我们需要调查数据分析软件?
统计软件中的常规程序(不是为调查数据设计的)分析数据,就好像使用简单的随机抽样收集数据一样。对于实验和准实验设计,这正是我们想要的。
然而,很少有调查使用简单随机抽样来收集数据。不仅几乎不可能这样做,而且它不像其他抽样方法那样有效(无论是在财务上还是在统计上)。
当使用简单随机抽样以外的任何抽样方法时,我们通常需要使用调查数据分析软件来考虑用于收集数据的设计与简单随机抽样之间的差异。这是因为抽样设计同时影响点估计值的计算和这些估计值的标准误差。如果忽略抽样设计,例如,如果您在使用另一种类型的抽样设计时假设简单的随机抽样,则点估计值及其标准误差都可能计算不正确。抽样权重将影响点估计值的计算,分层和/或聚类将影响标准误差的计算。忽略聚类可能会导致标准误差被低估,可能导致结果看似具有统计显著性,而实际上并非如此。使用非测量软件和正确指定设计的测量软件获得的点估计值和标准误差的差异将因数据集而异,甚至在使用同一数据集的分析之间也会有所不同。虽然使用非调查软件可以获得相当准确的结果,但没有实用的方法可以事先知道非调查软件的结果会有多远。
2. 抽样设计
大多数人不进行自己的调查。相反,他们使用某些机构或公司收集并向公众提供的调查数据。必须仔细阅读文档,以了解使用哪种抽样设计来收集数据。这一点非常重要,因为对于不同的抽样设计,许多估计值和标准误差的计算方式不同。因此,如果错误地指定了抽样设计,则点估计值和标准误差可能是错误的。
以下是许多采样设计的一些常见特征。
2.1抽样权重Sampling weights:
有几种类型的权重可以与调查相关联。也许最常见的是抽样权重。采样权重是对其进行了一次或多次调整的概率权重。抽样权重和概率权重都用于将样本加权回抽取样本的总体。根据定义,概率权重是由于抽样设计而被包含在样本中的概率的倒数(确定性 PSU 除外,见下文)。概率权重计算为 N/n,其中 N = 总体中的元素数,n = 样本中的元素数。例如,如果总体有 10 个元素,并且通过替换随机抽样 3 个,则概率权重为 10/3 = 3.33。在两阶段设计中,概率权重计算为 f1f2,这意味着第一阶段的采样分数的倒数乘以第二阶段采样分数的倒数。在许多抽样计划下,概率权重的总和将等于总体总数。
虽然许多教科书将在这里结束对概率权重的讨论,但该定义并未完全描述实际调查数据集中包含的抽样权重。相反,采样权重(有时称为“最终权重”)从采样分数的倒数开始,但随后包含其他几个值,例如对单位无响应的校正采样帧中的错误(有时称为非覆盖)、校准和调整。由于这些其他值包含在数据集中包含的概率权重中,因此通常不建议修改采样权重,例如尝试针对特定变量(例如年龄)对其进行标准化。
2.2 分层Strata:
分层是一种将人口分成不同群体的方法,通常是通过性别、种族或 SES 等人口统计变量。人口中的每个元素必须属于一个,并且只能属于一个阶层。一旦定义了地层,就会从每个地层中取样,就好像它独立于所有其他地层一样。例如,如果要按性别对样本进行分层,则对男性和女性的抽样将彼此独立。这意味着男性的概率权重可能与女性的概率权重不同。在大多数情况下,每个层中需要有两个或更多 PSU。分层的目的是减少估计值的标准误差,当因变量在地层中的方差小于整个样本中的方差时,分层效果最有效
2.3 PSU:
这是primary samping unit。这是设计中采样的第一个单元。例如,可以对加利福尼亚州的学区进行抽样,然后对学区内的学校进行抽样。学区将是PSU。如果对来自美国的州进行抽样,然后对每个州内的学区进行抽样,然后对每个州内的学校进行抽样,那么各州将是 PSU。不需要在所有级别的抽样中使用相同的抽样方法。例如,概率与规模成比例的抽样可用于级别 1(选择州),而聚类采样可用于级别 2(选择学区)。在简单随机样本的情况下,PSU 和基本单位是相同的。通常,考虑数据中的聚类(即使用 PSU)会增加点估计的标准误差。相反,忽略 PSU 往往会产生太小的标准误差,从而导致在执行显著性测试时出现误报
2.4 FPC:
这是finite population correction。当抽样分数(相对于总体抽样的元素或受访者数)变大时,将使用此选项。FPC 用于计算估计的标准误差。如果 FPC 的值接近 1,则影响不大,可以安全地忽略。在某些调查数据分析程序中,例如SUDAAN,如果您指定收集数据而不进行替换,则需要此信息(有关“无替换”的定义,请参阅下文)。FPC 的计算公式为 ((N-n)/(N-1))1/2,其中 N 是总体中的元素数,n 是样本中的元素数。若要查看 FPC 对各种比例样本的影响,假设您有一个包含 10,000 个元素的总体。
1 1.0000
10 .9995
100 .9950
500 .9747
1000 .9487
5000 .7071
9000 .3162
2.5 复制权重
复制权重是一系列权重变量,用于更正抽样计划的标准误差。它们与 PSU 和地层变量(使用泰勒级数线性化)具有相同的功能,以校正采样设计估计值的标准误差。许多公共用途数据集现在以复制权重而不是PSU和分层发布,以更安全地保护受访者的身份。理论上,使用 PSU 和地层或复制权重将获得相同的标准误差。创建复制权重有不同的方法;使用的方法由抽样计划确定。最常见的是平衡重复和千斤顶复制重量。您需要仔细阅读调查数据集的文档,以了解数据集中包含的重复重量类型;指定错误的仿品权重类型可能会导致不正确的标准误差。有关复制权重的更多信息,请参阅Stata 库:复制权重。几个统计包,包括Stata,SAS,R,Mplus,SUDAAN和WesVar,允许使用重复权重。关于重复权重的另一个很好的信息来源是Steven G. Heeringa,Brady T. West和Patricia A. Berglund的第二版应用调查数据分析(2017年,CRC出版社)
3. 不使用设计元素的后果
采样设计元素包括采样权重、分层后权重(如果提供)、PSU、分层和复制权重.。所有这些要素很少包含在一个单一的公共数据集中。但是,忽略所包含的设计元素通常会导致不准确的点估计和/或不准确的标准误差。
4. 带或不带更换的取样
在现实世界中收集的大多数样本都是“无替换”收集的。这意味着,一旦选定了受访者进入样本并参与了调查,就不能再次选择该特定受访者进入样本。许多计算会根据收集样品是否更换而变化。因此,像SUDAAN这样的程序要求您指定是否使用我们的采样设计来实现而不替换,如果使用没有替换的采样,则使用FPC,即使FPC的值非常接近1。
5. 基于nhanes数据讲解
对于本次研讨会中的示例,我们将使用NHANES 2011-2012的数据集。数据集和文件可从NHANES网站下载。数据文件可以下载为 SAS.xpt 文件。此处是用于研讨会的 R 脚本。

分析任何调查数据集的第一步是阅读文档。对于许多公共使用的数据集,文档可能相当广泛,有时甚至令人生畏。与其尝试阅读文档“从头到尾”,不如关注一些部分
首先,阅读简介。这通常是“易于阅读”的,并将引导您进入调查。通常有一个部分或章节称为“样本设计和分析指南”,“方差估计”等。这是告诉您调查中包含的设计元素以及如何使用它们的部分。有些甚至给出了示例代码。如果数据集中包含多个采样权重,则会有一些关于何时使用哪一个的说明如果有关于缺失数据或插补的部分或章节,请阅读。这将告诉您如何处理丢失的数据。您还应该阅读有关您打算使用的特定变量的任何文档。正如我们稍后将看到的那样,我们需要查看文档以获取变量的值标签。这一点尤其重要,因为某些值实际上缺少数据代码,您需要执行一些操作,以便 R 不会将这些值视为有效值(否则您将获得一些非常“有趣”的平均值、总计等)。

下载和安装软件包
您只应使用以下install.packages命令一次。这些命令应保留在 R 脚本文件中,但已注释掉(通过在每个命令前放置“#”符号)。

install.packages("haven")
install.packages("survey")
install.packages("jtools")
install.packages("remotes")
remotes::install_github("carlganz/svrepmisc")
下载包后,需要加载它们。这需要在每个 R 会话开始时完成。

library("haven")
library("survey")
library("jtools")
library("remotes")
library("svrepmisc")
将数据读入 R
数据从NHANES网站作为SAS.xpt文件分发。可以使用“外部”包将数据读入 R。该命令将如下所示:

nhanes2012 <- read_dta("D:/data/Seminars/Applied Survey Data Analysis R/nhanes2012_reduced.dta")
变量
我们将在本研讨会的示例中使用大约十几个不同的变量。以下是它们的简要摘要。某些变量已重新编码为二进制变量(值 2 重新编码为值 0)。缺失观测值的计数包括真正缺失的值以及被拒绝和不知道的值。

ridageyr – 考试年龄(以年为单位) – 重新编码;值范围:079 是实际值,80 = 80+ 岁

pad630–您在一个类型的工作日中花多少时间进行中等强度的活动?值范围:10-960,缺少 7053 个观测值

hsq496 – 在过去的 30 天里,你有多少天感到担心、紧张或焦虑?值范围:0-30;3073 个缺失的观测值

女性 – 变量 riagendr 的重新编码;0 = 男性,1 = 女性;无遗漏观测值

dmdborn4– 出生国;1 = 在美国出生,0 = 否则;5 缺失的观察结果

dmdmartl – 婚姻状况;1 = 已婚,2 = 丧偶,3 = 离婚,4 = 分居,5 = 从未结婚,6 = 与伴侣同住;4203 缺失观测值

dmdeduc2–20 +岁成年人的教育水平;1 = 9年级以下,2 = 9-11年级,3 =高中毕业生,GED或同等学历,4 =一些大学或AA学位,5 =大学毕业或以上;4201 缺失观测值

pad675– 在典型的一天中,您花多少时间进行中等强度的运动、健身或娱乐活动?值范围:10-600;6220 个缺失观测值

hsq571 – 在过去的 12 个月中,您是否献过血?0 = 否,1 =;3673 缺失观测值

pad680–您通常在典型的一天中坐着多少时间?值范围:0-1380;2365 个缺失的观测值

paq665– 您是否进行任何中等强度的运动、健身或娱乐活动,导致呼吸或心率连续至少 10 分钟小幅增加?0 = 否,1 =;2329 个缺失的观测值

hsd010– 你会说你的一般健康状况是...;1 = 优秀,2 = 非常好,3 = 良好,4 = 一般,5 =;3064 个缺失的观测值

svydesign函数
在我们开始分析之前,我们需要使用Thomas Lumley编写的“调查”包中的svydesign函数。svydesign函数告诉 R 调查中的设计元素。发出此命令后,您需要做的就是在每个命令中使用包含此信息的对象进行分析。由于2011-2012年NHANES数据是使用采样权重(wtint2yr),PSU变量(sdmvpsu)和分层变量(sdmvstra)发布的,因此我们将使用这些svydesign函数。svydesign函数如下所示:

# nhanes2012 <- read_dta("D:/data/Seminars/Applied Survey Data Analysis R/nhanes2012_reduced.dta")
nhc <- svydesign(id=~sdmvpsu, weights=~wtint2yr,strata=~sdmvstra, nest=TRUE, survey.lonely.psu = "adjust", data=nhanes2012)
nhc
Stratified 1 - level Cluster Sampling design (with replacement)
With (31) clusters.
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra, 
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)
我们可以使用汇总功能获取有关样本的其他信息,例如每个地层的 PSU 数量。

summary(nhc)
Stratified 1 - level Cluster Sampling design (with replacement)
With (31) clusters.
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra, 
    nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)
Probabilities:
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
4.541e-06 2.866e-05 5.526e-05 6.372e-05 8.809e-05 3.011e-04 
Stratum Sizes: 
            90  91  92  93  94  95  96  97  98  99 100 101 102 103
obs        862 998 875 602 688 722 676 608 708 682 700 715 624 296
design.PSU   3   3   3   2   2   2   2   2   2   2   2   2   2   2
actual.PSU   3   3   3   2   2   2   2   2   2   2   2   2   2   2
Data variables:
 [1] "dmdborn4" "dmdeduc2" "dmdmartl" "dmdyrsus" "female"   "hsd010"   "hsq496"  
 [8] "hsq571"   "pad615"   "pad630"   "pad660"   "pad675"   "pad680"   "paq610"  
[15] "paq625"   "paq640"   "paq655"   "paq665"   "paq670"   "paq710"   "paq715"  
[22] "ridageyr" "sdmvpsu"  "sdmvstra" "seqn"     "wtint2yr"
具有连续变量的描述性统计量
我们将从简单的事情开始:计算连续变量的平均值。在这个例子中,我们使用变量ridageyr,这是受访者的年龄。请注意,svymean函数的文档以及提供描述性统计量的其他函数可在名为surveysummary的文档部分中找到。

svymean(~ridageyr, nhc)
           mean     SE
ridageyr   37.185   0.6965
我们还可以得到年龄变量的标准偏差。我们使用函数svysd,它位于jtools包中。

svysd(~ridageyr,design = nhc, na = TRUE)
            std. dev.
ridageyr    22.37
当变量缺少数据时,需要na = TRUE参数。

svymean(~pad630, nhc, na = TRUE)
         mean     SE
pad630   139.89   5.5791
这是另一个例子。

svymean(~hsq496, nhc, na = TRUE)
         mean     SE
hsq496   5.3839   0.19
通过在变量之间放置“+”,可以获得多个变量的均值。请注意,已执行列表删除,因此以下输出中的均值与上面显示的均值不同。

svymean(~ridageyr+pad630+hsq496, nhc, na = TRUE)
            mean      SE
ridageyr    41.9779   0.8212
pad630      139.7228  5.7137
hsq496      5.3739    0.2781
在下面的示例中,获得了平均值、标准差和方差。

svymean(~pad680, nhc, na = TRUE)
          mean     SE
pad680    391.3    5.986
svysd(~pad680,design = nhc, na = TRUE)
         std. dev.
pad680   200.846
svyvar(~pad680, design = nhc, na = TRUE)
          variance     SE
pad680    40339        827.77
cv函数用于获取变异系数。变异系数是标准误差与平均值的比率乘以 100%。它指示相对于总体中平均值的变异性,不受变量测量单位的影响。

cv(svymean(~pad680,design = nhc, na = TRUE))
pad680
pad680   0.01529783
下面是如何获得设计效果(当然)的示例。绝对是两个方差的比率。在分子中,我们有当前样本(包括其所有设计元素)的方差估计值,在分母中,我们有与 SRS 相同大小的假设样本的方差。换句话说,与相同尺寸的SRS相比,绝对告诉您样品的效率如何。如果绝对小于 1,则您的样本比 SRS 更有效;通常 absolute 大于 1。在下面的示例中,绝对是 5.9887。这意味着使用当前抽样计划抽取的样本需要是所需尺寸的六倍,如果样本是通过 SRS 收集的。绝对是特定于变量的,因此某些变量可能具有更大或更小的 Deffs。

svymean(~pad680, nhc, na = TRUE, deff = TRUE)
          mean      SE       DEff
pad680    391.300   5.986    5.9887
分位数是连续变量的有用描述性统计量,尤其是非正态分布的变量。

svyquantile(~hsq496, design = nhc, na = TRUE, c(.25,.5,.75),ci=TRUE)
$quantiles
         0.25   0.5   0.75
hsq496   0      1     5

$CIs
, , hsq496

          0.25   0.5   0.75
(lower    0      1     5
upper)    0      2     7
让我们得到一些二进制变量的描述性统计。我们这里有一些选择。让我们从获取变量 female 的平均值开始,女性的编码为 1,男性的编码为 0。取编码为 0/1 的变量的平均值给出 1 的比例,因此该变量的平均值是女性人口的估计比例。

# means and proportions for binary variables
svymean(~female, nhc)
           mean      SE
female     0.51195   0.0064
We can use the confint function to get the confidence interval around this mean.

confint(svymean(~female, nhc))
         2.5 %       97.5 %
female   0.4993307   0.5245742
However, comment on page 70of the documentation for the survey package, we should use svyciprop rather than confint. There are several options that can be supplied for the method argument. Please see pages 70-71 of the documentation. The likelihood option uses the (Rao-Scott) scaled chi-squared distribution for the log likelihood from a binomial distribution.

svyciprop(~I(female==1), nhc, method="likelihood")
               2.5%    97.5%
I(female == 1) 0.512   0.498 0.53
# li is short for likelihood
svyciprop(~I(female==0), nhc, method="li")
               2.5%    97.5%
I(female == 0) 0.488   0.474 0.5
The logit option fits a logistic regression model and computes a Wald-type interval on the log-odds scale, which is then transformed to the probability scale.

svyciprop(~I(female==1), nhc, method="logit")
               2.5%     97.5%
I(female == 1) 0.512    0.498 0.53
The xlogit option uses a logit transformation of the mean and then back-transforms to the probability scale. This appears to be the method used by SUDAAN and SPSS COMPLEX SAMPLES.

 svyciprop(~I(female==1), nhc, method="xlogit")
               2.5%    97.5%
I(female == 1) 0.512   0.498 0.53
As stated on page 71 of the documentation, the use of the mean option (shortened in the code below to me), reproduces the results given by Stata’s svy: mean command.

svyciprop(~I(female==1), nhc, method="me", df=degf(nhc))
               2.5%    97.5%
I(female == 1) 0.512   0.498 0.53
As stated on page 71 of the documentation, the use of the mean option (shortened in the code below to me), reproduces the results given by Stata’s svy: prop command.

svyciprop(~I(female==1), nhc, method="lo", df=degf(nhc))
               2.5%     97.5%
I(female == 1) 0.512    0.498 0.53
You can also get the proportions of 0s, as shown below.

svyciprop(~I(female==0), nhc, method="mean")
               2.5%    97.5%
I(female == 0) 0.488   0.474 0.5
Below is another way to get the proportions of 1s. The point of these examples is that you can use this type of syntax to get the proportion of any level of a categorical variable.

svyciprop(~I(female==1), nhc, method="mean")
               2.5%    97.5%
I(female == 1) 0.512   0.498 0.53
Finally, let’s see how to get totals. We will use the svytotal function.

svytotal(~dmdborn4,design = nhc, na = TRUE)
             total       SE
dmdborn4     260493506   19670647
In the next example, we will get the coefficient of variation for this total.

cv(svytotal(~dmdborn4,design = nhc, na = TRUE))
         dmdborn4
dmdborn4 0.075513
Let’s get the design effect for the total.

svytotal(~dmdborn4,design = nhc, na = TRUE, deff = TRUE)
             total        SE          DEff
dmdborn4     260493506    19670647   314.9
Descriptive statistics for categorical variables
Let’s see some ways to get descriptive statistics for categorical variables, whether or not these variables are binary. We will start with the table function. In the example below, we get the frequencies for the variable female.

svytable(~female, design = nhc)
female
0           1
149630839   156959842
We can also use the table function to get crosstabulations. We will start with two-way crosstabs.

# 2-way
svytable(~female+dmdborn4, nhc)
dmdborn4
female   0         1
0       22449131   127102676
1       23543299   133390830
In the next example, we use a different syntax to do the same thing. Notice that the output is displayed differently, although the information in the output is the same.

# 2-way
svytable(~interaction(female, dmdborn4), design = nhc)
interaction(female, dmdborn4)
0.0        1.0        0.1         1.1
22449131   23543299   127102676   133390830
Now let’s get a three-way table.

# 3-way
svytable(~interaction(female, dmdborn4, hsq571), design = nhc)
interaction(female, dmdborn4, hsq571)
0.0.0        1.0.0        0.1.0        1.1.0        0.0.1      1.0.1      0.1.1       1.1.1
16994772.6   16101456.8   78140097.2   83984812.9   503957.9   277883.3   7083759.3   6155573.1
Let’s go a little crazy and get a four-way table.

# 4-way
svytable(~interaction(female, dmdborn4, hsq571, paq665), design = nhc)
interaction(female, dmdborn4, hsq571, paq665)
0.0.0.0     1.0.0.0     0.1.0.0     1.1.0.0     0.0.1.0     1.0.1.0     0.1.1.0
9742281.10  9259759.05  41213690.37 43983640.78 314995.28   95874.61    2938039.53
1.1.1.0     0.0.0.1     1.0.0.1     0.1.0.1     1.1.0.1     0.0.1.1     1.0.1.1
2587794.24  7252491.54  6841697.75  36908800.64 40001172.12 188962.61   182008.74
0.1.1.1     1.1.1.1
4145719.79  3567778.91
Although not a descriptive statistic, let’s see how to get a chi-squared test while we are talking about tables. Of course, only a two-way table can be specified.

svychisq(~female+dmdborn4, nhc, statistic="adjWald")

Design-based Wald test of association

data: svychisq(~female + dmdborn4, nhc, statistic = "adjWald")
F = 0.00019185, ndf = 1, ddf = 17, p-value = 0.9891
Graphing of continuous variables
Let’s start with a histogram. By default, the density is shown on the y-axis.

svyhist(~pad630, nhc)
histogram with density

Instead of the density on the y-axis, we can request the count.  Notice the large count of respondents in the last column on the right.  The coding of the ridageyr variable explains this.

svyhist(~ridageyr, nhc, probability = FALSE)
频率直方图

我们还可以创建箱线图。

svyboxplot(~hsq496~1, nhc, all.outliers=TRUE)
箱线图

我们可以通过分组变量来打破箱线图。分组变量必须是一个因子。

svyboxplot(~hsq496~factor(female), nhc, all.outliers=TRUE)
女性箱线图

我们可以制作条形图。在下面的示例中,我们还预览了一些用于子种群分析的语法。

barplt<-svyby(~pad675+pad630, ~female, nhc, na = TRUE, svymean)
barplot(barplt,beside=TRUE,legend=TRUE)
条形图

dotchart(barplt)
点阵图

We can make a scatterplot with the sampling weights corresponding to the bubble size.

svyplot(~pad675+pad630, nhc, style="bubble")
scatterplot

可以制作各种密度和平滑图。下面是一些示例。

smth<-svysmooth(~pad630, design=nhc)
plot(smth)
密度图

dens<-svysmooth(~pad630, design=nhc,bandwidth=30)
plot(dens)
密度图

dens1<-svysmooth(~pad630, design=nhc)
plot(dens1)
密度图

亚群分析
在我们继续描述性统计之前,我们应该停下来讨论亚种群的分析。亚群分析是调查数据和实验数据完全不同的一个地方。如果你有来自实验(或准实验)的数据,并且你想分析来自女性或50岁以上的人的回答,你可以从数据集中删除不需要的案例或使用by:前缀。复杂的调查数据是不同的。使用调查数据,您(几乎)永远不会从数据集中删除任何案例,即使您永远不会在任何分析中使用它们。相反,调查包具有两个选项,可用于正确分析调查数据的子总体。这些选项是 svyby 和 subset.survey.design。subset.survey.design 选项有点像删除不需要的情况(当然,没有真正删除它们),而 svyby 选项与按组处理非常相似,因为结果针对每组 by 变量显示。

但是,首先,让我们花点时间看看为什么从调查数据集中删除案例会如此成问题。有两个公式可用于计算标准误差。当您执行按组处理或从数据集中删除不需要的个案时,将使用一个公式,调查统计人员将其称为条件方法。当子种群的成员不能出现在某些阶层中时,将使用此方法,因此在计算标准误差时不应使用这些地层。在实践中,这在公共使用的复杂调查数据集中很少发生。一个原因是分析师通常不知道哪个变量组合定义了特定的层。

当您使用 svyby 选项时,将使用另一个公式,调查统计学家称之为无条件方法。当子群体的成员可以位于任何地层中时,即使样本数据中的某些地层不包含子群的任何成员,也会使用此方法。由于子种群的成员,所有地层都需要用于标准误差的计算,因此所有数据都必须在数据集中。如果数据集是子集(意味着未包含在子总体中的观测值将从数据集中删除),则无法正确计算估计值的标准误差。使用 svyby 选项时,在计算估计值时仅使用子总体定义的个案,但在计算标准误差时使用所有个案。有关此问题的更多信息,请参阅William G. Cochran(1977)的Sampling Techniques,第三版和J. N. K. Rao (2003)的小面积估计。布雷迪·韦斯特(Brady West)的2009年Stata会议(华盛顿特区)对这个问题进行了很好的描述。

svyby和subset.svy.design都使用该公式表示无条件标准误差。

让我们从计算年龄的平均值开始。

svymean(~ridageyr, nhc)
           mean     SE
ridageyr   37.185   0.6965
现在让我们计算男性和女性的年龄平均值。在此示例中,变量 female是子总体变量。

svyby(~ridageyr, ~female, nhc, svymean)
female   ridageyr   se
0 0      36.22918   0.8431945
1 1      38.09657   0.6713502
您可以使用多个分类变量来定义子总体。为此,请在变量之间放置 +。

svyby(~ridageyr, ~dmdmartl+female, nhc, svymean)
      dmdmartl female   ridageyr   se
1.0   1        0        51.34608   0.7473752
2.0   2        0        67.49342   2.6062013
3.0   3        0        52.42614   0.7270806
4.0   4        0        47.16402   1.2085674
5.0   5        0        33.78962   1.3163405
6.0   6        0        40.55277   1.8945413
1.1   1        1        49.33443   0.6176356
2.1   2        1        71.39812   0.8627829
3.1   3        1        53.22067   0.7138037
4.1   4        1        47.16444   1.2200152
5.1   5        1        33.64747   1.4922117
6.1   6        1        35.94412   1.4423662
在下一个示例中,使用了三个变量。

svyby(~pad630, ~dmdmartl+dmdeduc2+female, nhc, na = TRUE, svymean)
        dmdmartl   dmdeduc2   female  pad630      se
1.1.0   1          1          0       175.26250   28.12358
2.1.0   2          1          0       187.34360   62.96688
3.1.0   3          1          0       0.00000     0.00000
4.1.0   4          1          0       205.13325   35.53482
5.1.0   5          1          0       221.33212   60.76421
6.1.0   6          1          0       188.91514   71.24062
1.2.0   1          2          0       191.89233   18.18910
2.2.0   2          2          0       167.20401   14.10054
3.2.0   3          2          0       238.10555   29.71073
4.2.0   4          2          0       199.08510   38.03347
5.2.0   5          2          0       260.45360   41.06904
6.2.0   6          2          0       257.39812   43.61217
1.3.0   1          3          0       165.88490   9.75834
2.3.0   2          3          0       103.25693   20.07422
3.3.0   3          3          0       159.62009   17.52999
4.3.0   4          3          0       279.83812   48.20102
5.3.0   5          3          0       169.78003   18.53166
6.3.0   6          3          0       215.15772   24.03397
1.4.0   1          4          0       155.18399   13.21638
2.4.0   2          4          0       125.93947   35.75450
3.4.0   3          4          0       271.14720   56.91977
4.4.0   4          4          0       81.12185    29.50234
5.4.0   5          4          0       125.94122   11.38165
6.4.0   6          4          0       198.18129   25.91694
1.5.0   1          5          0       133.26699   10.84879
2.5.0   2          5          0       123.88774   52.93405
3.5.0   3          5          0       181.38341   33.00260
4.5.0   4          5          0       237.32606   84.81068
5.5.0   5          5          0       104.57660   26.15903
6.5.0   6          5          0       105.54748   7.58048
1.1.1   1          1          1       123.18726   33.99413
2.1.1   2          1          1       176.09593   72.50964
3.1.1   3          1          1        54.28887   15.49709
4.1.1   4          1          1       169.35988   80.57609
5.1.1   5          1          1       309.99124   93.15230
6.1.1   6          1          1       120.00000    0.00000
1.2.1   1          2          1       143.36162   14.00536
2.2.1   2          2          1        90.60535   17.21293
3.2.1   3          2          1       163.20222   47.28731
4.2.1   4          2          1       165.84824   46.57393
5.2.1   5          2          1       166.33346   46.45898
6.2.1   6          2          1       144.99504   24.39718
1.3.1   1          3          1       111.80803   12.92772
2.3.1   2          3          1       110.48051   37.21189
3.3.1   3          3          1       145.50738   25.43471
4.3.1   4          3          1       302.02249   117.29823
5.3.1   5          3          1       190.28528   55.64751
6.3.1   6          3          1        98.81543   21.16077
1.4.1   1          4          1       146.28879   22.89246
2.4.1   2          4          1       101.83852   11.74256
3.4.1   3          4          1       129.58833   28.49053
4.4.1   4          4          1       142.53219   26.01105
5.4.1   5          4          1       109.54923   15.62974
6.4.1   6          4          1       152.59225   23.74680
1.5.1   1          5          1        88.91933    8.30694
2.5.1   2          5          1       260.99621   63.18704
3.5.1   3          5          1        76.00663   11.32266
4.5.1   4          5          1       117.92163   34.79595
5.5.1   5          5          1       126.51918   19.29269
6.5.1   6          5          1        89.01130   23.17592
有时你不想要这么多的输出。相反,您只需要特定组的输出。您可以通过使用子集函数创建数据的子总体来获得此信息。在下面的示例中,我们仅获得男性的输出。

smale <- subset(nhc,female == 0)
summary(smale)
Stratified 1 - level Cluster Sampling design (with replacement)
With (31) clusters.
subset(nhc, female == 0)
Probabilities:
Min. 1st Qu. Median Mean 3rd Qu. Max.
5.095e-06 3.044e-05 5.680e-05 6.521e-05 9.250e-05 2.326e-04
Stratum Sizes:
90 91 92 93 94 95 96 97 98 99 100 101 102 103
obs 426 496 452 288 351 355 353 289 352 338 355 357 315 129
design.PSU 3 3 3 2 2 2 2 2 2 2 2 2 2 2
actual.PSU 3 3 3 2 2 2 2 2 2 2 2 2 2 2
Data variables:
[1] "dmdborn4" "dmdeduc2" "dmdmartl" "dmdyrsus" "female" "hsd010" "hsq496"
[8] "hsq571" "pad615" "pad630" "pad660" "pad675" "pad680" "paq610"
[15] "paq625" "paq640" "paq655" "paq665" "paq670" "paq710" "paq715"
[22] "ridageyr" "sdmvpsu" "sdmvstra" "seqn" "wtint2yr"
svymean(~ridageyr,design=smale)
           mean     SE
ridageyr   36.229   0.8432
模型
可以使用复杂的调查数据运行各种统计模型。除了少数例外,这些分析的结果可以解释为具有实验或准实验数据的相同分析的结果。例如,如果使用加权数据运行 OLS 回归,则假设已正确指定采样计划,则回归系数将完全解释为任何其他 OLS 回归系数。各种逻辑回归模型也是如此,包括二元逻辑回归、有序逻辑回归和多项逻辑回归(本研讨会中没有这方面的示例)。这些模型的大多数假设也是相同的。但是,一些假设(例如关于 OLS 回归中残差正态性的假设)通常没有意义,因为复杂调查数据通常会出现较大的样本量。

T 检验
让我们开始做一些简单的统计。单样本、配对样本和独立样本 t 检验可以使用svyttest函数运行。

单样本 t 检验如下所示。

svyttest(pad675~0, nhc, na = TRUE)

	Design-based one-sample t-test

data:  pad675 ~ 0
t = 40.447, df = 16, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 63.84046 70.90254
sample estimates:
   mean 
67.3715
在下面的配对样本 t 检验示例中,“I”用于告诉 R 将部分保留在括号中“按原样”,这意味着在两个变量之间进行减法。因此,该公式意味着

svyttest(I(pad660-pad675)~0, nhc, na = TRUE)

Design-based one-sample t-test

data: I(pad660 - pad675) ~ 0
t = 3.3059, df = 16, p-value = 0.004464
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
2.718683 12.437915
sample estimates:
mean
7.578299
现在让我们运行一个独立样本 t 检验。

svyttest(pad630~female, nhc)

Design-based t-test

data: pad630 ~ female
t = -5.6277, df = 16, p-value = 3.779e-05
alternative hypothesis: true difference in mean is not equal to 0
95 percent confidence interval:
-45.76433 -22.12149
sample estimates:
difference in mean
-33.94291
您可能知道,独立样本 t 检验检验两组均值差值为 0 的原假设。考虑此类 t 检验的另一种方法是将其视为具有单个二元预测变量的线性回归。截距将是参考组的平均值,系数将是两个组之间的差值。

我们将像以前一样从运行t-test 函数开始,然后使用svyglm 函数复制结果,该函数可用于运行线性回归。svyby函数与covmat参数一起使用,将元素保存到矩阵中,以便我们可以使用svycontrast函数减去值。这个例子的目的不是要详细阐述t检验的观点,而是要展示如何获取值矩阵,然后在一个简单的例子中将这些值与svycontrast函数进行比较,其中答案是已知的。

svyttest(ridageyr~female, nhc)

Design-based t-test

data: ridageyr ~ female
t = 2.9691, df = 16, p-value = 0.009043
alternative hypothesis: true difference in mean is not equal to 0
95 percent confidence interval:
0.634692 3.100076
sample estimates:
difference in mean
1.867384
summary(svyglm(ridageyr~female, design=nhc))

Call:
svyglm(formula = ridageyr ~ female, design = nhc)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 36.2292 0.8432 42.967 < 2e-16 ***
female 1.8674 0.6289 2.969 0.00904 **
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 499.5325)

Number of Fisher Scoring iterations: 2
a <- svyby(~ridageyr, ~female, nhc, na.rm.by = TRUE, svymean, covmat = TRUE)
vcov(a)
0           1
0 0.7109769 0.3830638
1 0.3830638 0.4507111
a
female  ridageyr   se
0 0     36.22918   0.8431945
1 1     38.09657   0.6713502
svycontrast(a, c( -1, 1))
          contrast   SE
contrast  1.8674     0.6289
        # 4.589723 - 6.153479
此示例与前面的示例类似,只是此处使用了svypredmeans函数。

summary(svyglm(pad630~female, design=nhc))

Call:
svyglm(formula = pad630 ~ female, design = nhc)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
            Estimate   Std. Error   t value   Pr(>|t|)
(Intercept) 155.627    7.008        22.206    1.90e-13 ***
female      -33.943    6.031        -5.628    3.78e-05 ***
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 21951.7)

Number of Fisher Scoring iterations: 2
请注意,如果要获取变量的预测均值,则变量 female不能位于模型中。

ttest1 <- (svyglm(ridageyr~1, design=nhc))
summary(ttest1)

Call:
svyglm(formula = ridageyr ~ 1, design = nhc)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
            Estimate   Std. Error   t value   Pr(>|t|)
(Intercept) 37.1852    0.6965       53.39     <2e-16 ***
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 500.4039)

Number of Fisher Scoring iterations: 2
The variable female is used here to get the predicted means for each level of female.

svypredmeans(ttest1, ~female)
   mean    SE
0  36.229  0.8432
1  38.097  0.6714
tt<-svyttest(pad630~female, nhc)
tt

Design-based t-test

data: pad630 ~ female
t = -5.6277, df = 16, p-value = 3.779e-05
alternative hypothesis: true difference in mean is not equal to 0
95 percent confidence interval:
-45.76433 -22.12149
sample estimates:
difference in mean
-33.94291
We can get the confidence interval around the difference. In this example, we get the 90% confidence interval.

confint(tt, level=0.9)
[1] -43.67864 -24.20718
attr(,"conf.level")
[1] 0.9
Multiple linear regression
We need to use the summary function to get the standard errors, test statistics and p-values. Let’s start with a model that has no interaction terms.  The outcome variable will be pad630, and the predictors will be female and hsq571.

summary(svyglm(pad630~female+hsq571, design=nhc, na.action = na.omit))

Call:
svyglm(formula = pad630 ~ female + hsq571, design = nhc, na.action = na.omit)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
            Estimate   Std. Error t value   Pr(>|t|)
(Intercept) 164.707    6.595      24.975    1.24e-13 ***
female      -39.296    6.325      -6.212    1.66e-05 ***
hsq571      -11.722    20.267     -0.578    0.572
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 23558.77)

Number of Fisher Scoring iterations: 2
Now let’s add an interaction between the two predictor variables.

summary(svyglm(pad630~female*hsq571, design=nhc, na.action = na.omit))

Call:
svyglm(formula = pad630 ~ female * hsq571, design = nhc, na.action = na.omit)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
               Estimate   Std. Error  t value   Pr(>|t|)
(Intercept)     167.107   6.847       24.404    7.13e-13 ***
female          -44.520   6.827       -6.521    1.35e-05 ***
hsq571          -40.975   18.282      -2.241    0.04174 *
female:hsq571   67.630    19.484       3.471    0.00374 **
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 23441.51)

Number of Fisher Scoring iterations: 2
glm1 <- (svyglm(pad630~female*hsq571, design=nhc, na.action = na.omit))
glm1
Stratified 1 - level Cluster Sampling design (with replacement)
With (31) clusters.
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Call: svyglm(formula = pad630 ~ female * hsq571, design = nhc, na.action = na.omit)

Coefficients:
(Intercept)   female   hsq571   female:hsq571
 167.11      -44.52    -40.97   67.63

Degrees of Freedom: 1672 Total (i.e. Null); 14 Residual
(8083 observations deleted due to missingness)
Null Deviance: 40340000
Residual Deviance: 39190000 AIC: 21580
confint(glm1)
                2.5 %       97.5 %
(Intercept)     153.68606   180.527513
female          -57.89966   -31.139511
hsq571          -76.80715   -5.141942
female:hsq571    29.44252   105.817225
This example is just like the previous one, only here factor notation is used. This is important when the categorical predictor has more than two levels.

summary(svyglm(pad630~factor(female)*factor(dmdmartl), design=nhc, na.action = na.omit))

Call:
svyglm(formula = pad630 ~ factor(female) * factor(dmdmartl), 
    design = nhc, na.action = na.omit)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra, 
    nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
                                    Estimate    Std. Error   t value   Pr(>|t|)    
(Intercept)                         156.694      8.766        17.876    1.97e-06 ***
factor(female)1                     -38.069      12.438       -3.061    0.0222 *  
factor(dmdmartl)2                   -24.083      23.185       -1.039    0.3390    
factor(dmdmartl)3                    52.729      28.804        1.831    0.1169    
factor(dmdmartl)4                    31.274      32.355        0.967    0.3711    
factor(dmdmartl)5                   -10.271      13.330       -0.771    0.4702    
factor(dmdmartl)6                    44.728      16.959        2.637    0.0387 *  
factor(female)1:factor(dmdmartl)2    26.414      28.913        0.914    0.3962    
factor(female)1:factor(dmdmartl)3   -46.720      43.539       -1.073    0.3245    
factor(female)1:factor(dmdmartl)4    51.033      51.334        0.994    0.3585    
factor(female)1:factor(dmdmartl)5    23.355      18.086        1.291    0.2441    
factor(female)1:factor(dmdmartl)6   -40.780      25.360       -1.608    0.1589    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 23215.65)

Number of Fisher Scoring iterations: 2

ols1 <- (svyglm(pad630~1, design=nhc, na.action = na.omit))
predmarg<-svypredmeans(ols1, ~interaction(female,dmdmartl))
predmarg
      mean      SE
1.1   118.63    9.5904
0.6   201.42   13.4189
0.1   156.69    8.7656
0.5   146.42   12.3533
1.5   131.71   13.3056
1.4   200.93   52.4999
1.6   122.57   14.8851
0.3   209.42   27.2862
1.2   120.96   11.1044
1.3   124.63   15.5059
0.4   187.97   38.8611
0.2   132.61   20.7758
Non-parametric tests
Non-parametric tests can also be done. Let’s start with a Wilcoxon signed rank test, which is the non-parametric analog of an independent-samples t-test.

wil <- svyranktest(hsq496~female, design = nhc, na = TRUE, test = c("wilcoxon"))
wil

Design-based KruskalWallis test

data: hsq496 ~ female
t = 6.3291, df = 16, p-value = 1.002e-05
alternative hypothesis: true difference in mean rank score is not equal to 0
sample estimates:
difference in mean rank score
0.06896535
This is an example of a median test.

mtest <- svyranktest(hsq496~female, design = nhc, na = TRUE, test=("median"))
mtest

Design-based median test

data: hsq496 ~ female
t = 4.9504, df = 16, p-value = 0.0001446
alternative hypothesis: true difference in mean rank score is not equal to 0
sample estimates:
difference in mean rank score
0.11726
This is an example of a Kruskal Wallis test, which is the non-parametric analog of a one-way ANOVA.

kwtest <- svyranktest(hsq496~female, design = nhc, na = TRUE, test=("KruskalWallis"))
kwtest

Design-based KruskalWallis test

data: hsq496 ~ female
t = 6.3291, df = 16, p-value = 1.002e-05
alternative hypothesis: true difference in mean rank score is not equal to 0
sample estimates:
difference in mean rank score
0.06896535
Logistic regression
Let’s see a few examples of logistic regression.

logit1 <- (svyglm(paq665~factor(hsd010)+ridageyr, family=quasibinomial, design=nhc, na.action = na.omit))
summary(logit1)

Call:
svyglm(formula = paq665 ~ factor(hsd010) + ridageyr, design = nhc,
family = quasibinomial, na.action = na.omit)

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.717830 0.123638 5.806 8.40e-05 ***
factor(hsd010)2 -0.053653 0.099863 -0.537 0.600902
factor(hsd010)3 -0.541820 0.104759 -5.172 0.000232 ***
factor(hsd010)4 -0.981956 0.103744 -9.465 6.46e-07 ***
factor(hsd010)5 -1.882124 0.201158 -9.356 7.31e-07 ***
ridageyr -0.009443 0.002191 -4.311 0.001013 **
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 1.219511)

Number of Fisher Scoring iterations: 4
In the next example, we will run the logistic regression on a subpopulation (respondents over age 20).

subset1 <- subset(nhc, ridageyr > 20)
logit2 <- (svyglm(paq665~factor(hsd010)+ridageyr, family=quasibinomial, design=subset1, na.action = na.omit))
summary(logit2)

Call:
svyglm(formula = paq665 ~ factor(hsd010) + ridageyr, design = subset1,
family = quasibinomial, na.action = na.omit)

Survey design:
subset(nhc, ridageyr > 20)

Coefficients:
                   Estimate   Std. Error    t value    Pr(>|t|)
(Intercept)        0.86401    0.17432       4.956      0.000333 ***
factor(hsd010)2   -0.10723    0.11507      -0.932      0.369739
factor(hsd010)3   -0.59868    0.11209      -5.341      0.000176 ***
factor(hsd010)4   -1.09325    0.11226      -9.738      4.77e-07 ***
factor(hsd010)5   -2.04923    0.19386      -10.571     1.96e-07 ***
ridageyr          -0.01097    0.00292      -3.756      0.002740 **
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasibinomial family taken to be 1.024088)

Number of Fisher Scoring iterations: 4
We can also get a Wald test for a variable in the model.

regTermTest(logit2, ~ridageyr)
Wald test for ridageyr
in svyglm(formula = paq665 ~ factor(hsd010) + ridageyr, design = subset1,
family = quasibinomial, na.action = na.omit)
F = 14.10816 on 1 and 12 df: p= 0.0027404
Instead of getting an R-squared value as you do in linear regression, a pseudo-R-squared is given in logistic regression. There are many different versions of pseudo-R-squared, and two of them are available with the psrsq function.

psrsq(logit2, method = c("Cox-Snell"))
[1] 0.05148869
psrsq(logit2, method = c("Nagelkerke"))
[1] 0.06873682
Ordered logistic regression
Below is an example of an ordered logistic regression. Note that the outcome variable must be a factor.

ologit1 <- svyolr(factor(dmdeduc2)~factor(female)+factor(dmdborn4)+pad680, design = nhc, method = c("logistic"))
summary(ologit1)
Call:
svyolr(factor(dmdeduc2) ~ factor(female) + factor(dmdborn4) +
pad680, design = nhc, method = c("logistic"))

Coefficients:
                    Value          Std. Error       t value
factor(female)1     0.097569476    0.0487417745     2.001763
factor(dmdborn4)1   0.709389138    0.1215114128     5.838045
pad680              0.001923994    0.0001494462    12.874160

Intercepts:
     Value      Std. Error   t value
1|2  -1.5280    0.1541       -9.9183
2|3  -0.3101    0.1562       -1.9849
3|4   0.8095    0.1344        6.0214
4|5   2.2157    0.1210       18.3118
(4234 observations deleted due to missingness)
Poisson regression
Poisson regression can be run. This is a type of count model (meaning that the outcome variable should be a count).

summary(svyglm(pad675~female, design=nhc, family=poisson()))

Call:
svyglm(formula = pad675 ~ female, design = nhc, family = poisson())

Survey design:
svydesign(id = ~sdmvpsu, weights = ~wtint2yr, strata = ~sdmvstra,
nest = TRUE, survey.lonely.psu = "adjust", data = nhanes2012)

Coefficients:
              Estimate   Std. Error   t value    Pr(>|t|)
(Intercept)   4.34112    0.03487      124.491    < 2e-16 ***
female       -0.27148    0.03698       -7.341    1.66e-06 ***
---
Signif. codes: 0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 66.18153)

Number of Fisher Scoring iterations: 5
Other types of analyses available in the survey package
There are many more types of analyses that are available in the survey package and in other packages that work with complex survey data. Below are a few examples.

下面的示例显示了主成分分析 (PCA)。

pc <- svyprcomp(~pad630+pad675+hsd010, design=nhc,scale=TRUE,scores=TRUE)
pc
Standard deviations (1, .., p=3):
[1] 1.3023573 0.8183481 0.7963491

Rotation (n x k) = (3 x 3):
          PC1          PC2          PC3
pad630    0.5769018    -0.5906013   -0.5642468
pad675    0.5690424     0.7861726   -0.2410879
hsd010    0.5859822    -0.1819963    0.7896216
biplot(pc, weight="scaled")
PCA 双标图

这是克朗巴赫阿尔法的一个例子。

svycralpha(~hsq571+dmdborn4, design=nhc, na.rm = TRUE)
*alpha*
0.1339271

原文:
Bruin, J. 2006. newtest: command to compute new test. UCLA:
Statistical Consulting Group. https://stats.oarc.ucla.edu/stata/ado/analysis/.

你可能感兴趣的:(r语言)