[R스터디:RQUESTIONS] 한글 인코딩, fixed effect model
WeGetRQuestions(22/03/05)
두 번째 시간
지난 주에는 참석 예정이었던 분이 모두 밀접 접촉자가 되어 쉬었습니다. 이번 주가 2번째 시간이었습니다. 모두 첫 번째 시간에 함께 하셨던 분이었는데 질문을 다시 가지고 오셨습니다.
첫 번째 질문: 텍스트 마이닝 관련
데이터는 다음과 같습니다.
txt <- "정권교체 하겠습니다!
정치교체 하겠습니다!
시대교체 하겠습니다!
‘불비불명(不飛不鳴)’이라는 고사가 있습니다. 남쪽 언덕 나뭇가지에 앉아, 3년 동안 날지도 울지도 않는 새. 그러나 그 새는 한번 날면 하늘 끝까지 날고, 한번 울면 천지를 뒤흔듭니다.
"
raw_moon <- unlist(strsplit(txt, "\n"))
# 윗 부분은 원래는 파일에서 읽는 부분이었습니다만 편의상 수정하였습니다.
raw_moon <- iconv(raw_moon, to='UTF-8')
티블 출력에서 한글 문제
보내주신 소스 코드는 다음과 같았습니다.
#Sys.setlocale('LC_ALL', 'korean')
Sys.setlocale('LC_ALL', 'english')
## [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"
library(stringr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidytext)
library(readr)
#전처리
moon <- raw_moon %>%
str_replace_all("[^가-힣]", " ")
head(moon)
## [1] NA NA NA "" NA
moon <- moon %>%
str_squish()
head(moon)
## [1] NA NA NA "" NA
moon2 <- as_tibble(moon)
moon2
## # A tibble: 5 x 1
## value
## <chr>
## 1 <NA>
## 2 <NA>
## 3 <NA>
## 4 ""
## 5 <NA>
첫 번째 문제
이 문제는 두 가지로 나눠 볼 수 있습니다. 첫 번째로 문자열을 UTF-8
로 하지 않고 바로 해봅시다.
raw_moon <- unlist(strsplit(txt, "\n"))
# iconv()부분을 제외하였습니다.
#전처리
moon <- raw_moon %>%
str_replace_all("[^가-힣]", " ")
head(moon)
## [1] " 정권 교체 하겠습니다 "
moon <- moon %>%
str_squish()
head(moon)
## [1] "정권 교체 하겠습니다"
moon2 <- as_tibble(moon)
moon2
## # A tibble: 1 x 1
## value
## <chr>
## 1 <U+C815><U+AD8C> <U+AD50><U+CCB4> <U+D558><U+ACA0><U+C2B5><U+B2C8><U+B2E4>
문제는 as_tibble()
의 결과인 moon2
를 출력해보면 알 수 없는 숫자들만 출력된다는 점입니다.
출력 결과를 봅시다. <U+C815>
는 유니코드 코드포인트 C815
의 글자를 의미합니다. 다음과 같이 글자가 무엇인지 확인해 볼 수 있습니다.
'\uc815'
## [1] "<U+C815>"
그래서 출력된 결과의 처음 부분을 확인해 보면 다음과 같습니다.
"\uC815\uAD8C\uAD50\uCCB4 \uD558\uACA0"
## [1] "<U+C815><U+AD8C><U+AD50><U+CCB4> <U+D558><U+ACA0>"
따라서 내용은 정확하게 들어가 있는데 출력이 안 되는 문제 같습니다. 그런데 처음을 보면 로케일을 영어로 지정하고 있습니다. 이렇게 로케일일 영어로 지정되어 있는 경우에도 벡터는 출력이 되지만 티블과 데이터프레임은 로케일에 맞춰 한글이 출력되지 않습니다.
Sys.setlocale('LC_ALL', 'Korean')
을 하면 로케일이 변경되어 한글 출력을 볼 수 있습니다.
Sys.setlocale('LC_ALL', 'Korean')
## [1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
두 번째 문제: 패턴의 인코딩 문제
두 번째 문제는 다음과 같이 문자열의 인코딩이 UTF-8
일 때입니다.
txt = iconv(" 정권 교체 하겠습니다. ", to="UTF-8")
txt2 <- txt %>%
str_replace_all("[^가-힣]", "")
txt2
## [1] "정권교체하겠습니다"
str_replace_all()
은 UTF-8
문자열에 대해서 패턴 역시 UTF-8
이기를 기대합니다. 따라서 다음과 같이 [^가-힣]
도 UTF-8로 변환해 주어야 합니다.
txt = iconv(" 정권 교체 하겠습니다. ", to="UTF-8")
patt = iconv("[^가-힣]", to="UTF-8")
txt2 <- txt %>%
str_replace_all(patt, "")
txt2
## [1] "정권교체하겠습니다"
두 번째 질문
두 번째 질문은 mixed effects model에 관한 질문이었습니다. 나라 수준의 predictor가 2개 있을 때, random intercept model을 돌렸는데, reviewer가 fixed effect model로 돌려보라고 했다고 합니다. 그런데 그걸 어떻게 해야 하는지가 질문이었습니다.
좀더 구체적으로 얘기하면 나라 dummy variable과 나라 수준의 predictor를 함께 모형에 넣었는데, 그렇게 되면 predictor가 추정이 되지 않아야 함에도 stata의 결과는 그렇지 않다는 것이었습니다.
제가 결과를 확인해보니 predictor에 대한 추정값이 보고가 되었지만, 나라 dummy에 대한 추정값은 3개가 collinearity 때문에 제거되었다는 메시지가 있었습니다.
아마도 predictor의 순서에 따라 제외되는 predictor가 다른 것 같습니다. 어쨋든 결과가 동일합니다. 나라 수준의 predictor(나라 dummy 포함)가 너무 많아서 결정되지 못하는 경우에는 결정될 수 있을 때까지 predictor가 제외됩니다.1 아마도 그때 제외되는 순서는 모형에 포함되는 순서가 아닐까 합니다.
그래서 나라 수준의 predictor 2개에 대한 parameter 추정값으 보고되었지만, 나라 dummy 2개가 빠진 것으로 fixed effect model에서는 나라 dummy와 나라 수준의 predictor를 모두 넣을 수 없다는 것을 보여줍니다.
====
유료 R STUDY 안내
- 관심이 있다면 링크를 클릭하세요!
-
예를 들어 \(x+y=1\) 일 때, \(x\)와 \(y\)를 결정할 수 없습니다.↩︎
// add bootstrap table styles to pandoc tables function bootstrapStylePandocTables() { $('tr.odd').parent('tbody').parent('table').addClass('table table-condensed'); } $(document).ready(function () { bootstrapStylePandocTables(); });
Leave a comment