레이블이 통계인 게시물을 표시합니다. 모든 게시물 표시
레이블이 통계인 게시물을 표시합니다. 모든 게시물 표시

2025-02-14

Learn R - Dedup!

Dedup (deduplication) is the first step to analyze any data. 

There is almost always some redundancy in the table of any raw data if you're dealing with the type of "real-world" data sets. It could be the consequence of many complex joins or the data is copied twice by mistakes. Whatever the reason is, a perfectly cleaned data is rare. Any further analyses on it without checking it deliberately could just create lots of complex troubles later! 

Let's explore the ways to dedup in R.

This is one simple data frame.

> df <- data.frame(name=c('Alice', 'Brian', 'Chris', 'Brian'), age=c(10, 20, 30, 20), height=c(5.2, 5.7, 6, 5.7))
> df
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0
4 Brian  20    5.7

Rows 2 and 4 are duplicated. To remove one of them, we can use three methods.

(1) duplicated()

The function duplicate() indicates which rows are duplicated. It is R's base function, so it doesn't need the installation.

> duplicated(df)
[1] FALSE FALSE FALSE  TRUE

The 4th row is duplicated (as the True indicates). The rows not duplicated are found using the "not" operator (!) as follows.

> !duplicated(df)
[1]  TRUE  TRUE  TRUE FALSE

Slicing with the index selects the rows not duplicated.

> df[!duplicated(df),]
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0


(2) unique()

The function unique() returns the dataframe after removing the redundancy. It's also the base function of R so ready to be used without installation.

> unique(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0


(3) distinct() in dplyr

Install dplyr package first, then use distinct() in the package. It returns the same distinct rows only.

> dplyr::distinct(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

The same could be done using piping in a tidyverse style.

> df %>% distinct()
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

It's that easy. Just remember to dedup!


2024-12-18

책리뷰 - 행운에 속지 마라 (나심 탈렙)

2011년에 "블랙스완"을 써서 유명해진 나심 탈렙이 2001년에 낸 책. 원제 Fooled by Randomness로 번역하면  '(우리는) 무작위성에 속고있는 중이다' 정도가 될 듯.

블랙스완의 내용과 겹치는 점이 많고, 좀 비슷한 스타일로 쓰여는데 블랙스완이 좀 더 재밌게 쓰여지긴 했다. 다방면으로 철학적 discussion을 하는 것은 블랙스완이 더 재미있고. 이 책은 살짝 약한 연습 version같은 느낌이 있다.

주 내용은, 성공이 행운에 의한 것인지 아닌지 잘 모르니까 한번 성공했다고 그 방법이 통할 것이라고 생각하지말라는 것이고. 무작위성(randomness)에 대한 연구자라고 본인은 주장하는 만큼, 무작위성에 대한 내용을 일반인도 좀 쉽게 이해하도록 좀 친절하게 설명해준 것 같다 (블랙스완에서는 어쩐지 덜 친절함). 

블랙스완에서는 똑같은 randomness에 대한 얘기를 하고 똑같은 principle이지만, 대신 한번도 실패하지 않았다고 안실패한다고 생각하지말라, 큰 불행이 올 수도 있다는 식으로 얘기를 전개하였는데, 블랙스완의 방식이 사람들의 관심을 더 끌었다고 생각한다. 사람들은 부정적인 일이 더 관심이 많아서일까? 큰 행운이 생긴다는 얘기보다 큰 불행이 생긴다는 얘기에 더 많은 관심을 보이니까. 

(블랙스완에서는 '블랙스완'이나 터키라는 눈에 보이는 것 같은 example과 Gaussian에 대한 좀 더 체계적인 비판, 그리고 다양한 철학적 stance를 보여주기위한 각종 캐릭터들, 그리고 자신의 memoir를 철학적 주장과 매우 교묘하고 신기하게 섞어놓은 뭐라 categorize하기 힘든, 이렇게 글을 풀어놓는 방식이 새롭다. 그리고 더 제멋대로라고 할까. Fooled By Randomness는 좀 더 대중적으로 읽히고 싶어서 쓴 책이고 블랙스완은 정말 더더 독자 눈치 안보고 쓰고 싶은데로 멋대로 자기 성향대로 최고로 잘난 척하면서 쓴 것 같은데도 더 재밌다)

블랙스완에서는 인간이 randomness를 인식하지 못하는 이유, 어떤 상황에서건 설명을 만들어내려고 하는 biological한 약점, 역사라는 것은 그때 그 순간에 일어난 일들을 순차적으로 기입하는 것이 아니라 그 한참 후의 '결과물'을 본 다음에만 이해할 수 있다는 새로운 관점, Gaussian을 좋아하는 또는 normal model을 좋아하는 사람들에 대한 끝없는 공격이 더 늘어났다. (그동안 behavioral economics가 발달하여 더 많은 사람들이 Taleb의 이야기를 들어주기 시작했는지도.. 아니면 그동안 더 명성을 쌓아서 하고 싶은 말을 할 수 있게 된 것인가.)



2024-11-18

Learn R - Compute group means

Here are six boxes filled with either potatos or apples. 

Dataframe df has a group column that indicates whether it's a potato or apple box and a weight colmn that contains the weight of the box.

> df <- data.frame(
+   group=c('potato', 'potato', 'apple', 'apple', 'potato', 'apple'),
+   weight=c(10, 2, 5, 26, 3, 6))

It looks like this.

> df
   group weight
1 potato     10
2 potato      2
3  apple      5
4  apple     26
5 potato      3
6  apple      6

What can we do to get the average weights for the potato and apple boxes, respectively?

First, let's load dplyr.

> library(dplyr)

Then, with df,

  1. group by them with apple/potato group column
  2. send the output via piping (%>%)
  3. summarize the mean of weight and save them with a new column mean.weight.

 df %>% group_by(group) %>% summarize(mean.weight = mean(weight))

# A tibble: 2 × 2
  group  mean.weight
  <chr>        <dbl>
1 apple         12.3
2 potato         5  

The avarage weight for apple boxes is 12.3, and the average weight for potato boxes is 5.

It's that simple! Enjoy coding in R!


R에서 그룹 별로 평균 구하기

여섯 개의 상자 안에 감자 또는 사과가 들어 있다고 합니다. 

데이타프레임 df에는 group에는 감자인지 사과인지가, weight에는 각 상자의 무게가 들어갑니다.

> df <- data.frame(
+   group=c('potato', 'potato', 'apple', 'apple', 'potato', 'apple'),
+   weight=c(10, 2, 5, 26, 3, 6))

이 데이타프레임은 다음과 같습니다.

> df
   group weight
1 potato     10
2 potato      2
3  apple      5
4  apple     26
5 potato      3
6  apple      6

감자 상자, 사과 상자 그룹의 각각의 평균 무게를 구하고 싶다면?

우선 dplyr를 로딩합니다.

> library(dplyr)

df를 가지고

  1. 사과/감자 group 별로 grouping을 해주고 (group_by)
  2. 그 결과를 파이프로 받아서 (%>%)
  3. weight의 평균을 낸 다음에 이를 새로운 컬럼 mean.weight에 넣어줍니다 (summarize).

 > df %>% group_by(group) %>% summarize(mean.weight = mean(weight))

# A tibble: 2 × 2
  group  mean.weight
  <chr>        <dbl>
1 apple         12.3
2 potato         5  

사과상자의 평균 무게는 12.3, 감자상자의 평균은 5임을 알 수 있습니다.

참 쉽죠?


2024-09-15

Learn R - How to clean the "working memory" in R

When you want to delete all the variables and objects in the current workingspace in R for whatever reason, you can use rm().

For me, it happens when I am running lines of code in command lines to do quick, exploratory, pilot types of analyses. Some variables (or objects) defined earlier could create a mess if the existing variables have the same name. The old value previously set could introduce a wrong initial value. Then, the code returns some value without any errors, but it could be just wrong! The worse is that I don't even know what just happened...

How can we fix it quickly? By cleaning the current workspace (which is generally the global environment. If you don't know about "environments" in R, don't worry about them for now).

This is what I usually do:

> rm(list=ls())

It cleans all the objects in the workingspace.

Let's see if there is any previous objects:

> ls()
character(0)

Now it's a clean slate! So no worries about using wrong inital values for variables. It must return errors if the value is not correctly set before using it.

Enjoy coding in R!


2024-09-13

책리뷰 - 오늘의 화학 (조지 자이던)

많이 가공된 음식이 정말 몸에 좋은지 나쁜지, 어떻게 나쁜지에 대한 이야기, 그리고 그와 관련된 과학에 대한 책이다. 

저자의 결론은 신문에서 떠드는 각종 "과학"(이라고 부르는) 기사(사실은 거의 광고)들을 너무 믿지 말라는 것. 대신 FDA나 CDC에서 나쁘다 또는 위험하다고 하면 그건 확실히 알려야할 만큼이나 과학적으로 나쁘다는게 거의 증명된 것이므로 주의해서 들어야한다! 말로만 과학적인 척 하는 수많은 연구 결과(실과제로는, 광고/그냥 흥밋거리 기사)에 흔들리지 말라는 것.  

건강 관련 뉴스는 항상 돈이 되어왔던 것 같다. 예를 들어, 1876년 책인 "톰 소여의 모험"에도 건강 뉴스에 대한 에피소드가 나온다. 작가인 마크 트웨인이 어렸을 적의 이야기라고 하니까, 1800년대 초반의 얘기임에도, 주인공 톰을 길러주는 폴리 이모님이 그 시절 신제품이었던 "진통제"니 "목욕 요법"이니 하는 유행을 열심히 따라가고 이런 것을 알려주는 건강 관련 잡지까지 구독했다는 내용이 나온다. 물론 허구의 소설이긴 하지만, 이렇게 건강 관련 뉴스에 열광하는 독자들은 예나 지금이나 존재했고 그래서 그런 기사도 계속 나오는 듯. 이렇게 유구한 역사의 가짜 과학(적인듯이 보이는) 광고들 때문에 정말 진지하게 과학하는 사람들만 오명을 얻게 되는 것 같다. 

물론, "과학한다"는 사람들이 다 옳은 것도 아니긴 하지만... 과학적 방법을 적용할 때에 현실적인 여러 문제점들이 있다고 해도, 최소한 "틀림을 증명할 수 있는 것"에 대해서만 얘기한다는 점에서, 현 시점에는 그나마 가장 사실에 가까운 정보를 얻기 위한 가장 유용한 방법이 과학이긴 하다. 

이 "오늘의 화학" 책에서는, 여러 과학적 방법을 해석할 때의 문제점이나 일반적인 과학자들이 publish하려고 할 때 쓰는 "속임수"들 (예를 들어 p-hacking)에 대해서 비교적 쉽게 설명하려고 노력했다. 

책의 결론은, 그렇다고 건강한 생활 습관(예를 들어, 너무 많은 붉은 고기, 당, 포화지방을 적게 먹는 것)이 중요하다는 것을 안 받아들일 필요는 없다는 얘기. 좀 복잡하게 중립적 입장을 취하는게, 작가가 정말 "과학하는" (결론 내기 어려운 증거에 대해서는 왠만하면 결론 내려고 안하는) 사람이라서 그런듯 :) 

이러니까 과학이 어려운 거 아닐까. 증거가 엄청 쌓이기 전에는 과학자들은 쉽게 결론을 내주지 않으니까. 과학 교과서에 나오는 내용들이야 정말 증거가 너무 너무 많아서 이건 거의 참이다 이런 내용들만 나오는 거지만 (교과서에 나오는 실험들은 정말 아무나 붙잡아서 대충 실험하라고 해도 진짜 신기하게도 찰떡같이 p-value가 낮게 나오긴한다) 간단히 말하면, 교과서에 안 실린 내용들은 아직 현재 연구 중인 주제들이고 아직 모르니까 계속 하는 것이기 때문에 알아서 걸러 들어야한다. 

가공 음식이라던가, 자외선 차단제 등의 '화학 제품'이 건강에 미치는 영향에 대해서 여기저기 언론에서 떠드는 내용에 대해서, 그런 기사의 근거가 되는 과학적 방법을 이해하면서 정보를 더욱 정확하게 이해하고 싶은 사람들이 읽어보면 많은 도움이 되는 책인 것 같다.

2024-09-01

R 배우기 - Dedup! 데이터프레임 중복제거

어떤 테이블이건 분석을 할 때 가장 처음 시작은 dedup부터라고 생각합니다. 테이블들을 join하다 보면 어떤 이유로건 중복된 행이 생길 수가 있는데, 중복을 확인하는 과정을 거치지 않고 분석을 해봤자 틀린 분석이 나올 수 밖에 없어요.

R 데이터프레임에서 중복된 행을 제거하는 방법을 알아보겠습니다.

우선 중복이 있는 간단한 데이터프레임을 만들어봅니다.

> df <- data.frame(name=c('Alice', 'Brian', 'Chris', 'Brian'), age=c(10, 20, 30, 20), height=c(5.2, 5.7, 6, 5.7))
> df
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0
4 Brian  20    5.7

2번과 4번 행(row)이 중복되어있죠. 이를 제거하기 위해서, 다음의 세 가지 방법을 사용할 수 있습니다.

(1) duplicated 이용 

어떤 열이 중복된 row 인지는 duplicate() 함수를 써서 알 수 있습니다. R의 base함수이기 때문에 별도의 package설치할 필요 없이 바로 사용할 수 있습니다.

> duplicated(df)
[1] FALSE FALSE FALSE  TRUE

4번째 row가 중복되었음(TRUE)을 보여줍니다. 따라서, 중복되지 않은 row는 !(not)을 이용해서 아래와 같이 찾아낼 수 있습니다.

> !duplicated(df)
[1]  TRUE  TRUE  TRUE FALSE

이 결과를 index로 해서 slicing하면 중복되지 않은 행만 선택이 됩니다.

> df[!duplicated(df),]
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0


(2) unique 이용

unique()함수는 중복을 없엔 결과를 리턴합니다. unique()역시 R의 base함수이므로, 별도의 설치 없이 바로 사용할 수 있습니다.

> unique(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

이와 같이 중복된 행을 제거하고 unique한 행만 보여줍니다.


(3) dplyr의 distinct()이용

dplyr 팩키지를 설치하고 distinct()함수를 사용하여도 unique()와 같은 결과를 얻을 수 있습니다.

> dplyr::distinct(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

참고로, tidyverse스타일의 파이프를 사용하면 이렇게도 쓸 수 있습니다.

> df %>% distinct()
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

쉽죠? 중요한 점은 잊지말고 dedup!


2024-07-22

R 배우기 - dplyr사용하기

R로 데이터 분석할 때 dplyr가 정말 유용합니다. 예를 들어, dplyr를 쓰면 for loop를 쓸 일이 거의 없어요.

그럼 기본적인 사용법을 볼까요. 

dplyr 패키지를 인스톨하고 (install.packages("dplyr")), 라이브러리를 불러줍니다.

> library(dplyr)

data frame을 하나 만들어봅시다.

> df <- data.frame(name=c('Alice', 'Brian', 'Chris'), age=c(10, 20, 30), height=c(5.2, 5.7, 6))
> df
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

dplyr에서는 %>% 라는 "파이프"를 사용하는데요, 파이프를 사용하면 왼쪽의 결과물이 자동으로 오른쪽 함수의 input이 됩니다.

예를 들어, dplyr의 filter()라는 함수는 row를 선택할 때 사용합니다. Alice의 데이타를 보려면,

> filter(df, name == 'Alice')
   name age height
1 Alice  10    5.2

파이프로도 똑같은 일을 할 수 있습니다.

> df %>% filter(name == 'Alice')
   name age height
1 Alice  10    5.2

파이프 %>% 왼쪽에 있는 df가 오른쪽에 있는 filter()함수의 input이 되는 것입니다.

dplyr에서 많이 쓰이는 select()라는 함수는 column선택할 때 사용됩니다. name, age, height의 세 개의 컬럼 중에서, name과 age만 보고 싶다면,

> select(df, name, age)
   name age
1 Alice  10
2 Brian  20
3 Chris  30

파이프로는 

> df %>% select(name, age)
   name age
1 Alice  10
2 Brian  20
3 Chris  30

여기서도 df가 select()함수의 input으로 들어간 것입니다.

만약 이름이 Alice가 몇 살인지 알고 싶다면, 위의 두 함수를 한 번 씩 적용하면 되겠죠.

> df1 <- filter(df, name == 'Alice')
> select(df1, name, age)
   name age
1 Alice  10

먼저 filter한 다음에 그 결과물을 df1에 잠시 저장한 다음 select했는데요. 이렇게 함수를 순차적으로 사용할 때, 파이프의 장점이 드러납니다. 

왜냐하면 파이프의 왼쪽의 결과물이 오른쪽 함수의 input이 되니까요.

> df %>% filter(name == 'Alice') %>% select(name, age)

   name age
1 Alice  10

이렇게 파이프를 사용하면, 중간에 df1을 따로 만들 필요가 없어요. 처음 filter()함수의 결과물이 select()함수의 input으로 들어간 것입니다.

그리고 위의 예제에서 보이는 것처럼, 어떤 순서대로 뭘 했는지 그 흐름대로 읽을 수 있으니 나중에 봤을 때에도 이해하기 편하죠. 

여기까지가, dplyr의 기본적인 사용 방법 입니다. 

(dplyr의 다양한 함수들은 https://dplyr.tidyverse.org 에서 찾아볼 수 있습니다.)


2024-06-28

R ggplot에서 geom_line() 사용할 때 x축이 자동 정렬 안되게 하려면

ggplot으로 그룹 별로 그래프 그리기 예제 에서 보이는 것 처럼, geom_line()을 쓰면 x값들을 자동으로 정렬해서 line을 그려줍니다. 


> df
  aa bb     cc
1  1 12  first
2  2 25  first
3  3 31  first
4  4 43  first
5  1 15 second
6  2 22 second
7  3 38 second
8  4 41 second

ggplot(df, aes(x=aa, y=bb)) + geom_line()



여기서, 정렬 되지 않은 원래의 data순서 그대로의 line을 보고 싶을 때가 있죠. 

그럴 때는 geom_line() 대신 geom_path()를 사용합니다. 

> ggplot(df, aes(x=aa, y=bb)) + geom_path()



두 개의 plot이 같은 data에서 나온 그래프임을 보여주기 위해서 point도 같이 그려보았습니다.

> ggplot(df, aes(x=aa, y=bb)) + geom_line() + geom_point()
> ggplot(df, aes(x=aa, y=bb)) + geom_path() + geom_point()



점들의 위치는 양쪽이 같네요. 하지만,  어떻게 연결해 주느냐에 따라 전혀 다른 plot으로 보입니다. 

다른 예를 하나 더 볼까요?

> theta <- seq(0, 2*pi, 1)
> df <- data.frame(x = cos(theta), y = sin(theta))
> ggplot(df, aes(x=x, y=y)) + geom_line()
> ggplot(df, aes(x=x, y=y)) + geom_path()





완전히 다르게 보이죠? geom_line()으로는 보이지않던 패턴이 geom_path()에서는 너무나 명확히 드러납니다.

어떻게 그래프를 그리는 지가 이렇게 중요하답니다. 



2024-06-25

R에서 ggplot으로 그룹 별로 그래프 그리기

ggplot2 라이브러리를 불러옵니다.

> library(ggplot2)

컬럼이 세 개인 데이터프레임을 하나 만듭니다.

df <- data.frame(aa=c(1,2,3,4,1,2,3,4), bb=c(12,25,31,43,15,22,38,41), cc=c("first", "first", "first", "first", "second", "second", "second", "second"))

df는 이렇게 생겼어요.


cc가 "first"인 데이터와 "second"인 데이터를 따로 두 개의 라인으로 그려보려고 합니다.


> ggplot(df, aes(x=aa, y=bb)) + geom_line()


흠...자동으로 sort가 되어서 하나의 라인만 그려지네요.

cc로 그룹을 만들려면 아래과 같이 group 키워드를 설정해줍니다.

> ggplot(df, aes(x=aa, y=bb, group=cc)) + geom_line()


두 개의 라인 그래프가 생겼습니다.

색깔을 넣어볼까요? 

color 키워드를 추가합니다. cc로 색을 정하겠다고 설정합니다.

> ggplot(df, aes(x=aa, y=bb, group=cc, color=cc)) + geom_line()



완성입니다! 

2024-06-23

What p-value can tell

In statistical hypothesis tests, the null hypothesis basically states that it is not extraordinary

For example, if a test is comparing the difference between two groups, the null is that there is no difference. When a test aims to see if a factor has a real impact on something, then the null is that there is no effect. 

The null means what happened in the outcome is not extraordinary, and it just happened due to a random fluctuation. The apparent difference in the two groups could be just a fluke. The seemingly impactful outcome could just happen by chance.

Whether the outcome happened by chance or not is decided by a p-value.

A p-value provides a quantity to tell how much the outcome is probable when the null is right. As far as the p-value is less than 5% (a conventional threshold), the null hypothesis can be rejected

Now that the null cannot explain the outcome, we can say that it is extraordinary: the difference is not a fluke, and the impact is not by chance, statistically speaking, it is statistically significant



2024-06-21

R에서 ggplot 사용해서 그래프 그리기 (Plot with ggplot in R)

Install the ggplot2 package in Rstudio.

(Rstudio에서 ggplot2 패키지를 설치합니다.)




Click the "Install" button here.
(Install 버튼을 누르면 설치가 됩니다.)

Load the ggplot2 package in Rstudio Console.
(콘솔에서 ggplot2 패키지를 loading합니다.)



Make a simple data frame df with only 2 columns named x and y.
(데이터프레임 df를 만듭니다. 두 개의 컬럼으로 된 간단한 데이터프레임 입니다.)


Let's use ggplot!
(이제 ggplot을 사용해봅니다.)

Nothing happened. Because we've just regitered df to be used, but it's not used yet.
(아무것도 그려지지 않네요. 이제부터 df를 사용해서 뭘 좀 하겠다고 등록만 해 준 상태입니다.)


  Using aes(), add the information of which columns in df will be the x- and y-axes.
(df에서 어떤 컬럼을 사용할지 aes()를 이용해서 정보를 추가해줍니다.)


We've just registered the columns, so the axes and ranges are shown but still nothing appears.
(x축에 df의 x컬럼을 사용하고 y축에 df의 y컬럼을 사용하겠다고 등록만 된 상태입니다. 그래서 축과 범위는 데이타에 맞춰서 이미 만들어져있네요.)

Add the first geometric ogject. geom_point() addes points.
(ggplot의 geom(geometric object)를 추가해줍니다. geom_point()는 점을 추가하겠다는 뜻입니다.)


Yay, it's the first plot with ggplot!
(ggplot을 이용한 첫번째 plot이 그려졌네요!!)

For the line, use geom_line().
(선을 추가 하고 싶다면, geom_line()을 추가해주세요.)


In this way, you can add geometric objects.
(이런 식으로 원하는 geometric object를 추가해주면 됩니다.)

This is it. It's the basic way ggplot works!
여기까지가, ggplot의 기본 사용 방법입니다!


2021-05-29

R 기본 중의 기본

1. R 언어 설치

CRAN R (https://cran.r-project.org/) 에 가서, Download and Install R 에서 각자의 OS에 맞는 R을 다운로드 합니다. 예를 들어, 윈도우를  사용 중 이라면, Download R for Windows 를 선택해서 설치합니다.

2. RStudio 설치

RStudio는 R 개발환경입니다. R library관리, 코드 에디팅, 실행 등등을 RStudio 한군데서 할 수 있어요. https://www.rstudio.com/products/rstudio/download/ 에서 RStudio Desktop을 다운받아 설치합니다.

이제 R 사용할 준비는 다 된거예요. 참 쉽죠~?

 

2021-04-27

R로 Linear Regression Model로 분석하기

df라는 데이타프레임이 있다고 합시다. 하나 만들어 보았어요.

> df <-  data.frame(xx=c(1,2,3,4,5), yy=c(1.1, 2.1, 3.2, 3.9, 5.2))

df는 이렇게 생겼습니다.

> df
  xx  yy
1  1 1.1
2  2 2.1
3  3 3.2
4  4 3.9
5  5 5.2

xx와 yy의 관계를 그림으로 보면 이렇습니다.



yy가 xx의 linear model로 설명될 수 있는지를 알기 위해 lm함수를 이용해서 모델을 만듭니다.

> lin.model <- lm(yy~xx, data=df)

lm의 첫번째 argument는 yy와 xx의 관계를 표현하는 식, 두번째 argument는 사용할 데이타프레임, 그러니까 df입니다.

만들어진 linear modeling결과물을 봅시다.

> summary(lin.model)

Call:
lm(formula = yy ~ xx, data = df)
Residuals:
         1          2          3          4          5 
 6.939e-18  2.936e-16  1.000e-01 -2.000e-01  1.000e-01 
Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.10000    0.14832   0.674 0.548486    
xx           1.00000    0.04472  22.361 0.000196 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1414 on 3 degrees of freedom
Multiple R-squared:  0.994, Adjusted R-squared:  0.992 
F-statistic:   500 on 1 and 3 DF,  p-value: 0.0001958

가장 중요한 부분에 하이라이트했어요. xx에 대한 p-value가 0.000196으로 별세개. 그러니까, yy는 xx의 선형함수로 표현되고 이게 통계학적으로 유의미하다는 결과가 나왔네요.

2015-07-16

R로 Linear Mixed-effects Model 통계 분석

x가 y에 영향을 미치는 지 알고 싶어서 실험을 합니다.

여러 subjects로 실험을 하는데, 그런데 subject마다 y의 평균값이 높기도 하고 낮기도 하고 하는 식으로 다를 수 있습니다.

하지만 어쨋거나 x가 y에 linear하게 영향을 미치는지 확인하고 싶습니다.

이럴때, Linear Mixed-effects Model로 분석을 합니다.

이때 x가 fixed effect이고 subjectID는 random effect입니다.

R에서 하는 법:
  1. R에 lme4 package를 사용합니다: library(lme4)라고 입력합니다.
  2. lmer함수를 사용합니다: lmer(y~x+ (1|subjectID), data=dtableName)
단순 linear model이아니고 generalized linear model로 분석하고 싶으면,
lmer대신 glmer을 쓰면 되고요. 이때는 family를 세팅해줘야합니다.