2017年2月26日 星期日

The Marshmallow Test -- 別急著吃棉花糖

小時候的人格發展會對未來有什麼影響?之前有個實驗叫 marshmallow test,是測驗小孩的自制力的(影片見下面),試驗方式是讓小孩待在一個房間,給他一顆棉花糖,然後跟他說二十分鐘後會回房間來看他,如果他沒有吃掉棉花糖的話,就再給他一顆棉花糖,看小孩會不會在那二十分鐘內忍住不吃棉花糖。



這個試驗是哥倫比亞大學(Columbia University)的心理學家 Dr. Walter Mischel 發明的,他花了近五十年用這個方法研究小孩的自制力和未來發展的關係,發現能等 15-20 分鐘而得到兩顆棉花糖的小朋友,未來在學校和工作上的發展比立刻吃掉棉花糖的小朋友好,而且這項特質可以維持四十年。他把研究結果寫成一本書,就叫 The Marshmallow Test: Mastering Self-Control。這個研究開始於 1960 年代後期,在史丹佛大學的 Bing Nursery School,當時有 562 位四歲小孩參與了棉花糖試驗,小孩跟影片裡的一樣,房間裡只有他和那顆棉花糖,小孩可以選擇立刻吃掉,或是等十五分鐘得到兩顆棉花糖(delay of gratification) [1, 3-4]。

除了棉花糖試驗,還有進階版的試驗:給小孩一些玩具,跟他說等等會陪他玩,但是要他先自己待在房間裡,如果小孩搖鈴的話,研究者會立刻回房間。研究者在離開房間前會給小孩看兩種不等量的 treats (例如一顆棉花糖對兩顆棉花糖,或是兩個餅乾對五個 pretzels),如果小孩在研究者回房間前就搖鈴,那就只能得到比較少量或是他比較不喜歡的那個 treats,如果能夠不搖鈴一直等到研究者回房間(通常是十五分鐘左右),小孩就能得到較多量或他比較喜歡的 treats。小孩願意等待的時間為 delay time,delay time 越長的小孩是指他能等待以拿到他想要的東西或是更多的 rewards,例如雙倍的棉花糖。在後來的 follow-up 研究裡,發現在棉花糖或進階版的試驗裡,能夠等待(也就是 delay time 比較長)的小孩,在青少年時期的表現也比較好 -- 比較能有計劃地做事,比較能夠清楚表達自己的想法,也比較能夠處理自己的情緒和壓力 [3]。

這個實驗有趣的地方是你以為有 rewards 的話小孩的 delay time 會比較久,因為他們會為了比較大的 rewards 告訴自己要等到最後,但其實不見得如此。當小孩看不見 rewards 的時候,他們能夠等待的平均時間是 11 分鐘以上,但是當 rewards (例如上面影片中的棉花糖)出現在視線範圍內的話,他們能夠等待的時間就少於六分鐘。如果小孩看不見 rewards,但是卻用其他方法暗示他去想 rewards,等待的時間也會縮短。這個時候能夠觀察到小孩是如何控制自己 delay time (也就是如何自制),有的小孩會避免自己去看 rewards,有的小孩會開始跟自己說話,或是開始唱歌等等,讓自己的注意力從 rewards 上面移開,由這些行為大概也可以預測到小孩長大後是否能處理自己的情緒和壓力。

這五百多位小孩在 1993 年(約二十幾歲)和 2003 年(約三十幾歲)的時候再度被聯絡做 self-reported asesessments,有接受 follow-up 的人,在這三個測試中(四歲、二十幾歲和三十幾歲)自制力分數比平均高和比平均低的人在四十幾歲的時候再度接受測驗。在三個測驗中皆比平均高的人稱作 high-delay group,也就是四歲時在試驗中 delay time 比較長的,共有六十位。分數比平均低的是 low-delay group,共有 57 位。這一百多位中,最後有 59 位接受成人(四十幾歲)的自制力測驗和 fMRI 掃描,結果發表在 PNAS [4]。

小時候無法抗拒誘惑、無法等待而吃掉棉花糖的小孩(low delayers),在二、三十歲時顯現出來的自制力比可以等的小孩(high delayers)的低,即便到四十歲也跟小時候一樣比 high delayer 較無法抗拒誘惑 [3]。兩組人(high delayers, low delayers)面對誘惑力低的事情或事物時的自制力差不多,但是面對誘惑力高的,low delayers 的自制力顯得比較低,比較無法抗拒誘惑。和四歲時的測驗不一樣的是四十歲時用的不再是棉花糖,而是人的不同表情。跟四歲時候相比,四十歲的比較像是測試拒絕別人給的邀請或誘惑的能力(positive social cues),之前也有研究顯示 low delayers 到中年比較無法自制,而造成身心不健康的狀態,例如高 BMI, 藥物上癮,無法被拒絕(對「被拒絕」產生焦慮或過度反應)。

那小時候的人格會被環境影響,進而影響未來發展嗎?這個月有個研究是針對三、四歲的小孩,看同儕對小孩人格的影響,主要觀察他們的 Positive Emotionality (PE), Negative Emotionality (NE) 和 Effortful Control (EC) [2, 5]。

PE: activity, sociability, impulsivity, positive affect, anticipatory positive affect
NE: sadness, anger, fear
EC: engagement, initiative, compliance, attentional control

他們找到一間 preschool,每個禮拜去四天,觀察兩個班級(分別為三歲班和四歲班)共 53 位小孩連續一年的時間。觀察員有兩組,一組觀察小孩的性情(temperaments),另一組觀察每個小孩玩的對象(playmates)。結果發現 PE 的高低不會影響小孩的交友情況,但是他們會選擇和自己個性相近的小孩玩(PE 相近的),快樂的小孩會選擇和時常情緒快樂的小孩一起玩,經常有負面情緒的小孩(NE 高的)則比較不會和其他小孩一起玩。另外,小孩的正面情緒會互相影響,會變得和玩伴的 PE 更相近,但不會被玩伴的負面情緒(例如生氣、害怕或難過)影響。有趣的是,雖然 EC 和 PE 相關,但是小孩不會選擇和自己 EC 相近的,不過隨著時間,小孩的 EC 會變得和玩伴的 EC 相近,例如高 EC 小孩的行為(做事比較有計劃,或是個性比較隨和、有彈性)會鼓勵玩伴變得跟他一樣,或是反之,低 EC 小孩(比較不專注或是個性比較衝動)讓同伴變得跟他一樣低 [5]。

有的父母從小就幫小孩挑 preschool 或幼稚園的學校,要找私立的,說環境很重要。個人覺得環境也許重要,但小孩的個性也佔很大因素,如果小孩是容易被影響的,或是自制力比較低的(low delayers),也許環境很重要,需要靠高 EC 的小孩的影響讓自己的 EC 變高,但是念私立學校對 low-delayer 的小孩的影響是正面的還是負面的很難講。而小孩如果本身自制力就高的話,念哪其實沒差。另外,我覺得 NE 高的小孩如果去唸私立的,NE 可能會因為環境壓力變更高,更交不到朋友或被排擠之類的吧。

ps. 這個棉花糖試驗讓我想到一個在生活中算滿常會發生的事,就是吃東西的時候,你會先吃喜歡吃的,還是會把喜歡吃的留到最後再吃?(在沒人跟你搶的情況下)



Articles:

1. Science News / Willpower endures

2.  Science News / A preschooler’s bubbly personality may rub off on friends


Papers:
3. W Mischel et al, Delay of gratification in children. Science (1989)

4. BJ Casey et al, Behavioral and neural correlates of delay of gratification 40 years later. PNAS (2011)

5. JW Neal et al, Codevelopment of Preschoolers’ Temperament Traits and Social Play Networks Over an Entire School Year. J Personality & Social Psychology (2017)











2017年2月14日 星期二

讓你不忘東忘西的方法

不知道大家有沒有那種要做某件事情(例如要去寄東西、要去買什麼等等),記了半天結果睡覺前才想到忘了做的情況呢?這篇文章提供了一個辦法,就是和某個一定會見到東西做連結,當作是一個記憶點的 cue。

賓州大學和哈佛合作了一個簡單的實驗,就是派助理在某個禮拜二去劍橋(哈佛所在的那個劍橋)的某間咖啡廳門口發 coupon,上面寫說兩天後也就是禮拜四,拿個那個 coupon 去店裡消費就可以少 $1。他們發了五百張 coupon,其中有一半(250張)只寫付帳時記得拿給收銀員,另一半寫禮拜四那天會有一個外星人坐在收銀員旁邊,還放了一個外星人的圖片在 coupon 傳單上面。結果兩天後,有 24% 拿到外星人傳單的人記得用 coupon,沒有外星人的只有 17% 的人記得。在這個實驗裡,外星人被用來和 coupon 做連結,是一個記憶的 cue,你不用特別去記,但是看到他就會記得要用 coupon。

不過即使這個記憶方法有效,但仍有許多人不覺得自己需要這樣做。例如他們其中一個實驗,是看參與者願不願花 $0.03 在一個記憶的 cue (大象符號)上面來提醒他們去賺 $0.60。在這個實驗裡,參與者會做一份約費時 15 分鐘的線上問卷,每答對一題可得 $0.03,然後在前面幾題中,會有一頁出現大象圖片,說如果你在第 11 頁的題目選 E 就可以得到 $0.60,然後問你願不願意花 $0.03 得到一個記憶 cue,記憶的 cue 就是會在第 11 頁出現大象符號提醒你選 E,但是只有 53% 的人願意花 $0.03 去得到那個 cue,結果就是願意花 $0.03 的人最後得到 $0.60 的比例比不願意花 $0.03 的高很多。

這感覺是個不錯的方法,印象中之前有試過,就是告訴自己如果看見什麼就要記得幹嘛,然後把那個東西隨身帶著(例如掛在包包上),每次拿包包或打開包包看見那個東西就會提醒自己要幹嘛。不過說實在的,現在手機功能這麼多,我通常都會記在 Google Calendar,設個時間,時間一到就會跳出來提醒,如果當下沒時間做,就把提醒往後移到一個有空的時間,科技無敵啊哈哈~~ XD



Article:

Todd Rogers & Katy Milkman, A New Way to Remember: The Power of Quirky Memory Jogs. Scientific American (2017)


Paper:

T Rogers & KL Milkman, Reminders Through Association. Psychological Science (2017)











2017年2月10日 星期五

加拿大的大麻管制

今天去聽了中心一個演講,是關於大麻管制的,跟科學沒太大關係,但其實科學和政治也脫離不了關係,因為講者是新聞中這位 UBC Psychiatry 的教授 Kerry Jung。

- 溫哥華(BC)使用的人口佔了全加拿大的一半(49%),而且大麻產量更是佔了全加拿大的 79%。(溫哥華人是有多需要用大麻來止痛 🙄)

- 大麻店在聯邦法(federal law)底下還是不合法的,所以市政人員會跟開店的說 "It's on your own risk",因為警察可以隨時翻掉你的店。

- 溫哥華目前是想參考華盛頓州(西雅圖)和 Colorado (Denver) 的規定來改善目前的規定。華盛頓州的規定比 Colorado 的規定嚴一點。

- 溫哥華的規定是大麻店只能開在商業區,而且不能在學校(有青少年出沒的地點) 300m 內開店,兩間店距離也要超過 300m,不能和 liquor store 共存,同樣至少要隔 300m。(說是原本要 200m,但是 school board 說兩百公尺學生走得到不行,其他人又覺得五百公尺太遠,300m 算是折衷,因為這個距離學生就會覺得遠。但是我覺得 300m 是遠在哪?走路不用五分鐘吧,我十五分鐘就可以走一公里了,至少要距離一公里吧,大家是有多懶?)

- 大麻店如果開在不合規定的地方,或是被附近社區抗議,就會被通知關店,但是會給六個月緩衝期,這期間可以繼續開店,講者說因為溫哥華的這種(管制)做法沒多倫多強硬,所以大麻店被搶的情況不像多倫多那麼嚴重。

- 目前試圖把大麻店分成兩類,一種是 compassion club,裡面有諮詢、馬殺雞和施藥等等的服務,開店年費是 CAD$1000,如果只是 retailer,開店年費是 $10,000,目前是希望推 compassion club (並且可以和研究合作),而不是 retailer,所以費用差很多。不過賣大麻(retailer)的利潤很高,年收入可達 $6M,所以一年繳一萬年費對他們來說是小意思。

- 賣大麻的覺得他們跟其他商業比,抽的稅比較多的話就是不公平,不然就是說,為什麼不能比照 alcohol。

- 加拿大目前的情況是買賣大麻是 cash only,到時候要抽稅的話也是一個需要解決的問題。還有就是抽稅的話要抽多少?如果太高導致價格太高,大家還是會往黑市買,無法有效杜絕 black market。

- 有人提議把大麻列入 pharmacy,但是藥劑師會覺得很怪,覺得自己在賣大麻,據說有個提案是不然放在藥妝店(Shopper's Drug Mart, London Drug)裡賣。(但我覺得這樣說不定比較好,因為比較好控管,現在情況是很多店都被警告違反 bylaw 了還是照開。)

- 另外就是 recreational use 合法化的問題,要不要和 medical use 分開,但講者好像不以為然,說他認為很難區分 medical use or recreational use。



News:

The Globe and Mail / Vancouver slowly but surely shutting down rogue pot shops









2017年2月5日 星期日

R | 畫圖 ggplot2

用 ggplot2 畫圖,裡面有各種圖,請參考這裡:Geoms
這邊存筆記,細節教學請參考這裡:Introduction to R - Part 2

library(ggplot2)
data(mpg)

ggplot 是 ggplot2 中的 function,記得在跑之前要放 library(ggplot2),先跑過這個再跑圖。


點圖:geom_point()

ggplot(mpg, aes(x = displ, y = cty)) + geom_point()

p <- ggplot(mpg, aes(displ, cty)) + geom_point() ## default 是 x, y,所以可以省略。
p

class(p) ## class() 告訴你這個 object 屬於什麼

ggsave("plot1.pdf") ## 把圖存成 pdf file

ggplot(mpg, aes(hwy, cty, colour = class)) + ## 加入顏色,依 class 分色。
  geom_point()

# 分兩層時,+ 要放在一行的最後才能跑。

ggplot(mpg, aes(displ, class, color =  drv)) +
  geom_point()

ggplot(mpg, aes(x = hwy, y = cty, colour = cyl)) +
  geom_point()
## 指定 cyl 的顏色,如果沒指定顏色,會自動用色階。

ggplot(mpg, aes(x = hwy, y = cty, colour = factor(cyl))) + geom_point()
## 指定 cyl 裡的各個數字(分類)用不同顏色。

和上面不同的是如果沒有加 factor,會用連續數字畫色階,例如圖旁的標示會出現 4-7 的色階。如果用 factor,cyl 裡面有的數字(分類)才會出現,例如 cyl 裡面只有 4, 5, 7, 8,圖旁邊的 figure legend 就只會出現這四個點和四種顏色。

ggplot(mpg, aes(displ, cty)) +
  geom_point(color='blue')
## 如果要指定顏色的話,要放在 geom_point() 裡面,而不是放在 aes() 裡面。

ggplot(mpg, aes(x = hwy, y = cty, shape = factor(year))) + ## 用點的樣式來區分
  geom_point()

ggplot(mpg, aes(hwy, cty, size =  displ)) +
  geom_point(color='blue') ## 用點的大小來區分

ggplot(mpg, aes(x = hwy, y = cty, colour = factor(cyl),
  shape=factor(year), size=displ)) + ## 可以合併所有的參數在一張圖裡
  geom_point()


Histogram: geom_histogram()

ggplot(mpg, aes(cty)) +
  geom_histogram(bins=10) ## number of bins. (overridden by binwidth; defaults to 30)

ggplot(mpg, aes(x=cty)) +
 geom_histogram(binwidth = 1, color='blue')
## The width of the bins. The default is to use bins bins that cover the range of the data.

ggplot(mpg, aes(x=cty)) +
 geom_histogram(aes(y=..ncount..))
## ncount: count, scaled to maximum of 1 (Y-axis 範圍變成 0 到 1。)


頻率圖 frequency polygons:geom_freqpoly()

ggplot(mpg, aes(x=cty)) + geom_freqpoly(bins = 10, color='blue')

ggplot(diamonds, aes(x=price, colour=cut)) + geom_freqpoly(bins = 10)

(ps. histogram & freqpoly 細節語法可以參考這裡:histograms & frequency polygons)


Bar graph: geom_bar()

ggplot(mpg, aes(x=cty, color=cyl)) + geom_bar(bins = 10)


Box plot: geom_boxplot()

ggplot(mpg, aes(factor(cyl), cty)) + geom_boxplot()

ggplot(mpg, aes(factor(cyl), cty)) +
  geom_boxplot(coef = NULL)  ## length of the whiskers as multiple of IQR (defaults to 1.5)

ggplot(mpg, aes(x=reorder(drv, cty, median), y=cty)) +
  geom_boxplot() ## Y-axis 數值由左到右排列成由小到大

ggplot(mpg, aes(factor(drv, levels=c('f', 'r', '4')), cty)) + ## 指定 X-axis 排序
  geom_boxplot()  

(ps. box plot 細節語法可以參考這裡:box plot)


Smoothers

A “smoother” is a line overlaid on the plot that can help bring out the dominant pattern by leaving out some of the variability (“wigglyness”) in the data.

加一條曲線圖(regression line),預設有 confidence intervals 的灰色陰影。

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth() ## regression line

ggplot(mpg, aes(x=displ, y=hwy)) +
  geom_point() +
  geom_smooth(se=FALSE, method = "lm")
#把陰影去掉:se=FALSE
# lm: least-squares linear regression

ggplot(mpg, aes(displ, hwy, shape=factor(cyl))) +
  geom_point() +
  geom_smooth(method="lm")

p1 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(aes(colour=factor(cyl))) +
  geom_smooth(aes(y = cty), se=FALSE) ## regression line

p2 <- ggplot(mpg, aes(displ, hwy))
 #把第一層 aes() 設成一個獨立 layer,這樣就不用每次重複打。
p2 +
 geom_point(aes(colour=factor(cyl))) +
 geom_smooth(method="lm") ## least-sequres linear regression

p2 +
 geom_point(aes(colour=factor(cyl))) +
 geom_smooth(aes(colour=factor(cyl)), method="lm")
 # 把 aes() 設在 smoother 裡就會每個 factor 都有一個 regression line。

# 跟 p2 相比

p3 <- ggplot(mpg, aes(displ, hwy, color=factor(cyl))) # 把 aes() 設在第一層會有同樣的效果
p3 +
 geom_point() +
 geom_smooth(method="lm")


Grouping

p2 <- ggplot(mpg, aes(displ, hwy))
p2 +
 geom_point() +
 geom_smooth(aes(group=factor(cyl)), method="lm", se=FALSE)


ggplot(mpg, aes(x=displ, y=hwy)) +
  geom_point() +
  geom_smooth(se=FALSE, method = "lm", formula = y~poly(x,2))



以上功能已寫在 R Script (R-ggplot),有興趣的可以下載來跑跑看。如果剛開始跑時出現 error 訊息的話,先跑最前面三行 library,之後再跑下面的 function 試試看。


註記:這篇當初在寫的時候因為懶得弄圖,加上沒花太多時間去把每種圖搞懂,所以很簡約。不過後來有補好幾篇詳細的,可以看這一串文章:ggplot









R | 常用基本語言

RStudio 視窗中,R Script 是寫程式的地方(下圖左上),Console 是跑程式的地方(左下),可以在 R Script 的地方寫好按右上的 "Run",結果會在 Console 視窗裡出現,簡單的程式可以直接寫在 Console 裡面跑。Environment (右上)會顯示所有的 variables。

Ps1. 如何新增 R Script:File >  New File > R Script
Ps2. 如何安裝 RStudio,參考此頁:Setup instructions
Ps3. 此為筆記,其他細節請參考此頁:Introduction to R - Part 1


(點這裡看放大圖片)

R 裡面可以設定 variable or object,用 <- 設定,可以是數字或是文字。
在 R 語言裡面 ## 可用作註釋,等於 C++ 裡面的 //。(紫色框框裡為打在 R Script 或是 Console 裡的指令,白色框框裡面為跑指令後在 Console 裡出現的結果。)

例如我們可以指定 variables: x1, x2, y

把 x1 指定為 3

x1 <- 3
x1

[1] 3

如果指定為一個算式的話,就有計算的功能。

x2 <- 1 + 2     ## 計算 1 + 2
x2

[1] 3

也可以把 variable 或 object 設為文字。

y <- "Hello"
y

[1] "Hello"

以上三個可以寫在 R script 裡,然後按 "Run",或是在 Console 裡面打 x1, x2, y 跑出來,也可以直接全部打在 Console 的地方。在 Console 打 x1 和 x2 都會出現 [1] 3,打 y 會出現 [1] "Hello"。

R 裡面有很多內建檔案可以拿來練習,例如 mtcars。
在 Console 打入下面的語言可以查詢,會顯示在左上角的視窗。

library()
查看有什麼可用的 packages

data()
叫出 R 裡面的 data, 可以是內建的檔案。
Ex: data(mtcars)
(ps. mtcars 為 R 裡面內建的檔案資料。)


Functions in R

rm()
remove, 用來移除 variables
Ex: rm(x1)

ls()
list objects, 列出所有的 variables

ls(mtcars)

[1] "am" "carb" "cyl" "disp" "drat" "gear" "hp" "mpg" "qsec"
[10] "vs" "wt"

rename()
改變 variable 的名稱

View()
觀看叫出的 data,會顯示在 script 的那個視窗裡。
Ex: View(mtcars)

str()
觀看檔案資料的細節

str(mtcars)

'data.frame': 32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

每個 variable 裡面的數值或是樣式叫做觀察值 observations,例如在 mtcars 裡面所有的 variables 的觀察值都是數字,但觀察值也可以是 character 或是 factor。

要知道某個 variables (裡的觀察值)是哪種格式(數字, 文字或 factor)可以用 class() 的功能去查看。

class()
檢視某個 variable 的格式

class(mtcars$cyl)

[1] "numeric"

levels()
檢視某個 variable 裡面的觀察值(observations)有哪些,觀察值的格式必須是 factor 才能顯示出來,如果是數字就會顯示 NULL。

levels(mtcars$cyl)

NULL

在執行某些指令時,會需要 variables 的格式是 factor,這時候就可以用 factor() 的功能把它轉成 factor。

factor()
把非 factor 的 variables 轉換成 factor

factor(mtcars$cyl)

[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8
[26] 4 4 4 8 6 8 4
Levels: 4 6 8

如果 variable 是數字的話,是沒有 levels 的,需要轉成 factor 才有。Levels 是指那個 variable 裡面有哪些 categories,例如把 cyl 轉成 factor 的話,就有 4, 6, 8 三種。

下面用 class() 去檢視,是否真的把原本是數字的 cyl 轉成 factor。

class(factor(mtcars$cyl))

[1] "factor"

也可以用 levels() 去檢視,轉成 factor 後就不會像上面出現 NULL。

levels(factor(mtcars$cyl))

[1] "4" "6" "8"


summary()
觀看檔案資料的總節

summary(mtcars)

      mpg             cyl             disp
 Min.   :10.40   Min.   :4.000   Min.   : 71.1
 1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8
 Median :19.20   Median :6.000   Median :196.3
 Mean   :20.09   Mean   :6.188   Mean   :230.7
 3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0
 Max.   :33.90   Max.   :8.000   Max.   :472.0
       hp             drat             wt
 Min.   : 52.0   Min.   :2.760   Min.   :1.513
 1st Qu.: 96.5   1st Qu.:3.080   1st Qu.:2.581
 Median :123.0   Median :3.695   Median :3.325
 Mean   :146.7   Mean   :3.597   Mean   :3.217
 3rd Qu.:180.0   3rd Qu.:3.920   3rd Qu.:3.610
 Max.   :335.0   Max.   :4.930   Max.   :5.424

dim()
dimension, # of row and column.

dim(mtcars)

[1] 32 11

(ps. row = 32, column = 11)

nrow()
# of rows

nrow(mtcars)

[1] 32

ncol()
# of columns

ncol(mtcars)

[1] 11

head()
列出檔案資料中的前幾項

head(x, #)
x = object or dataframe
n = number, # of elements

列出 mtcars 的前十個 variables 的資料

head(mtcars, 10)

                   mpg cyl  disp  hp drat    wt  qsec vs
Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0
Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0
Datsun 710        22.8   4 108.0  93 3.85 2.320 18.61  1
Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0
Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1
Duster 360        14.3   8 360.0 245 3.21 3.570 15.84  0
Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1
Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1

查詢檔案資料的某個 variable:dataframeName$VariableName

例如 dataframe = mtcars, variable = mpg 的話,就是這樣:

z <- mtcars$mpg
z

[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4
[13] 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3
[25] 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

會叫出 mtcars 檔案裡的 mpg

median(dataframe$variable)
找出檔案中某個 variable 的中間值

例如找出 mtcars 檔案裡 mpg 的 median (中間值)

dataframe = mtcars, variable = mpg

median(mtcars$mpg)

[1] 19.2

max(dataframe$variable)
找出檔案資料裡某個 variable 的最大值

max(mtcars$mpg)

[1] 33.9


min(dataframe$variable)
找出檔案資料裡某個 variable 的最小值

mean()
算出檔案中某個 variable 的平均值 mean value

mean(mtcars$mpg)

[1] 20.09062

算出 mtcars 裡的 mpg 的 mean value (平均值)

sd()
算出 standard deviation

sd(mtcars$mpg)

[1] 6.026948

sapply(dataframe, function)
算出檔案裡的所有 variables 的指定數據。

例如算出 mtcars 裡面所有 variables 的平均值
dataframe = mtcars, function = mean

sapply(mtcars, mean)

       mpg        cyl       disp         hp       drat         wt
 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250
      qsec         vs         am       gear       carb
 17.848750   0.437500   0.406250   3.687500   2.812500

quantile(x, probs = )
在檔案資料中,分佈圖(distribution)中某些比例的數值。
x = data values, or dataframe$variable

例如找出 mtcars 裡的 mpg 數值裡的第 50% (50th percentile)。

quantile(mtcars$mpg, prob = 0.5)

50%
  6

quantile(x, probs = c())
在檔案資料中,分佈圖(distribution)中某些比例的數值。
x = data values, or dataframe$variable

例如找出第 0%, 25% 和第 75% 的值就是:probs = c(0, 0.25, 0.75)
## value at 0-th (0%), 25-th (25%) and 75-th (75%) percentile

quantile(mtcars, probs = c(0, 0.25, 0.75))

   0%   25%   75%
 52.0  96.5 180.0

Note the value of the “probs” argument: c(0, 0.5, 1). This is itself a three-element vector.

c(0, 0.5, 1)

[1] 0.0 0.5 1.0

table(dataframe$variable)
把檔案資料裡的某個 variable 資料列成 table

例如把 mtcars 裡面的 cyl 用 table 的形式整理出來。

table(mtcars$cyl)

 4  6  8
11  7 14

顯示出在 cyl 資料中,4 有 11 個,6 有七個,8 有 14 個。

xtabs(~ variable, data = dataframe)
指依照某個檔案資料的某個 variable 做成 cross-table,如果只設一個 variable 的話會跟 table() 很像,不同的是會列出 variable 的名稱。

xtabs(~cyl, data = mtcars)

cyl
 4  6  8 
11  7 14 

出現的表格會和 table(mtcars$cyl) 的一樣,但是會多 cyl 在表格上方。

xtabs(~ variable1 + variable2, data = mtcars)
如果設定兩個 variables 的話,variable1 代表 Y 軸(或對 X 軸的 response),variable2 代表 X 軸。

xtabs(~ cyl + am, data = mtcars)

   am
cyl  0  1
  4  3  8
  6  4  3
  8 12  2

由上面的表格中可知 cyl 中的 4 共有十一個,當加入另一個 variable (也就是 am 為第二個)進去後,那十一個會在依 am 的數值分層,於是就會在上面的結果看到,am = 0 的有三個,am = 1 的有八個。


Operators

R 裡面的 operator 是數學和邏輯符號,例如加減乘除(+, -, *, /),詳細解釋請看:R Operators

其他常用的還有:

%%
餘數

10%%3

[1] 1

10/3 = 3(餘數:+1)

%/%
商數

10%/%3

[1] 3


==
等於

!=
不等於

&
And. 兩個條件都要符合

|
Or. 兩個條件的其中一個符合即可


Read/Write files

read.csv()
讀 csv 裡的檔案
Ex: library(readr)
Exp01 <- read_csv("~/Desktop/R program/ECOSCOPE/mtcars.csv")
View(Exp01)
## 或是直接 import from csv file

write.csv()
把 R 裡面的檔案資料轉成 csv file
Ex: write.csv(cars, "cars.csv")
## 把 R 裡面內建的 cars 檔案資料轉成 cars.csv,轉成 csv 的檔案會出現在右下角視窗的 "Files" tab 裡面。

write.table()
把 R 裡面的檔案轉成 csv file,但是全部都放在同一格,需要加分格和欄位名稱。
Ex2: write.table(cars, "cars2.csv", sep=",", row.names=TRUE, col.names=TRUE)
## 會跟 write.csv() 寫出來的一樣,但是第一欄的第一格不是空白,第二欄的名稱會跑到第一欄的第一格。

Ex2: write.table(cars, "cars3.csv", sep=",", row.names=TRUE, col.names=NA)
## 會跟 write.csv() 寫出來的一樣,第一欄的第一格是空白。
By default there is no column name for a column of row names. Use col.names = NA if you want to add a blank column name, which is the convention used for CSV files to be read by spreadsheets.


Console 裡常用的功能(下圖左下)


(點這裡看放大圖片)

?
查詢功能或檔案
Ex: ?rm()
##查詢 rm() 是什麼功能,解釋會出現在 Help 的視窗(右下)。

help()
Ex: help("dim")
##查詢 dim() 是什麼功能,解釋會出現在 Help 的視窗(右下)。

If the name has special characters, we need to put it in quotes:
help("+")
?"+"


以上功能已寫在 R Script (R-basic),有興趣的可以下載來跑跑看。









2017年2月3日 星期五

Info | Data & R program

資料處理和 R program 的教學 (by UBC ECOSCOPE)

目前先放連結,之後會另外寫上課筆記。

如何安裝 R program,請參考此頁:Setup Instructions

如果是用 R Studio 的話,可以轉換不同的 R version,請參考這篇:How to use different versions of R


Introduction to R Workshop Series (link)

Part 1: R Studio, build-in data & data functions(筆記:R | 常用基本語言
Part 2: ggplot(筆記:R | ggplot
Part 3: data frame, data manipulation(筆記:R | Data manipulation)


Working with data (link)

Part 1: data frame, data manipulation (same as Intro to R, Part 3)
Part 2: more data manipulation
Part 3: tidy data


Graphics with ggplot (link)

Part 1: R Graphics with Ggplot2 - Day 1(筆記:Point plot & Box plotHistogram & Bar graph
Part 2: R Graphics with Ggplot2 - Day 2
Part 3: R Graphics with Ggplot2 - Day 3


Statistical Models Workshop Series (link)

Part 1: Analysis of Variance (ANOVA) in R
Part 2: Linear Regression and Linear Mixed Effects Models
Part 3: Generalized Linear Models


Other Resources:

R for Data Science










2017年2月2日 星期四