统计分析:使用 R 的入门 / 第 2 章
数据是统计分析的命脉。本书中一个反复出现的主题是,大多数分析都包括构建合理的统计模型来解释观察到的数据。这需要对数据及其来源有清晰的理解。因此,了解可能遇到的不同类型的数据非常重要。因此,本章重点介绍不同类型的数据,包括检查它们的一些简单方法,以及如何将数据组织成连贯的数据集。
第 2 章中的 R 主题
本章中使用的 R 示例旨在向您介绍 R 的基础知识,因此与本书的其他部分相比可能显得枯燥乏味,甚至过于技术性。但是,这里介绍的主题对于理解如何使用 R 来说是必不可少的,尤其重要的是要理解它们。它们假设您对赋值(即存储对象)和函数的概念感到舒适,如之前所述。
最简单的类型的数据只是一组测量值,每个测量值都是一个“数据点”。在统计学中,一组相同类型单个测量值通常称为变量,并且通常会给它们一个名称[1]。变量通常与之相关联大量背景信息:测量值代表什么,为什么要收集以及如何收集,是否存在任何已知的遗漏或异常点,等等。了解或找出此关联信息是任何分析的重要组成部分,以及对变量的检查(例如,通过绘图或其他方法)。
向量
TRUE
或FALSE
[2])。在本主题中,我们将使用“数据集”包提供的几个示例向量,其中包含有关美国各州的数据(参见?state
)。R 本质上是一个基于向量的程序;事实上,我们在之前的计算中使用的数字只是被视为具有单个元素的向量。这意味着 R 中的大多数基本函数在被赋予向量作为参数时将表现良好,如下所示。state.area #a NUMERIC vector giving the area of US states, in square miles
state.name #a CHARACTER vector (note the quote marks) of state names
sq.km <- state.area*2.59 #Arithmetic works on numeric vectors, e.g. convert sq miles to sq km
sq.km #... the new vector has the calculation applied to each element in turn
sqrt(sq.km) #Many mathematical functions also apply to each element in turn
range(state.area) #But some functions return different length vectors (here, just the max & min).
length(state.area) #and some, like this useful one, just return a single value.
[1] 51609 589757 113909 53104 158693 104247 5009 2057 58560 58876 6450 83557 56400
[14] 36291 56290 82264 40395 48523 33215 10577 8257 58216 84068 47716 69686 147138 [27] 77227 110540 9304 7836 121666 49576 52586 70665 41222 69919 96981 45333 1214 [40] 31055 77047 42244 267339 84916 9609 40815 68192 24181 56154 97914 > state.name #一个 CHARACTER 向量(注意引号)的州名称
[1] "Alabama" "Alaska" "Arizona" "Arkansas" [5] "California" "Colorado" "Connecticut" "Delaware" [9] "Florida" "Georgia" "Hawaii" "Idaho"
[13] "Illinois" "Indiana" "Iowa" "Kansas" [17] "Kentucky" "Louisiana" "Maine" "Maryland" [21] "Massachusetts" "Michigan" "Minnesota" "Mississippi" [25] "Missouri" "Montana" "Nebraska" "Nevada" [29] "New Hampshire" "New Jersey" "New Mexico" "New York" [33] "North Carolina" "North Dakota" "Ohio" "Oklahoma" [37] "Oregon" "Pennsylvania" "The smallest state" "South Carolina" [41] "South Dakota" "Tennessee" "Texas" "Utah" [45] "Vermont" "Virginia" "Washington" "West Virginia" [49] "Wisconsin" "Wyoming" > sq.km <- state.area*2.59 #标准算术运算适用于数值向量,例如将平方英里转换为平方公里 > sq.km #... 给出另一个向量,其中对每个元素依次执行计算
[1] 133667.31 1527470.63 295024.31 137539.36 411014.87 269999.73 12973.31 5327.63 [9] 151670.40 152488.84 16705.50 216412.63 146076.00 93993.69 145791.10 213063.76
[17] 104623.05 125674.57 86026.85 27394.43 21385.63 150779.44 217736.12 123584.44 [25] 180486.74 381087.42 200017.93 286298.60 24097.36 20295.24 315114.94 128401.84 [33] 136197.74 183022.35 106764.98 181090.21 251180.79 117412.47 3144.26 80432.45 [41] 199551.73 109411.96 692408.01 219932.44 24887.31 105710.85 176617.28 62628.79 [49] 145438.86 253597.26 > sqrt(sq.km) #许多数学函数也依次应用于每个元素
[1] 365.60540 1235.90883 543.16140 370.86299 641.10441 519.61498 113.90044 72.99062 [9] 389.44884 390.49819 129.24976 465.20171 382.19890 306.58390 381.82601 461.58830
[17] 323.45487 354.50609 293.30334 165.51263 146.23826 388.30328 466.62203 351.54579 [25] 424.83731 617.32278 447.23364 535.06878 155.23324 142.46136 561.35100 358.33202 [33] 369.04978 427.81111 326.74911 425.54695 501.17940 342.65503 56.07370 283.60615 [41] 446.71213 330.77479 832.11058 468.96955 157.75712 325.13205 420.25859 250.25745 [49] 381.36447 503.58441 > range(state.area) #但是有些函数返回不同长度的向量(此处,仅返回最大值和最小值)。 [1] 1214 589757 > length(state.area) #并且有些函数,像这个有用的函数一样,只返回一个值。 [1] 50
c()
,之所以这样命名是因为它concatenates 对象。但是,如果您希望创建由数字的规则序列组成的向量(例如 2,4,6,8,10,12 或 1,1,2,2,1,1,2,2),则可以使用几个备用函数,包括seq()
、rep()
和:
运算符。c("one", "two", "three", "pi") #Make a character vector
c(1,2,3,pi) #Make a numeric vector
seq(1,3) #Create a sequence of numbers
1:3 #A shortcut for the same thing (but less flexible)
i <- 1:3 #You can store a vector
i
i <- c(i,pi) #To add more elements, you must assign again, e.g. using c()
i
i <- c(i, "text") #A vector cannot contain different data types, so ...
i #... R converts all elements to the same type
i+1 #The numbers are now strings of text: arithmetic is impossible
rep(1, 10) #The "rep" function repeats its first argument
rep(3:1,10) #The first argument can also be a vector
huge.vector <- 0:(10^7) #R can easily cope with very big vectors
#huge.vector #VERY BAD IDEA TO UNCOMMENT THIS, unless you want to print out 10 million numbers
rm(huge.vector) #"rm" removes objects. Deleting huge unused objects is sensible
[1] "one" "two" "three" "pi" > c(1,2,3,pi) #制作一个数值向量 [1] 1.000000 2.000000 3.000000 3.141593 > seq(1,3) #创建一系列数字 [1] 1 2 3 > 1:3 #相同操作的快捷方式(但灵活性较差) [1] 1 2 3 > i <- 1:3 #您可以存储一个向量 > i [1] 1 2 3 > i <- c(i,pi) #要添加更多元素,您必须重新赋值,例如使用 c() > i [1] 1.000000 2.000000 3.000000 3.141593 > i <- c(i, "text") #向量不能包含不同的数据类型,因此... > i #... R 将所有元素转换为相同类型 [1] "1" "2" "3" "3.14159265358979" "text" > i+1 #现在数字是文本字符串:算术运算是不可能的 错误:非数值参数传给二元运算符 > rep(1, 10) #“rep”函数重复其第一个参数
[1] 1 1 1 1 1 1 1 1 1 1
> rep(3:1,10) #第一个参数也可以是一个向量
[1] 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1
> huge.vector <- 0:(10^7) #R 可以轻松应对非常大的向量 > #huge.vector #除非您想打印出 1000 万个数字,否则请不要取消注释此行 > rm(huge.vector) #"rm" 删除对象。删除巨大的未使用的对象是明智的
访问向量元素
[]
(即方括号)。如果这些方括号包含- 一个或多个正数,那么它的效果是选取向量的那些特定元素
- 一个或多个负数,那么它的效果是选取整个向量,除了那些元素
- 一个逻辑向量,那么逻辑向量中的每个元素都指示是否选取(如果为 TRUE)或不选取(如果为 FALSE)原始向量中的等效元素[3]。
min(state.area) #This gives the area of the smallest US state...
which.min(state.area) #... this shows which element it is (the 39th as it happens)
state.name[39] #You can obtain individual elements by using square brackets
state.name[39] <- "THE SMALLEST STATE" #You can replace elements using [] too
state.name #The 39th name ("Rhode Island") should now have been changed
state.name[1:10] #This returns a new vector consisting of only the first 10 states
state.name[-(1:10)] #Using negative numbers gives everything but the first 10 states
state.name[c(1,2,2,1)] #You can also obtain the same element multiple times
###Logical vectors are a little more complicated to get your head round
state.area < 10000 #A LOGICAL vector, identifying which states are small
state.name[state.area < 10000] #So this can be used to select the names of the small states
[1] 1214 > which.min(state.area) # ... 这将显示它是哪个元素(恰好是第 39 个) [1] 39 > state.name[39] # 你可以使用方括号获取单个元素 [1] "Rhode Island" > state.name[39] <- "The smallest state" # 你也可以使用 [] 替换元素 > state.name # 第 39 个名称("Rhode Island")现在应该已更改
[1] "Alabama" "Alaska" "Arizona" "Arkansas" [5] "California" "Colorado" "Connecticut" "Delaware" [9] "Florida" "Georgia" "Hawaii" "Idaho"
[13] "Illinois" "Indiana" "Iowa" "Kansas" [17] "Kentucky" "Louisiana" "Maine" "Maryland" [21] "Massachusetts" "Michigan" "Minnesota" "Mississippi" [25] "Missouri" "Montana" "Nebraska" "Nevada" [29] "New Hampshire" "New Jersey" "New Mexico" "New York" [33] "North Carolina" "North Dakota" "Ohio" "Oklahoma" [37] "Oregon" "Pennsylvania" "THE SMALLEST STATE" "South Carolina" [41] "South Dakota" "Tennessee" "Texas" "Utah" [45] "Vermont" "Virginia" "Washington" "West Virginia" [49] "Wisconsin" "Wyoming" > state.name[1:10] # 这将返回一个新向量,该向量仅包含前 10 个州
[1] "Alabama" "Alaska" "Arizona" "Arkansas" "California" "Colorado" [7] "Connecticut" "Delaware" "Florida" "Georgia"
> state.name[-(1:10)] # 使用负数将给出除了前 10 个州之外的所有州
[1] "Hawaii" "Idaho" "Illinois" "Indiana" [5] "Iowa" "Kansas" "Kentucky" "Louisiana" [9] "Maine" "Maryland" "Massachusetts" "Michigan"
[13] "Minnesota" "Mississippi" "Missouri" "Montana" [17] "Nebraska" "Nevada" "New Hampshire" "New Jersey" [21] "New Mexico" "New York" "North Carolina" "North Dakota" [25] "Ohio" "Oklahoma" "Oregon" "Pennsylvania" [29] "THE SMALLEST STATE" "South Carolina" "South Dakota" "Tennessee" [33] "Texas" "Utah" "Vermont" "Virginia" [37] "Washington" "West Virginia" "Wisconsin" "Wyoming" > state.name[c(1,2,2,1)] # 你也可以多次获取相同的元素 [1] "Alabama" "Alaska" "Alaska" "Alabama" > ### 逻辑向量有点难理解 > state.area < 10000 # 一个逻辑向量,识别哪些州面积较小
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[16] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE [31] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE [46] FALSE FALSE FALSE FALSE FALSE > state.name[state.area < 10000] # 因此,这可以用来选择小州的名称 [1] "Connecticut" "Delaware" "Hawaii" "Massachusetts" [5] "New Hampshire" "New Jersey" "THE SMALLEST STATE" "Vermont"
逻辑运算
<
)的简单逻辑表达式来生成逻辑向量,然后可以使用该向量来选择小于某个值的元素。这种类型的逻辑运算非常有用。除了 <
之外,还有一些其他比较运算符。以下是完整集合(有关更多详细信息,请参见 ?Comparison
)<
(小于)和<=
(小于或等于)>
(大于)和>=
(大于或等于)==
(等于[4])和!=
(不等于)
通过使用and、or 和not组合逻辑向量,可以获得更大的灵活性。例如,我们可能想要识别哪些美国州的面积小于 10 000 或大于 100 000 平方英里,或者识别哪些州的面积大于 100 000 平方英里并且名称很短。下面的代码展示了如何使用以下 R 符号来实现这一点
&
("and")|
("or")!
("not")
在使用逻辑向量时,以下函数特别有用,如下所示
which()
识别逻辑向量中哪些元素为TRUE
sum()
可用于给出逻辑向量中为TRUE
的元素数量。这是因为sum()
强制将其输入转换为数字,如果 TRUE 和 FALSE 转换为数字,它们将分别取值 1 和 0。ifelse()
根据逻辑向量中每个元素是 TRUE 还是 FALSE 返回不同的值。具体来说,诸如ifelse(aLogicalVector, vectorT, vectorF)
之类的命令将采用aLogicalVector
并返回,对于每个为TRUE
的元素,返回vectorT
中的对应元素,对于每个为FALSE
的元素,返回vectorF
中的对应元素。额外的说明是,如果vectorT
或vectorF
比aLogicalVector
短,它们将通过复制扩展到正确的长度。
### In these examples, we'll reuse the American states data, especially the state names
### To remind yourself of them, you might want to look at the vector "state.names"
nchar(state.name) # nchar() returns the number of characters in strings of text ...
nchar(state.name) <= 6 #so this indicates which states have names of 6 letters or fewer
ShortName <- nchar(state.name) <= 6 #store this logical vector for future use
sum(ShortName) #With a logical vector, sum() tells us how many are TRUE (11 here)
which(ShortName) #These are the positions of the 11 elements which have short names
state.name[ShortName] #Use the index operator [] on the original vector to get the names
state.abb[ShortName] #Or even on other vectors (e.g. the 2 letter state abbreviations)
isSmall <- state.area < 10000 #Store a logical vector indicating states <10000 sq. miles
isHuge <- state.area > 100000 #And another for states >100000 square miles in area
sum(isSmall) #there are 8 "small" states
sum(isHuge) #coincidentally, there are also 8 "huge" states
state.name[isSmall | isHuge] # | means OR. So these are states which are small OR huge
state.name[isHuge & ShortName] # & means AND. So these are huge AND with a short name
state.name[isHuge & !ShortName]# ! means NOT. So these are huge and with a longer name
### Examples of ifelse() ###
ifelse(ShortName, state.name, state.abb) #mix short names with abbreviations for long ones
# (think of this as "*if* ShortName is TRUE then use state.name *else* use state.abb)
### Many functions in R increase input vectors to the correct size by duplication ###
ifelse(ShortName, state.name, "tooBIG") #A silly example: the 3rd argument is duplicated
size <- ifelse(isSmall, "small", "large") #A more useful example, for both 2nd & 3rd args
size #might be useful as an indicator variable?
ifelse(size=="large", ifelse(isHuge, "huge", "medium"), "small") #A more complex example
> ### In these examples, we'll reuse the American states data, especially the state names > ### To remind yourself of them, you might want to look at the vector "state.names" > > nchar(state.name) # nchar() returns the number of characters in strings of text ... [1] 7 6 7 8 10 8 11 8 7 7 6 5 8 7 4 6 8 9 5 8 13 8 9 11 8 7 8 6 13 [30] 10 10 8 14 12 4 8 6 12 12 14 12 9 5 4 7 8 10 13 9 7 > nchar(state.name) <= 6 #so this indicates which states have names of 6 letters or fewer [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE [15] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE [29] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE [43] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE > ShortName <- nchar(state.name) <= 6 #store this logical vector for future use > sum(ShortName) #With a logical vector, sum() tells us how many are TRUE (11 here) [1] 11 > which(ShortName) #These are the positions of the 11 elements which have short names [1] 2 11 12 15 16 19 28 35 37 43 44 > state.name[ShortName] #Use the index operator [] on the original vector to get the names [1] "Alaska" "Hawaii" "Idaho" "Iowa" "Kansas" "Maine" "Nevada" "Ohio" "Oregon" [10] "Texas" "Utah" > state.abb[ShortName] #Or even on other vectors (e.g. the 2 letter state abbreviations) [1] "AK" "HI" "ID" "IA" "KS" "ME" "NV" "OH" "OR" "TX" "UT" > > isSmall <- state.area < 10000 #Store a logical vector indicating states <10000 sq. miles > isHuge <- state.area > 100000 #And another for states >100000 square miles in area > sum(isSmall) #there are 8 "small" states [1] 8 > sum(isHuge) #coincidentally, there are also 8 "huge" states [1] 8 > > state.name[isSmall | isHuge] # | means OR. So these are states which are small OR huge [1] "Alaska" "Arizona" "California" "Colorado" "Connecticut" [6] "Delaware" "Hawaii" "Massachusetts" "Montana" "Nevada" [11] "New Hampshire" "New Jersey" "New Mexico" "Rhode Island" "Texas" [16] "Vermont" > state.name[isHuge & ShortName] # & means AND. So these are huge AND with a short name [1] "Alaska" "Nevada" "Texas" > state.name[isHuge & !ShortName]# ! means NOT. So these are huge and with a longer name [1] "Arizona" "California" "Colorado" "Montana" "New Mexico" > > ### Examples of ifelse() ### > > ifelse(ShortName, state.name, state.abb) #mix short names with abbreviations for long ones [1] "AL" "Alaska" "AZ" "AR" "CA" "CO" "CT" "DE" "FL" [10] "GA" "Hawaii" "Idaho" "IL" "IN" "Iowa" "Kansas" "KY" "LA" [19] "Maine" "MD" "MA" "MI" "MN" "MS" "MO" "MT" "NE" [28] "Nevada" "NH" "NJ" "NM" "NY" "NC" "ND" "Ohio" "OK" [37] "Oregon" "PA" "RI" "SC" "SD" "TN" "Texas" "Utah" "VT" [46] "VA" "WA" "WV" "WI" "WY" > # (think of this as "*if* ShortName is TRUE then use state.name *else* use state.abb) > > ### Many functions in R increase input vectors to the correct size by duplication ### > ifelse(ShortName, state.name, "tooBIG") #A silly example: the 3rd argument is duplicated [1] "tooBIG" "Alaska" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" [10] "tooBIG" "Hawaii" "Idaho" "tooBIG" "tooBIG" "Iowa" "Kansas" "tooBIG" "tooBIG" [19] "Maine" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" [28] "Nevada" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "Ohio" "tooBIG" [37] "Oregon" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" "Texas" "Utah" "tooBIG" [46] "tooBIG" "tooBIG" "tooBIG" "tooBIG" "tooBIG" > size <- ifelse(isSmall, "small", "large") #A more useful example, for both 2nd & 3rd args > size #might be useful as an indicator variable? [1] "large" "large" "large" "large" "large" "large" "small" "small" "large" "large" [11] "small" "large" "large" "large" "large" "large" "large" "large" "large" "large" [21] "small" "large" "large" "large" "large" "large" "large" "large" "small" "small" [31] "large" "large" "large" "large" "large" "large" "large" "large" "small" "large" [41] "large" "large" "large" "large" "small" "large" "large" "large" "large" "large" > ifelse(size=="large", ifelse(isHuge, "huge", "medium"), "small") #A more complex example [1] "medium" "huge" "huge" "medium" "huge" "huge" "small" "small" "medium" [10] "medium" "small" "medium" "medium" "medium" "medium" "medium" "medium" "medium" [19] "medium" "medium" "small" "medium" "medium" "medium" "medium" "huge" "medium" [28] "huge" "small" "small" "huge" "medium" "medium" "medium" "medium" "medium" [37] "medium" "medium" "small" "medium" "medium" "medium" "huge" "medium" "small" [46] "medium" "medium" "medium" "medium" "medium"
if()
语句,但在处理向量时它不太有用。例如,以下 R 表达式if(aVariable == 0) then print("zero") else print("not zero")期望
aVariable
是一个单一数字:如果该数字为 0,则输出 "zero",如果该数字不是 0,则输出 "not zero"[5]。如果 aVariable
是一个包含 2 个或更多值的向量,则只有第一个元素算数:所有其他元素都被忽略[6]。也有一些逻辑运算符会忽略除了向量中的第一个元素之外的所有元素:它们是 &&
用于 AND 和 ||
用于 OR[7]。
缺失数据
some.missing <- c(1,NA)
is.na(some.missing)
is.na(some.missing) [1] FALSE TRUE
测量值
[edit | edit source]任何变量的一个重要特征是它允许具有的值。例如,诸如性别之类的变量只能取有限数量的值(在本例中为 'Male' 和 'Female'),而诸如人体高度之类的变量可以取介于约 0 和 3 米之间的任何数值。这是一种显而易见的背景信息,不能从数据中推断出来,但对分析至关重要。通常只有有限数量的此类信息直接输入到统计分析软件中。与往常一样,考虑这些背景信息非常重要。这通常可以使用这种商品来完成 - 这对于计算机来说是不可用的 - 称为常识。例如,计算机可以用来分析人体高度,而无需意识到一个人被记录为(例如)175 米,而不是 1.75 米。计算机可以盲目地对该变量进行分析,而不会注意到错误,即使对于人类来说,这是显而易见的[8]。这是在分析之前绘制数据的首要原因之一。
分类变量与定量变量
[edit | edit source]尽管如此,分析软件仍然需要一些关于变量的信息(实际上,通常必须提供这些信息)。几乎所有统计软件包都要求您至少区分**分类**变量(例如*性别*),其中每个数据点取固定数量的预定义“级别”之一,以及**定量**变量(例如*人类身高*),其中每个数据点是定义良好的尺度上的数字。表 2.1 中提供了更多示例。这种区别即使对于像求平均值这样简单的分析也很重要:对定量变量有意义的过程,但对分类变量却很少有意义(“男性”和“女性”的“平均”性别是什么?)。
**分类**(也称为“定性”变量或“因素”) |
|
---|---|
| |
**定量**(也称为“数值”变量或“协变量”) |
|
| |
|
从原始数据中并不总是立即显而易见变量是分类变量还是定量变量:通常,必须仔细考虑数据的上下文才能做出判断。例如,包含数字 1、2 和 3 的变量似乎是一个数值,但它也可能是一个描述(例如)使用药物 1、药物 2 或药物 3 的医疗处理的分类变量。更罕见的是,看似分类变量(例如颜色(级别“蓝色”、“绿色”、“黄色”、“红色”))可能更好地表示为数值,例如实验中发射的光的波长。同样,根据您要执行的操作,由您做出这种判断。
尽管分类/定量区分很重要(并且在许多教科书中都很突出),但现实并不总是如此清晰。有时将分类变量视为定量变量或反之亦然是合理的。也许最常见的情况是,当分类变量的级别似乎具有自然顺序时,例如表 2.1 中的*舱位*变量,或者问卷调查中经常使用的李克特量表。
在罕见且特定的情况下,并且取决于所提出的问题的性质,可能存在可以分配给每个级别的粗略数值。例如,也许一项调查问卷附带了一个视觉量表,其中李克特类别标记在从“完全同意”到“完全不同意”的范围内。在这种情况下,将分类变量直接转换为定量变量可能是合理的。
更常见的是,级别的顺序是已知的,但无法普遍达成一致的精确值。这种分类变量可以描述为**有序**或**排名**,而不是像*性别*或*自称宗教*这样纯粹是**名义**的。因此,我们可以识别出两种主要的分类变量类型:有序(“序数”)和无序(“名义”),如表 2.1 中的两个示例所示。
尽管分类/定量划分是最重要的划分,但我们还可以进一步细分每种类型(正如我们在讨论分类变量时已经看到的那样)。最常教授的分类是斯蒂文斯 (1946) 提出的。除了将分类变量分为序数和名义类型之外,他还根据所用尺度的性质将定量变量分为两种类型,即**间隔**或**比率**。可以将**循环**变量添加到此分类中。因此,根据测量尺度对定量变量进行分类会导致三种细分(如表 2.1 中的细分所示)。
- 比率数据是最常见的。示例包括距离、时间长度、项目数量等。这些变量是在具有自然零点的尺度上测量的;因为我们可以使用仅包含正整数的数字。
- 间隔数据是在没有自然零点的尺度上测量的。最常见的示例是温度(以摄氏度或华氏度为单位)和日历日期。由于尺度上的零点本质上是任意的,因此这个名称来自这样一个事实,即比率没有意义,而间隔是有意义的。例如,意味着****
- 循环数据是在“环绕”的尺度上测量的,例如*方向*、*时间*、*经度*等。***
斯蒂文斯分类不是对定量变量进行分类的唯一方法。另一个合理的划分认识到了**连续**测量和**离散**测量之间的区别。具体来说,定量变量可以表示以下两种情况:
- 连续数据,其中讨论中间值是有意义的(例如 1.2 小时、12.5% 等)。这包括数据被四舍五入的情况***。
- “离散数据”,其中中间值毫无意义(例如,讨论 1.2 人死亡或 10 人群体中 2.6 例癌症病例没有太大意义)。这些通常是事物的**计数**:这有时被称为**计量**数据。
在实践中,离散数据通常被视为连续数据,尤其是在它们被划分的单位相对较小时。例如,不同国家的人口规模理论上是离散的(你不能有半个人的),但这些值非常大,因此将这些数据视为连续数据可能是合理的。但是,对于较小的值,例如一个家庭的人数,数据是相当“粒度”的,并且值的离散性质变得非常明显。这方面的一个常见结果是存在多个重复值(例如,在大多数数据集中,将会有许多 2 人家庭)。
对定量变量进行分类的第三种方法取决于尺度是否具有上限或下限,甚至两者兼而有之。
- 在一端有界(例如*土地面积*不能低于 0),
- 在两端有界(例如,百分比不能小于 0 或大于 100)。另见截断数据***
- 无界(*体重减轻*)。
最重要的是循环——通常需要非常不同的分析工具。通常最好以某种方式使其线性(例如,与固定方向的差异)。
间隔数据不能使用比率(除法)。相当罕见
边界:通常有下限。只有上限的情况很少见。两者通常表示百分比。——通常通过变换来处理(例如对数)
计数数据:如果有多个相同的值,可能会影响绘图等。如果为真正的独立计数,则表示误差函数。
不同类型变量之间的区别在图***中进行了总结。请注意,通常还会
实际值是否会导致“周围”值的关联(例如时间序列),或者两者是否反映了某些共同的关联(例如块/异质性)。
时间序列 空间数据 块
时间序列,非独立性的其他来源
因素
factor()
函数创建因子并定义可用级别。默认情况下,级别取自向量中的级别***。实际上,您通常不需要使用 factor()
,因为从文件读取数据时,R 默认情况下会假设文本应转换为因子(参见 统计分析:使用 R 的入门/R/数据帧)。您可能需要使用 as.factor()
。在内部,R 将级别存储为从 1 开始的数字,但并非总是很清楚哪个数字对应哪个级别,通常不需要知道。
ordered=TRUE
。state.name #这不是因子 state.name[1] <- "Any text" #您可以在字符向量中替换文本 state.region[1] <- "Any text" #但您不能在因子中替换文本 state.region[1] <- "South" #这可以 state.abb #这不是因子,只是一个字符向量
character.vector <- c("Female", "Female", "Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male", "Male", "Male", "Female", "Female" , "Male", "Female", "Female", "Male", "Male", "Male", "Male", "Female", "Female", "Female", "Female", "Male", "Male", "Male", "Female" , "Male", "Female", "Male", "Male", "Male", "Male", "Male", "Female", "Male", "Male", "Male", "Male", "Female", "Female", "Female") #a bit tedious to do all that typing
- 使用代码可能更容易,例如,女性为 1,男性为 2
Coded <- factor(c(1, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 1)) Gender <- factor(Coded, labels=c("Female", "Male")) #然后我们可以将其转换为命名级别
矩阵和数组
本质上,矩阵(复数:矩阵)是向量的二维等价物。换句话说,它是一个由数字组成的矩形网格,按行和列排列。在 R 中,可以通过 matrix()
函数创建矩阵对象,该函数第一个参数是用来填充矩阵的数字向量,第二个和第三个参数分别是行数和列数。
R 还可以使用数组对象,它们类似于矩阵,但可以具有超过 2 个维度。这些对于表格特别有用:一种包含根据各种标准分类的数据计数的数组。这些“列联表”的示例是下面显示的 HairEyeColor
和 Titanic
表。
[]
可用于访问矩阵或数组中的单个元素或元素集。这是通过用逗号分隔括号内的数字来完成的。例如,对于矩阵,您需要指定行索引,然后是一个逗号,然后是列索引。如果行索引为空,则假定您想要所有行,列同理。m <- matrix(1:12, 3, 4) #Create a 3x4 matrix filled with numbers 1 to 12
m #Display it!
m*2 #Arithmetic, just like with vectors
m[2,3] #Pick out a single element (2nd row, 3rd column)
m[1:2, 2:4] #Or a range (rows 1 and 2, columns 2, 3, and 4.)
m[,1] #If the row index is missing, assume all rows
m[1,] #Same for columns
m[,2] <- 99 #You can assign values to one or more elements
m #See!
###Some real data, stored as "arrays"
HairEyeColor #A 3D array
HairEyeColor[,,1] #Select only the males to make it a 2D matrix
Titanic #A 4D array
Titanic[1:3,"Male","Adult",] #A matrix of only the adult male passengers
> m <- matrix(1:12, 3, 4) #Create a 3x4 matrix filled with numbers 1 to 12 > m #Display it! [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 > m*2 #Arithmetic, just like with vectors [,1] [,2] [,3] [,4] [1,] 2 8 14 20 [2,] 4 10 16 22 [3,] 6 12 18 24 > m[2,3] #Pick out a single element (2nd row, 3rd column) [1] 8 > m[1:2, 2:4] #Or a range (rows 1 and 2, columns 2, 3, and 4.) [,1] [,2] [,3] [1,] 4 7 10 [2,] 5 8 11 > m[,1] #If the row index is missing, assume all rows [1] 1 2 3 > m[1,] #Same for columns [1] 1 4 7 10 > m[,2] <- 99 #You can assign values to one or more elements > m #See! [,1] [,2] [,3] [,4] [1,] 1 99 7 10 [2,] 2 99 8 11 [3,] 3 99 9 12 > ###Some real data, stored as "arrays" > HairEyeColor #A 3D array , , Sex = Male Eye Hair Brown Blue Hazel Green Black 32 11 10 3 Brown 53 50 25 15 Red 10 10 7 7 Blond 3 30 5 8 , , Sex = Female Eye Hair Brown Blue Hazel Green Black 36 9 5 2 Brown 66 34 29 14 Red 16 7 7 7 Blond 4 64 5 8 > HairEyeColor[,,1] #Select only the males to make it a 2D matrix Eye Hair Brown Blue Hazel Green Black 32 11 10 3 Brown 53 50 25 15 Red 10 10 7 7 Blond 3 30 5 8 > Titanic #A 4D array , , Age = Child, Survived = No Sex Class Male Female 1st 0 0 2nd 0 0 3rd 35 17 Crew 0 0 , , Age = Adult, Survived = No Sex Class Male Female 1st 118 4 2nd 154 13 3rd 387 89 Crew 670 3 , , Age = Child, Survived = Yes Sex Class Male Female 1st 5 1 2nd 11 13 3rd 13 14 Crew 0 0 , , Age = Adult, Survived = Yes Sex Class Male Female 1st 57 140 2nd 14 80 3rd 75 76 Crew 192 20 > Titanic[1:3,"Male","Adult",] #A matrix of only the adult male passengers Survived Class No Yes 1st 118 57 2nd 154 14 3rd 387 75
列表
可视化单个变量
[edit | edit source]在进行正式分析之前,您应该始终执行初始数据分析,其中一部分是对要分析的变量进行检查。如果数据点很少,可以目测扫描数字,但通常通过绘制图表来检查数据更容易。
散点图,例如第 1 章中的那些,可能是最熟悉的图表类型,对于显示两个变量之间的关联模式很有用。这些将在本章后面讨论,但在本节中,我们首先检查可视化单个变量的各种方法。
单个变量的图表,或单变量图表,尤其用于探索变量的分布;即其形状和位置。除了对数据的初始检查外,这些图表的另一个非常常见的用途是查看残差(见图 1.2):在拟合统计模型后剩余的未解释数据部分。关于这些残差分布的假设通常通过绘制它们来检查。
以下图表说明了单变量图表的几种更常见的类型。经典文本是 Tufte(引用:定量信息的视觉展示)。
分类变量
[edit | edit source]对于分类变量,图表的选择非常简单。最基本的图表只涉及对每个级别的每个数据点进行计数。
-
(a) 一个简单的条形图,显示不同类别中的数据点数量
-
(b) 另一种选择,适用于高度有序的数据:符号标记数据点数量,线条暗示中间值在概念上是可能的
图 2.1(a) 将这些计数显示为条形图;另一种可能是使用点,如图 2.1(b) 所示。在性别的情况下,级别的顺序并不重要:'男性'或'女性'都可以排在前面。在班级的情况下,级别在图表中使用了自然顺序。在极端情况下,如果中间级别可能是有意义的,或者您希望强调级别之间的模式,则连接点用线可能会比较合理。为了说明目的,图 2.1(b) 中已经这样做了,尽管读者可能质疑它在这种情况下是否合适。
plot(1:length(Gender), Gender, yaxs="n"); axis(2, 1:2, levels(Gender), las=1)
在某些情况下,我们可能对数据点的实际序列感兴趣。对于时间序列数据尤其如此,但在其他地方也可能相关。例如,在性别的情况下,数据是按照每个孩子出生的顺序记录的。如果我们认为先前的出生会影响随后的出生(在这种情况下不太可能,但如果涉及信息素,则在可能性范围内),那么我们可能希望进行符号逐符号绘制。但是,如果我们正在寻找与时间的关联,那么双变量图表可能更合适***,或者我们对数据的某些特定特征感兴趣(例如重复率),那么还存在其他可能性(doi:10.1016/j.stamet.2007.05.001)。参见时间序列章节
定量变量
[edit | edit source]landArea | |
阿拉巴马州 | 133666 |
---|---|
阿拉斯加州 | 1527463 |
亚利桑那州 | 295022 |
阿肯色州 | 137538 |
加利福尼亚州 | 411012 |
科罗拉多州 | 269998 |
康涅狄格州 | 12973 |
特拉华州 | 5327 |
佛罗里达州 | 151669 |
佐治亚州 | 152488 |
夏威夷州 | 16705 |
爱达荷州 | 216411 |
伊利诺伊州 | 146075 |
印第安纳州 | 93993 |
爱荷华州 | 145790 |
堪萨斯州 | 213062 |
肯塔基州 | 104622 |
路易斯安那州 | 125673 |
缅因州 | 86026 |
马里兰州 | 27394 |
马萨诸塞州 | 21385 |
密歇根州 | 150778 |
明尼苏达州 | 217735 |
密西西比州 | 123583 |
密苏里州 | 180485 |
蒙大拿州 | 381085 |
内布拉斯加州 | 200017 |
内华达州 | 286297 |
新罕布什尔州 | 24097 |
新泽西州 | 20295 |
新墨西哥州 | 315113 |
纽约州 | 128401 |
北卡罗来纳州 | 136197 |
北达科他州 | 183021 |
俄亥俄州 | 106764 |
俄克拉荷马州 | 181089 |
俄勒冈州 | 251179 |
宾夕法尼亚州 | 117411 |
罗德岛州 | 3144 |
南卡罗来纳州 | 80432 |
南达科他州 | 199550 |
田纳西州 | 109411 |
德克萨斯州 | 692404 |
犹他州 | 219931 |
佛蒙特州 | 24887 |
弗吉尼亚州 | 105710 |
华盛顿州 | 176616 |
西弗吉尼亚州 | 62628 |
威斯康星州 | 145438 |
怀俄明州 | 253596 |
deathsPerYear | |
1875 | 3 |
---|---|
1876 | 5 |
1877 | 7 |
1878 | 9 |
1879 | 10 |
1880 | 18 |
1881 | 6 |
1882 | 14 |
1883 | 11 |
1884 | 9 |
1885 | 5 |
1886 | 11 |
1887 | 15 |
1888 | 6 |
1889 | 11 |
1890 | 17 |
1891 | 12 |
1892 | 15 |
1893 | 8 |
1894 | 4 |
定量变量可以用比分类变量更多的方式绘制。下面讨论了一些最常见的单变量图表,使用美国 50 个州的陆地面积作为连续变量的示例,以及一个关于马踢造成的死亡人数的著名数据集作为离散变量的示例。这些数据在表 2.2 和 2.3 中列出
某些类型的数据包含许多具有相同值的數據点。 这对于计数数据来说尤其如此,其中计数数量很少(例如,后代数量)。
在这些类型的图中,我们可能希望寻找 3 件事
- 在某种程度上看起来极端的点(这些被称为异常值)。 异常值通常揭示了数据收集中的错误,即使它们没有,它们也可能对进一步的分析产生不成比例的影响。 如果事实证明它们不是由于明显的错误造成的,则一种选择是从分析中删除它们,但这会带来自身的问题/
- 分布的形状和位置(例如,正态,双峰等)
- 与已知分布的相似性(QQ)
我们将主要关注变量“landArea”***
表示定量数据的最简单方法是在一条线上绘制点,如图 2.3(a) 所示。 这通常称为“点图,尽管有时也用它来描述其他类型的图(例如图 2.7)[12]。 为了避免混淆,最好将其称为一维散点图。 除了简单之外,一维散点图还有两个优点
- 数据中存在的所有信息都保留下来。
- 异常值很容易识别。 事实上,能够识别哪些数据点是异常值通常很有用。 一些软件包允许您以交互方式识别点(例如,通过单击图上的点)。 否则,可以对点进行标记,就像在图 2.3a 中对一些异常点所做的那样[13]。
对于大型数据集,一维散点图效果不佳。 图 2.3(a) 仅包含 50 个点。 即使如此,也很难对数据的总体印象进行总结,(正如谚语所说)“只见树木,不见森林”。 这部分是因为有些点几乎重叠,但也因为大量紧密排列的点。 数据的特征往往可以通过某种方式对其进行总结来更好地探索。
图 2.3(b) 显示了一个朝着更佳图表的步骤。 为了缓解点互相遮挡的问题,它们已被移位,或抖动侧向一个小的随机量。 更重要的是,数据已通过划分成四分位数来进行总结(并相应地着色,以便于解释)。 面积最大的州的四分之一被涂成红色。 最小的州的四分之一被涂成绿色。
更一般地,我们可以谈论数据的分位数[14]。 红线代表 75% 分位数:75% 的点位于其下方。 绿线代表 25% 分位数:25% 的点位于其下方。 这些线之间的距离称为四分位距(IQR),是数据散布的一种度量。 粗黑线有一个特殊的名称:中位数。 它标志着数据的中间位置,即 50% 分位数:50% 的点位于其上方,50% 的点位于其下方。 分位数相对于其他汇总度量的一个主要优势是,它们对异常值或尺度变化相对不敏感****。
图 2.3(c) 是一个广泛使用的统计汇总图的彩色版本:箱线图。 这里它被着色以显示与图 2.3(b) 的对应关系。 箱子标记了数据的四分位数,中位数标记在箱子内。 如果中位数没有位于箱子内中心位置,这通常表明数据以某种方式倾斜。 箱子两侧的线被称为“须”,它们总结了位于上四分位数和下四分位数之外的数据。 在这种情况下,须已简单地扩展到观察到的最大值和最小值。
图 2.3(d) 是相同数据的更复杂的箱线图。 这里,缺口已绘制在箱子上:这些对比较不同箱线图中的中位数很有用。 须已被缩短,因此它们不包含被认为是异常值的点。 有多种方法可以自动定义这些异常值。 此图基于一个约定,该约定将异常值视为距离箱子两侧 1.5 倍 IQR 以上的点。 但是,通过目视检查识别和检查有趣的点(包括异常值)通常更有信息量。 例如,在图 2.1a 中,很明显阿拉斯加州和(在较小程度上)德克萨斯州是不寻常的大州,但加利福尼亚州(通过此自动程序识别为异常值)并不那么与众不同。
在单行上绘图的一个问题是,如果点重复,那么***。 这对于离散数据来说尤其成问题。 注意,这些图没有特别的理由(或已建立的惯例)必须是垂直的。 图 2.2 显示。 堆叠图(图 2.4d)类似于直方图(图 2.5)。
这提供了另一种将中位数和其他分位数可视化的方式:将面积分成几部分***
我们可以沿着另一个轴将点间隔开。 例如,如果数据集中点的顺序有意义,我们可以依次绘制每个点。 这适用于 whatsit 的马蹄铁数据。 图 2.6 按年绘制了数据。
我们始终可以做的一件事是按其值对数据点进行排序,首先绘制最小的点,依此类推。 这在图 2.3b 中可以看到。 如果所有数据点都等距(并且相互排斥****),我们将看到一条直线。 对数变量的图显示这种变换在某种程度上使间距均匀。 这被称为分位数图,原因如下
当轴交换时,这被称为经验累积分布函数。 未交换的数据对于理解 qq 图很有用。 也用于理解分位数。 中位数等。
变换
[edit | edit source]我们可以添加一个尺度断点,但更好的选择通常是变换变量。
有时,在不同的尺度(例如对数尺度)上绘图可能更有信息量。 我们可以将其可视化,要么作为具有非线性(例如对数)轴的图,要么作为变换变量的传统图(例如,在标准线性轴上绘制 log(my.variable) 的图)。 图 2.1(b) 说明了这一点:左侧轴标记了州的面积,右侧轴标记了州面积的对数。 这种类型的重新缩放可以突出显示变量的完全不同的特征。 在这种情况下,很明显,似乎有一批九个州明显比大多数州小,而阿拉斯加州仍然显得异常大,但德克萨斯州在这方面并不显得那么不寻常。 这也反映在对数变换变量的自动异常值标记中。
对于较小的数字,它们通常具有更高的分辨率。 正如在后面的章节中讨论的那样***,对数尺度对于乘法数据特别有用***。
还有其他常见的变换,例如,平方根变换(通常用于计数数据)。 如果州大小的限制因素是(例如)州的跨度,或与之相关的因素(例如,从一侧到另一侧穿越所需的时间),这可能更适合州面积。 图 2.1c 显示了数据的平方根重新缩放。 你可以看到,从某种意义上说,这比对数变换不那么极端……
单变量图
表中的多个变量。 符号。 大多数包都这样做。
散点图,过度绘图的问题? 向日葵图等等。
小提琴图(和箱线图)
马赛克图
- ↑ 惯例(这里遵循)是用斜体写变量名
- ↑ 这些是 R 中的特殊词,不能用作对象的名称。 对象
T
和F
是TRUE
和FALSE
的临时快捷方式,但如果你使用它们,请注意:由于 T 和 F 只是正常的对象名称,你可以通过覆盖它们来改变它们的含义。 - ↑ 如果逻辑向量比原始向量短,则它会顺序重复,直到达到正确的长度
- ↑ 请注意,当使用连续(分数)数字时,舍入错误可能意味着计算结果不完全相等,即使它们看起来应该相等。 因此,在使用 == 处理连续数字时应谨慎。 R 提供函数 all.equal 来帮助解决这种情况
- ↑ 但与
ifelse
不同,它无法处理NA
值 - ↑ 因此,在
if
语句中使用==
可能不是一个好主意,有关详细信息,请参见?"=="
中的说明。 - ↑ 这些特别是在 R 中更高级的计算机编程中使用,有关详细信息,请参见 "?"&&"
- ↑ 类似的例子在 Chatfield **** 中给出
- ↑ 实际上有 3 种允许的数字类型:“正常”数字、复数和简单整数。 本书几乎完全处理前者。
- ↑ 这并不完全正确,但除非你是计算机专家,否则你不太可能使用最后一种类型:存储“原始”计算机位的元素向量,请参见
?raw
- ↑ 此数据集由俄罗斯经济学家冯·博特凯维奇于 1898 年收集,以说明当事件独立发生时所见的模式(这被称为泊松分布)。 这里的表格给出了所有 14 个兵团死亡人数的总和。 对于完整的细分数据集,请参见 统计分析:使用 R 简介/数据集
- ↑ 像 Wild & Seber 这样的作者称之为点图,但 R 使用术语“dotplot”来指代克利夫兰(1985)点图,如图 2.1(b) 所示。 其他作者 (***) 特别将其用于指代如图 ***(引用)所示的排序(“分位数”)图
- ↑ 标签通常会遮挡绘图,因此对于仅用于在计算机上查看的绘图,可以以非常小的尺寸打印标签,因此只有在放大时才能看到它们。
- ↑ 当分位数位于两点之间时,有很多不同的方法来计算分位数的精确值。 请参见 Hyndman 和 Fan (1996)
Carifio, J. & Perla, R. (2007)。关于李克特量表和李克特反应格式及其解药的十个常见误解、错误概念、持久的神话和都市传说。社会科学杂志,2,106-116。 http://www.scipub.org/fulltext/jss/jss33106-116.pdf