##讀取檔案、提取資料與製造變項
#這是一般 TXT 檔,檔頭有變項名稱
#資料來自於 NHIS 2010 調查,取 1955 年以前出生者(55歲以上)
#視力困難、聽力困難、移動困難與溝通困難變項,分數越高越有困難
dta <- read.table(file = 'data/Quality_of_Life.txt', header = TRUE)
#dta 的類型是資料框架(data frame)
class(dta)
## [1] "data.frame"
#看看dta維度
dim(dta)
## [1] 2077 7
#利用names看看變項名稱
names(dta)
## [1] "性別" "教育" "年齡" "視力" "聽力" "移動" "溝通"
#看前六筆
#程式報表1.1
head(dta)
## 性別 教育 年齡 視力 聽力 移動 溝通
## 1 女 專科 56到60歲 1.00 1.33 1.2 1.0
## 2 女 大學 66到70歲 1.00 1.33 1.2 1.5
## 3 男 大學 76到80歲 1.00 1.33 1.0 1.0
## 4 女 專科 81歲以上 2.67 2.00 1.0 1.0
## 5 男 專科 71到75歲 1.67 2.33 1.0 1.0
## 6 女 大學 56到60歲 1.00 1.00 1.0 1.0
#看看第一列第一欄對應資料,這是類別資料
dta[1, 1]
## [1] 女
## Levels: 女 男
#看看第九列,這是資料框架
#看看第一欄,這「不是」資料框架,是類別
dta[9, ]
## 性別 教育 年齡 視力 聽力 移動 溝通
## 9 女 小學 56到60歲 1.33 1 1.2 1
dta[,1]
dta[,‘教育’] dta[‘教育’]
#還是資料框架
dta[5:7, c('視力', '聽力')]
## 視力 聽力
## 5 1.67 2.33
## 6 1.00 1.00
## 7 1.00 1.33
#檢視資料結構
#程式報表1.2
str(dta)
## 'data.frame': 2077 obs. of 7 variables:
## $ 性別: Factor w/ 2 levels "女","男": 1 1 2 1 2 1 2 1 1 1 ...
## $ 教育: Factor w/ 5 levels "大學","小學",..: 5 1 1 5 5 1 5 5 2 5 ...
## $ 年齡: Factor w/ 6 levels "56到60歲","61到65歲",..: 1 3 5 6 4 1 5 6 1 1 ...
## $ 視力: num 1 1 1 2.67 1.67 1 1 3.67 1.33 1 ...
## $ 聽力: num 1.33 1.33 1.33 2 2.33 1 1.33 1.33 1 1 ...
## $ 移動: num 1.2 1.2 1 1 1 1 1 2.33 1.2 1 ...
## $ 溝通: num 1 1.5 1 1 1 1 1 1 1 1 ...
#看看類別變項的屬性,這是五個水準類別變項
attributes(dta[, '教育'])
## $levels
## [1] "大學" "小學" "初中" "高中" "專科"
##
## $class
## [1] "factor"
#利用table指令看看類別變項分佈
#程式報表1.3
table(dta[, '教育'])
##
## 大學 小學 初中 高中 專科
## 466 107 163 188 1153
#將類別變項轉成數值變項,再利用table
#程式報表1.3
table(as.numeric(dta[, '教育']))
##
## 1 2 3 4 5
## 466 107 163 188 1153
#指令summary是常用指令,可以用在不同物件上
#指令summary作用結果視作用物件而定
#這是用在資料框架上
#程式報表1.4
summary(dta['教育'])
## 教育
## 大學: 466
## 小學: 107
## 初中: 163
## 高中: 188
## 專科:1153
#這是用在類別變項上
#程式報表1.4
summary(dta[, '教育'])
## 大學 小學 初中 高中 專科
## 466 107 163 188 1153
#第一個是數值,第二個是資料框架
#指令t用來轉置矩陣,資料框架被轉成矩陣了
class(dta[, '視力'])
## [1] "numeric"
class(dta['視力'])
## [1] "data.frame"
class(t(dta['視力']))
## [1] "matrix"
#製造平均數兩種寫法
#很直覺,不過如果有遺漏值就麻煩了
dta$功能 <-(dta$視力 + dta$聽力 + dta$移動 + dta$溝通)/4
#有遺漏值會警告我們
tail(dta$功能 <- rowMeans(dta[, 4:7]))
## [1] 1.0000 1.1450 1.4425 1.2500 1.0000 1.0950
###基本統計量(示範應用函數)
#看看資料基本統計
#程式報表1.5
summary(dta)
## 性別 教育 年齡 視力 聽力
## 女:1201 大學: 466 56到60歲:393 Min. :1.000 Min. :1.000
## 男: 876 小學: 107 61到65歲:456 1st Qu.:1.000 1st Qu.:1.000
## 初中: 163 66到70歲:383 Median :1.000 Median :1.000
## 高中: 188 71到75歲:283 Mean :1.208 Mean :1.302
## 專科:1153 76到80歲:217 3rd Qu.:1.330 3rd Qu.:1.330
## 81歲以上:345 Max. :4.000 Max. :4.000
## 移動 溝通 功能
## Min. :1.000 Min. :1.000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
## Median :1.000 Median :1.000 Median :1.165
## Mean :1.515 Mean :1.078 Mean :1.276
## 3rd Qu.:1.800 3rd Qu.:1.000 3rd Qu.:1.417
## Max. :4.000 Max. :4.000 Max. :4.000
#計算健康情形標準差
#利用 with 會讓指令比較好寫好讀
sd(dta$功能)
## [1] 0.3302689
with(dta, sd(功能))
## [1] 0.3302689
#計算偏態
#先安裝再載入套件 moments
#注意,安裝只需要一次,但載入則是每次
install.packages('moments', dependencies = TRUE)
require(moments)
skewness(dta$功能)
#一次計算所有平均數
sapply(dta[, -c(1:3)], mean)
## 視力 聽力 移動 溝通 功能
## 1.208199 1.301815 1.515315 1.077756 1.275772
#定義一個函數,可以同時算出平均數、標準差、偏態與峰度
#一次計算多個變項平均數、標準差、偏態與峰度
#程式報表1.6
my_summary <- function(x) {
require(moments)
funs <- c(mean, sd, skewness, kurtosis)
sapply(funs, function(f) f(x, na.rm = TRUE))
}
sapply(dta[, c(4:8)], my_summary)
## Loading required package: moments
## Warning: package 'moments' was built under R version 3.2.2
## 視力 聽力 移動 溝通 功能
## [1,] 1.2081993 1.3018151 1.5153154 1.0777564 1.2757715
## [2,] 0.4254268 0.4603758 0.7489312 0.2909127 0.3302689
## [3,] 3.0324554 2.1140343 1.4311597 4.9739873 1.8217162
## [4,] 14.4583674 8.6589573 3.9949684 34.3036465 7.7898425
#計算不同教育程度健康功能標準差(兩種寫法)
tapply(dta$功能, dta$年齡, sd)
## 56到60歲 61到65歲 66到70歲 71到75歲 76到80歲 81歲以上
## 0.2915871 0.2925204 0.2703624 0.3217985 0.3057586 0.4122367
with(dta, tapply(功能, 年齡, sd))
## 56到60歲 61到65歲 66到70歲 71到75歲 76到80歲 81歲以上
## 0.2915871 0.2925204 0.2703624 0.3217985 0.3057586 0.4122367
#把不同性別、教育者平均數算出來(兩種寫法)
#第二種寫法把輸出放到 hlth 物件了,沒有輸出到螢幕
#程式報表1.7
with(dta, aggregate(dta[, 4:8], by = list(性別, 年齡), FUN = mean))
## Group.1 Group.2 視力 聽力 移動 溝通 功能
## 1 女 56到60歲 1.201143 1.164667 1.411714 1.052381 1.207476
## 2 男 56到60歲 1.156393 1.243607 1.244754 1.054645 1.174850
## 3 女 61到65歲 1.197425 1.204664 1.466567 1.072761 1.235354
## 4 男 61到65歲 1.169894 1.260160 1.286915 1.098404 1.203843
## 5 女 66到70歲 1.167885 1.210192 1.569375 1.050481 1.249483
## 6 男 66到70歲 1.147314 1.370914 1.329371 1.065714 1.228329
## 7 女 71到75歲 1.238194 1.236065 1.604387 1.077419 1.289016
## 8 男 71到75歲 1.184531 1.352422 1.461328 1.093750 1.273008
## 9 女 76到80歲 1.236484 1.346016 1.606484 1.050781 1.309941
## 10 男 76到80歲 1.142022 1.263933 1.369663 1.134831 1.227612
## 11 女 81歲以上 1.330259 1.480043 1.947802 1.099138 1.464310
## 12 男 81歲以上 1.318142 1.659027 1.892566 1.132743 1.500619
hlth <- aggregate(cbind(視力, 聽力, 移動, 溝通, 功能) ~ 性別 + 年齡,
data = dta, mean)
#把 hlth 的前兩欄命名
names(hlth)[1:2] <- c('性別', '年齡')
#不同性別與年齡的健康功能圖
#圖1.1
with(hlth, dotchart(t(功能), group = 性別, labels = 年齡, xlab = '功能'))
#依移動排序,可以看到男性移動困難退化的較慢
#程式報表1.8
hlth[order(hlth$移動),c(1:2,5)]
## 性別 年齡 移動
## 2 男 56到60歲 1.244754
## 4 男 61到65歲 1.286915
## 6 男 66到70歲 1.329371
## 10 男 76到80歲 1.369663
## 1 女 56到60歲 1.411714
## 8 男 71到75歲 1.461328
## 3 女 61到65歲 1.466567
## 5 女 66到70歲 1.569375
## 7 女 71到75歲 1.604387
## 9 女 76到80歲 1.606484
## 12 男 81歲以上 1.892566
## 11 女 81歲以上 1.947802
###繪圖顯示(示範資料重新結構)
#先將教育程度水準重排
dta$教育 <- factor(dta$教育, levels = c('小學', '初中', '高中', '專科', '大學'))
#不同教育水準健康功能盒鬚圖
#把資料改成水平,更容易比較
#這是直接針對原始資料,而非統計量畫圖
#圖1.2
plot(功能 ~ 教育, data = dta, horizontal = T)
#加上格線,有助比較
grid()
#載入 lattice,準備畫圖
#取出四個要畫圖的變項
require(lattice)
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.2.2
v4 <- dta[, 4:7]
#把變項年齡與性別上的直方圖記下來
p <- lapply(names(v4), function(x) histogram( ~ v4[x] | 年齡 + 性別, data = dta,
xlab = x ))
#利用 gridExtra 排一下四張圖
#圖1.3
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 3.2.2
grid.arrange(p[[1]], p[[2]], p[[3]], p[[4]], nrow = 2, ncol = 2)
#載進 ggplot2,準備畫圖
#Hmisc提供 ggplot2 額外功能
require(ggplot2)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.2.2
require(Hmisc)
## Loading required package: Hmisc
## Warning: package 'Hmisc' was built under R version 3.2.2
## Loading required package: grid
## Loading required package: survival
## Warning: package 'survival' was built under R version 3.2.2
## Loading required package: Formula
## Warning: package 'Formula' was built under R version 3.2.2
##
## Attaching package: 'Hmisc'
##
## The following objects are masked from 'package:base':
##
## format.pval, round.POSIXt, trunc.POSIXt, units
#調整圖形,避免重疊
pd <- position_dodge(width = .3)
#繪製不同年齡生理健康的平均數
#加上利用拔靴法得到的平均數信賴區間
#圖1.4
ggplot(data = dta, aes(x = 年齡, y = 功能, color = 性別) ) +
stat_summary(fun.data = 'mean_cl_boot', position = pd) +
facet_grid(教育 ~ . ) +
labs(x = '年齡', y = '功能分數') +
coord_cartesian(ylim = range(dta['功能'])) +
coord_flip() +
scale_color_manual(values = c('black', 'gray'),
guide = guide_legend(title = '性別', reverse = TRUE)) +
theme_bw() +
theme(legend.justification = c(1, 0), legend.position = c(1, 0))
#載入reshape2、把資料由寬形變長形
require(reshape2)
## Loading required package: reshape2
## Warning: package 'reshape2' was built under R version 3.2.2
dtal <- melt(dta[, -8], variable.name = '功能項目', value.name = '分數')
## Using 性別, 教育, 年齡 as id variables
#看看資料
#程式報表1.9
head(dtal)
## 性別 教育 年齡 功能項目 分數
## 1 女 專科 56到60歲 視力 1.00
## 2 女 大學 66到70歲 視力 1.00
## 3 男 大學 76到80歲 視力 1.00
## 4 女 專科 81歲以上 視力 2.67
## 5 男 專科 71到75歲 視力 1.67
## 6 女 大學 56到60歲 視力 1.00
#不同年齡性別各功能項目平均數
#圖1.5
ggplot(data = dtal, aes(x = 年齡, y = 分數,
shape = reorder(功能項目, 分數, mean), group = reorder(功能項目, 分數))) +
stat_summary(fun.data = mean_se, geom = 'errorbar', position = pd) +
stat_summary(fun.y = mean, geom = 'point', position = pd, size = 3) +
stat_summary(fun.y = mean, geom = 'line', position = pd, linetype = 'dotted') +
facet_grid( . ~ 性別) +
labs(x = '年齡', y = '分數') +
scale_shape_manual(values = c(2, 8, 1, 6),
guide = guide_legend(title = '功能項目', reverse = TRUE)) +
theme_bw() +
theme(legend.justification = c(0, 1), legend.position = c(0, 1))
## ymax not defined: adjusting position using y instead
## ymax not defined: adjusting position using y instead
## ymax not defined: adjusting position using y instead
## ymax not defined: adjusting position using y instead
#不同性別在功能上平均數檢定(兩種寫法)
#程式報表1.10
t.test(功能 ~ 性別, data = dta)
##
## Welch Two Sample t-test
##
## data: 功能 by 性別
## t = 2.6445, df = 1920.4, p-value = 0.008249
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.009959744 0.067135903
## sample estimates:
## mean in group 女 mean in group 男
## 1.292030 1.253482
with(dta, t.test(功能 ~ 性別))
##
## Welch Two Sample t-test
##
## data: 功能 by 性別
## t = 2.6445, df = 1920.4, p-value = 0.008249
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 0.009959744 0.067135903
## sample estimates:
## mean in group 女 mean in group 男
## 1.292030 1.253482