跳转到内容

统计分析:使用 R 的入门 / 第 2 章

来自维基教科书,开放的世界中的开放书籍

数据是统计分析的命脉。本书中一个反复出现的主题是,大多数分析都包括构建合理的统计模型来解释观察到的数据。这需要对数据及其来源有清晰的理解。因此,了解可能遇到的不同类型的数据非常重要。因此,本章重点介绍不同类型的数据,包括检查它们的一些简单方法,以及如何将数据组织成连贯的数据集

第 2 章中的 R 主题

本章中使用的 R 示例旨在向您介绍 R 的基础知识,因此与本书的其他部分相比可能显得枯燥乏味,甚至过于技术性。但是,这里介绍的主题对于理解如何使用 R 来说是必不可少的,尤其重要的是要理解它们。它们假设您对赋值(即存储对象)和函数的概念感到舒适,如之前所述。


最简单的类型的数据只是一组测量值,每个测量值都是一个“数据点”。在统计学中,一组相同类型单个测量值通常称为变量,并且通常会给它们一个名称[1]。变量通常与之相关联大量背景信息:测量值代表什么,为什么要收集以及如何收集,是否存在任何已知的遗漏或异常点,等等。了解或找出此关联信息是任何分析的重要组成部分,以及对变量的检查(例如,通过绘图或其他方法)。

R 中的单个变量

[编辑 | 编辑源代码]
v·d·e

向量

R 中最基本的对象之一是向量,用于存储相同类型(例如数据变量)的多个测量值。向量可以存储几种不同类型的数据。最常见的是数值向量,其中向量的每个元素只是一个数字。其他常用的向量类型是字符向量(其中每个元素都是一段文本)和逻辑向量(其中每个元素都是TRUEFALSE[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.
结果
> state.area #一个 NUMERIC 向量,以平方英里为单位给出美国各州的面积
[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

注意,您输出的第一部分可能与上面的略有不同。根据屏幕的宽度,每行输出的元素数量可能不同。这就是方括号中的数字产生的原因,它们是在向量打印到屏幕上时产生的。这些带括号的数字给出该行上第一个元素的位置,这是一种有用的视觉辅助。例如,查看 state.name 的打印输出,并从第二行开始计数,我们可以知道第八个州是特拉华州。
您可能偶尔需要从头开始创建自己的向量(尽管大多数向量都是从处理现有文件中的数据获得的)。构造向量最常用的函数是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
结果
> c("one", "two", "three", "pi") #制作一个字符向量

[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" 删除对象。删除巨大的未使用的对象是明智的


v·d·e

访问向量元素

我们经常希望访问向量中的某些元素:例如,我们可能只想使用第 10 个元素,或者前 4 个元素,或者根据元素的值选择元素。实现这一点的方法是获取向量并在其前面添加索引运算符 [](即方括号)。如果这些方括号包含
  • 一个或多个正数,那么它的效果是选取向量的那些特定元素
  • 一个或多个负数,那么它的效果是选取整个向量,除了那些元素
  • 一个逻辑向量,那么逻辑向量中的每个元素都指示是否选取(如果为 TRUE)或不选取(如果为 FALSE)原始向量中的等效元素[3]
逻辑向量的使用可能看起来有点复杂。但是,它们非常有用,因为它们是使用比较运算符的关键。例如,可以使用它们来识别哪些美国州面积较小,面积小于(<)10 000 平方英里(如下所示)。
输入
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
结果
> min(state.area) # 这将给出美国最小州的面积...

[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"

虽然 [] 运算符可以用来访问向量的单个元素,但它对于一次访问多个元素特别有用。另一个运算符,双方括号 ([[) 用于专门访问单个元素。虽然对于向量来说不是特别有用,但它对于 # 列表# 数据框 来说非常有用。


v·d·e

逻辑运算

访问向量中的元素 时,我们看到了如何使用涉及小于号(<)的简单逻辑表达式来生成逻辑向量,然后可以使用该向量来选择小于某个值的元素。这种类型的逻辑运算非常有用。除了 < 之外,还有一些其他比较运算符。以下是完整集合(有关更多详细信息,请参见 ?Comparison
  • <(小于)和 <=(小于或等于)
  • >(大于)和 >=(大于或等于)
  • ==(等于[4])和 !=(不等于)

通过使用andornot组合逻辑向量,可以获得更大的灵活性。例如,我们可能想要识别哪些美国州的面积小于 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 中的对应元素。额外的说明是,如果 vectorTvectorFaLogicalVector 短,它们将通过复制扩展到正确的长度。
输入
### 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() 语句,但在处理向量时它不太有用。例如,以下 R 表达式
if(aVariable == 0) then print("zero") else print("not zero")
期望 aVariable 是一个单一数字:如果该数字为 0,则输出 "zero",如果该数字不是 0,则输出 "not zero"[5]。如果 aVariable 是一个包含 2 个或更多值的向量,则只有第一个元素算数:所有其他元素都被忽略[6]。也有一些逻辑运算符会忽略除了向量中的第一个元素之外的所有元素:它们是 && 用于 AND 和 || 用于 OR[7]


v·d·e

缺失数据

在收集数据时,某些数据点通常是未知的。这有多种原因。例如,在分析实验数据时,我们可能会为每个实验记录多个变量(例如温度一天中的时间等),但可能忘记(或无法)在某次记录温度。或者在收集美国州的社会数据时,某些州可能没有记录我们感兴趣的某些统计数据。另一个例子是泰坦尼克号沉没的船舶乘客数据,经过仔细研究,已经确定了船上 2207 人的票务等级,但无法确定 10 多名遇难者的年龄(见 http://www.encyclopedia-titanica.org)。我们可以简单地省略缺失数据,但在许多情况下,我们对某些变量有信息,但对其他变量没有信息。例如,我们可能不希望完全从分析中省略一个美国州,仅仅因为它缺少一个特定感兴趣的数据。出于这个原因,R 提供了一个特殊的值,NA,表示 "不可用"。任何向量,数字、字符或逻辑都可以具有为NA 的元素。这些可以通过函数 "is.na" 来识别。
输入
some.missing <- c(1,NA)
is.na(some.missing)
结果
some.missing <- c(1,NA)

is.na(some.missing) [1] FALSE TRUE

请注意,如果存在缺失数据,一些分析很难进行。你可以使用 "complete.cases" 或 "na.omit" 来构建包含省略缺失值的 datasets。


测量值

[edit | edit source]

任何变量的一个重要特征是它允许具有的值。例如,诸如性别之类的变量只能取有限数量的值(在本例中为 'Male' 和 'Female'),而诸如人体高度之类的变量可以取介于约 0 和 3 米之间的任何数值。这是一种显而易见的背景信息,不能从数据中推断出来,但对分析至关重要。通常只有有限数量的此类信息直接输入到统计分析软件中。与往常一样,考虑这些背景信息非常重要。这通常可以使用这种商品来完成 - 这对于计算机来说是不可用的 - 称为常识。例如,计算机可以用来分析人体高度,而无需意识到一个人被记录为(例如)175 米,而不是 1.75 米。计算机可以盲目地对该变量进行分析,而不会注意到错误,即使对于人类来说,这是显而易见的[8]。这是在分析之前绘制数据的首要原因之一。

分类变量与定量变量

[edit | edit source]

尽管如此,分析软件仍然需要一些关于变量的信息(实际上,通常必须提供这些信息)。几乎所有统计软件包都要求您至少区分**分类**变量(例如*性别*),其中每个数据点取固定数量的预定义“级别”之一,以及**定量**变量(例如*人类身高*),其中每个数据点是定义良好的尺度上的数字。表 2.1 中提供了更多示例。这种区别即使对于像求平均值这样简单的分析也很重要:对定量变量有意义的过程,但对分类变量却很少有意义(“男性”和“女性”的“平均”性别是什么?)。

表 2.1 变量类型的示例。本书后面将使用其中许多变量。
**分类**(也称为“定性”变量或“因素”)
  • 变量*性别*,其中每个数据点是人类的性别(即级别为“男性”或“女性”)
  • 变量*舱位*,其中每个数据点是船上乘客的舱位(级别为“1 等”,“2 等”或“3 等”)
**定量**(也称为“数值”变量或“协变量”)
  • 变量*体重变化*,其中每个点是厌食症患者在固定时间段内的体重变化。
  • 变量*土地面积*,其中每个数据点是一个正数,表示一块土地的面积。
  • 变量*虾*,其中每个数据点是确定虾鸡尾酒制剂中虾的百分比(!)
  • 变量*每年死亡人数*,其中数据点是特定年份中因特定原因死亡的人数。
  • 变量*病例*,其中每个数据点是特定群体中患有特定疾病的人数。除非我们还有一些关于群体规模的度量,否则这可能毫无意义。这可以通过另一个变量(通常标记为*对照*)来实现,该变量指示每个群体中没有患病的人数(这种类型的分组病例/对照研究在医学等领域很常见)。
  • 变量*华氏温度*,其中每个数据点是每月平均温度(以华氏度为单位)。
  • 变量*方向*,其中每个数据点是罗盘方向(以度为单位)。

从原始数据中并不总是立即显而易见变量是分类变量还是定量变量:通常,必须仔细考虑数据的上下文才能做出判断。例如,包含数字 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)。另见截断数据***
  • 无界(*体重减轻*)。



最重要的是循环——通常需要非常不同的分析工具。通常最好以某种方式使其线性(例如,与固定方向的差异)。

间隔数据不能使用比率(除法)。相当罕见

边界:通常有下限。只有上限的情况很少见。两者通常表示百分比。——通常通过变换来处理(例如对数)

计数数据:如果有多个相同的值,可能会影响绘图等。如果为真正的独立计数,则表示误差函数。


不同类型变量之间的区别在图***中进行了总结。请注意,通常还会

数据点的独立性

[编辑 | 编辑源代码]

实际值是否会导致“周围”值的关联(例如时间序列),或者两者是否反映了某些共同的关联(例如块/异质性)。

时间序列 空间数据 块

整合信息

[编辑 | 编辑源代码]

时间序列,非独立性的其他来源

v·d·e

因素

R 中的分类变量存储为一个称为**因素**的特殊向量对象。这与填充了一组名称的字符向量不同(不要将两者混淆)。特别是,必须告诉 R 每个元素只能是若干个已知*级别*之一(例如*男性*或*女性*)。如果您尝试将具有不同未知级别的点放入因素中,R 会报错。当您将因素打印到屏幕上时,R 还会列出该因素可以接受的可能级别(这可能包括不存在的级别)。

factor() 函数创建因子并定义可用级别。默认情况下,级别取自向量中的级别***。实际上,您通常不需要使用 factor(),因为从文件读取数据时,R 默认情况下会假设文本应转换为因子(参见 统计分析:使用 R 的入门/R/数据帧)。您可能需要使用 as.factor()。在内部,R 将级别存储为从 1 开始的数字,但并非总是很清楚哪个数字对应哪个级别,通常不需要知道。

有序变量,即级别具有自然顺序的因子,在 R 中被称为有序因子。它们可以通过创建因子的正常方式创建,但另外指定 ordered=TRUE
输入
state.region #因子示例:请注意级别已打印出来

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. 使用代码可能更容易,例如,女性为 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")) #然后我们可以将其转换为命名级别

结果


v·d·e

矩阵和数组

许多统计理论使用 矩阵代数。虽然本书不需要深入理解矩阵,但了解 R 如何处理它们是有用的。

本质上,矩阵(复数:矩阵)是向量的二维等价物。换句话说,它是一个由数字组成的矩形网格,按行和列排列。在 R 中,可以通过 matrix() 函数创建矩阵对象,该函数第一个参数是用来填充矩阵的数字向量,第二个和第三个参数分别是行数和列数。

R 还可以使用数组对象,它们类似于矩阵,但可以具有超过 2 个维度。这些对于表格特别有用:一种包含根据各种标准分类的数据计数的数组。这些“列联表”的示例是下面显示的 HairEyeColorTitanic 表。

与向量一样,索引运算符 [] 可用于访问矩阵或数组中的单个元素或元素集。这是通过用逗号分隔括号内的数字来完成的。例如,对于矩阵,您需要指定行索引,然后是一个逗号,然后是列索引。如果行索引为空,则假定您想要所有行,列同理。
输入
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


v·d·e

列表

R 对向量中可以包含的内容非常严格。所有元素都需要是相同类型,而且必须是数字类型[9]、逻辑值或文本字符串[10]。如果要创建一个包含不同类型的元素的集合,或者这些元素类型不是允许的向量类型之一,则需要使用列表
输入
l1 <- list(a=1, b=1:3)
l2 <- c(sqrt, log) #
结果


可视化单个变量

[edit | edit source]

在进行正式分析之前,您应该始终执行初始数据分析,其中一部分是对要分析的变量进行检查。如果数据点很少,可以目测扫描数字,但通常通过绘制图表来检查数据更容易。

散点图,例如第 1 章中的那些,可能是最熟悉的图表类型,对于显示两个变量之间的关联模式很有用。这些将在本章后面讨论,但在本节中,我们首先检查可视化单个变量的各种方法。

单个变量的图表,或单变量图表,尤其用于探索变量的分布;即其形状和位置。除了对数据的初始检查外,这些图表的另一个非常常见的用途是查看残差(见图 1.2):在拟合统计模型后剩余的未解释数据部分。关于这些残差分布的假设通常通过绘制它们来检查。

以下图表说明了单变量图表的几种更常见的类型。经典文本是 Tufte(引用:定量信息的视觉展示)。

分类变量

[edit | edit source]

对于分类变量,图表的选择非常简单。最基本的图表只涉及对每个级别的每个数据点进行计数。

图 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]
表 2.2:美国 50 个州的陆地面积(km2
 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
表 2.3:一个经典的数据集,记录了 1875-1894 年普鲁士军队 14 个骑兵团的马踢造成的意外死亡人数[11]
 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) 一维散点图
(b) 一维散点图(抖动)
(b) 颜色说明上四分位数(红色)和下四分位数(绿色)
(c) 基本箱线图。 箱子显示中位数和上下四分位数,而“须”显示数据的整个范围(从最小值到最大值)。
(c) 箱线图颜色与图 2.3b 相对应
(d) 复杂的箱线图。 异常值已从须中排除,并单独绘制。 箱体中的缺口可以让我们了解我们对中位数值的置信度。

表示定量数据的最简单方法是在一条线上绘制点,如图 2.3(a) 所示。 这通常称为“点图,尽管有时也用它来描述其他类型的图(例如图 2.7)[12]。 为了避免混淆,最好将其称为一维散点图。 除了简单之外,一维散点图还有两个优点

  1. 数据中存在的所有信息都保留下来。
  2. 异常值很容易识别。 事实上,能够识别哪些数据点是异常值通常很有用。 一些软件包允许您以交互方式识别点(例如,通过单击图上的点)。 否则,可以对点进行标记,就像在图 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.4:离散定量变量的基本图
(a) 抖动
(b) 堆叠(或参见图 2.5a 中的等效线)
(c) 箱线图对于离散数据也是合理的
(d) 点合并。 这里每个点的面积(不是宽度或高度)与每个位置的绘图点数成比例。 很难判断确切的数字,因此在雪的修改版霍乱图(第 1 章)等图中更有用,在这些图中,根据每个位置的点数赋予位置更大的权重***


在单行上绘图的一个问题是,如果点重复,那么***。 这对于离散数据来说尤其成问题。 注意,这些图没有特别的理由(或已建立的惯例)必须是垂直的。 图 2.2 显示。 堆叠图(图 2.4d)类似于直方图(图 2.5)。

图 2.5:直方图
(a) 直方图式线图(与图 2.4b 比较)
(b) 作为直方图,年份合并为 2 个
(b) 颜色说明上四分位数(红色)和下四分位数(绿色)
(c) 连续数据的直方图
(c) 实际点标记
(d) 更小的箱体宽度
(d) 实际点标记

这提供了另一种将中位数和其他分位数可视化的方式:将面积分成几部分***

图 2.6:密度图
(a) 核密度图
(b) 核密度图(可能会误导,例如,对于均匀分布)


我们可以沿着另一个轴将点间隔开。 例如,如果数据集中点的顺序有意义,我们可以依次绘制每个点。 这适用于 whatsit 的马蹄铁数据。 图 2.6 按年绘制了数据。

图 2.7:对数据点进行排序
(a) 简单的时序图(即按日期/时间排序)
(b) 分位数图(按大小排序的相同点)
(b) 分位数用相应的箱线图说明
(c) 经验累积分布函数(与 (b) 相同,但轴交换并重新缩放)

我们始终可以做的一件事是按其值对数据点进行排序,首先绘制最小的点,依此类推。 这在图 2.3b 中可以看到。 如果所有数据点都等距(并且相互排斥****),我们将看到一条直线。 对数变量的图显示这种变换在某种程度上使间距均匀。 这被称为分位数图,原因如下


当轴交换时,这被称为经验累积分布函数。 未交换的数据对于理解 qq 图很有用。 也用于理解分位数。 中位数等。

变换

[edit | edit source]

我们可以添加一个尺度断点,但更好的选择通常是变换变量。

图 2.8:对数变换的效果


有时,在不同的尺度(例如对数尺度)上绘图可能更有信息量。 我们可以将其可视化,要么作为具有非线性(例如对数)轴的图,要么作为变换变量的传统图(例如,在标准线性轴上绘制 log(my.variable) 的图)。 图 2.1(b) 说明了这一点:左侧轴标记了州的面积,右侧轴标记了州面积的对数。 这种类型的重新缩放可以突出显示变量的完全不同的特征。 在这种情况下,很明显,似乎有一批九个州明显比大多数州小,而阿拉斯加州仍然显得异常大,但德克萨斯州在这方面并不显得那么不寻常。 这也反映在对数变换变量的自动异常值标记中。

对于较小的数字,它们通常具有更高的分辨率。 正如在后面的章节中讨论的那样***,对数尺度对于乘法数据特别有用***。

图 2.8:平方根变换的效果

还有其他常见的变换,例如,平方根变换(通常用于计数数据)。 如果州大小的限制因素是(例如)州的跨度,或与之相关的因素(例如,从一侧到另一侧穿越所需的时间),这可能更适合州面积。 图 2.1c 显示了数据的平方根重新缩放。 你可以看到,从某种意义上说,这比对数变换不那么极端……

v·d·e

单变量图

在 R 中创建粗略的图非常容易,尽管调整它们以获得特定外观可能很耗时。 默认设置通常是合理的。
输入
stripchart(state.areas, xlab="Area (sq. miles)") #see method="stack" & method="jitter" for others
boxplot(sqrt(state.area))
hist(sqrt(state.area))
hist(sqrt(state.area), 25)
plot(density(sqrt(state.area))
plot(UKDriverDeaths)

qqnorm()
ecdf(
结果


数据集

[编辑 | 编辑源代码]

表中的多个变量。 符号。 大多数包都这样做。



双变量绘图

[编辑 | 编辑源代码]

定量与定量

[编辑 | 编辑源代码]

散点图,过度绘图的问题? 向日葵图等等。

定量与分类

[编辑 | 编辑源代码]

小提琴图(和箱线图)

分类与分类

[编辑 | 编辑源代码]

马赛克图


  1. 惯例(这里遵循)是用斜体写变量名
  2. 这些是 R 中的特殊词,不能用作对象的名称。 对象 TFTRUEFALSE 的临时快捷方式,但如果你使用它们,请注意:由于 T 和 F 只是正常的对象名称,你可以通过覆盖它们来改变它们的含义。
  3. 如果逻辑向量比原始向量短,则它会顺序重复,直到达到正确的长度
  4. 请注意,当使用连续(分数)数字时,舍入错误可能意味着计算结果不完全相等,即使它们看起来应该相等。 因此,在使用 == 处理连续数字时应谨慎。 R 提供函数 all.equal 来帮助解决这种情况
  5. 但与 ifelse 不同,它无法处理 NA
  6. 因此,在 if 语句中使用 == 可能不是一个好主意,有关详细信息,请参见 ?"==" 中的说明。
  7. 这些特别是在 R 中更高级的计算机编程中使用,有关详细信息,请参见 "?"&&"
  8. 类似的例子在 Chatfield **** 中给出
  9. 实际上有 3 种允许的数字类型:“正常”数字、复数和简单整数。 本书几乎完全处理前者。
  10. 这并不完全正确,但除非你是计算机专家,否则你不太可能使用最后一种类型:存储“原始”计算机位的元素向量,请参见 ?raw
  11. 此数据集由俄罗斯经济学家冯·博特凯维奇于 1898 年收集,以说明当事件独立发生时所见的模式(这被称为泊松分布)。 这里的表格给出了所有 14 个兵团死亡人数的总和。 对于完整的细分数据集,请参见 统计分析:使用 R 简介/数据集
  12. 像 Wild & Seber 这样的作者称之为点图,但 R 使用术语“dotplot”来指代克利夫兰(1985)点图,如图 2.1(b) 所示。 其他作者 (***) 特别将其用于指代如图 ***(引用)所示的排序(“分位数”)图
  13. 标签通常会遮挡绘图,因此对于仅用于在计算机上查看的绘图,可以以非常小的尺寸打印标签,因此只有在放大时才能看到它们。
  14. 当分位数位于两点之间时,有很多不同的方法来计算分位数的精确值。 请参见 Hyndman 和 Fan (1996)

参考文献

[编辑 | 编辑源代码]

Carifio, J. & Perla, R. (2007)。关于李克特量表和李克特反应格式及其解药的十个常见误解、错误概念、持久的神话和都市传说。社会科学杂志,2,106-116。 http://www.scipub.org/fulltext/jss/jss33106-116.pdf

下一页: 第 3 章 | 上一页: 第 1 章
首页: 统计分析:使用 R 简介
华夏公益教科书