Создание фиктивных переменных из фрейма данных - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно выполнить байесовскую линейную регрессию (используя пакет переосмысления), которая требует, чтобы моя категориальная переменная была числовой (я думаю), поэтому я пытаюсь создать фиктивные переменные, чтобы различные категории были представлены (0,1,2,3 ...).Я смоделировал некоторые данные ниже, чтобы показать вам, как выглядят мои данные.Имейте в виду, что мои фактические данные содержат гораздо больше категориальных переменных, которые представлены здесь, поэтому использование набора функций ifelse было бы не идеальным:

#simulated data
X <- data.frame(
    Longest.axis = rnorm(50,10,5),
    Time..hrs. = round(runif(50,0,4)),
    Strain = sapply(1:50,function(x) {ifelse(x<12,"Msmeg_2788","Msmeg_WT")}),
    Item.Name = sapply(1:50,
        function(x) 
            {ifelse(x<6,"Q109.jpg",
            ifelse(x<20,"Q340.jpg",
                ifelse(x<40,"Q11.jpg","Q230.jpg")
            )
        )}
    )
) 

И ниже я покажу свою попытку создания фиктивных переменных:

#create dummy variables
Straindummy <- model.matrix(X$Strain)
Item.Namedummy <- model.matrix(X$Item.Name)

возвращает следующую ошибку:

Error: $ operator is invalid for atomic vectors

И вот моя попытка сделать многомерную байесовскую линейную регрессию на тот случай, если вам понадобится предложить то, что мне следует сделать:

library(rethinking)
model <- map(
    alist(
        X$Longest.Axis ~ dnorm(mu,sigma),
        mu <- a + b1*Straindummy+b2*Item.Namedummy+b3*X$Time..hrs.,
        a ~ dnorm(10,10),
        b1 ~ dnorm(0,1),
        b2 ~ dnorm(0,1),
        b3 ~ dnorm(0,1),
        sigma ~ dunif(0,10)
    ),
    data = X )

Спасибо, если можете предложить любую помощь!

1 Ответ

0 голосов
/ 18 октября 2018

Вам не нужно ничего делать с model.matrix, так как R-факторы числовые "под капотом".Но вам нужно установить (и вы, вероятно, не описали, как это сделать для следующих читателей), зависимости и пакет от Github:

install.packages(c("coda","mvtnorm","devtools","loo"))
library(devtools)
devtools::install_github("rmcelreath/rethinking")

Затем, после исправления ошибки имени переменной,исходный код работает с исходными именами столбцов:

 library(rethinking)
model <- map(
    alist(
        Longest.axis ~ dnorm(mu,sigma),
        mu <- a + b1*X$Strain+b2*X$Item.Name+b3*X$Time..hrs.,
        a ~ dnorm(10,10),
        b1 ~ dnorm(0,1),
        b2 ~ dnorm(0,1),
        b3 ~ dnorm(0,1),
        sigma ~ dunif(0,10)
    ),
    data = X )

model
#--------------------------------------
Maximum a posteriori (MAP) model fit

Formula:
Longest.axis ~ dnorm(mu, sigma)
mu <- a + b1 * X$Strain + b2 * X$Item.Name + b3 * X$Time..hrs.
a ~ dnorm(10, 10)
b1 ~ dnorm(0, 1)
b2 ~ dnorm(0, 1)
b3 ~ dnorm(0, 1)
sigma ~ dunif(0, 10)

MAP values:
          a          b1          b2          b3       sigma 
10.73889375 -0.21053314  0.01836911 -0.24736940  4.69900162 

Log-likelihood: -148.32 

И, кроме того, он работает правильно, если вы пропустите X $ -метод доступа к данным:

...
mu <- a + b1*Strain+b2*Item.Name+b3*X$Time..hrs.,
...

Правильно написанные функции будут интерпретироватьфакторная переменная путем правильного расширения полной модельной матрицы в контексте data -аргумента.Поэтому вам НЕ нужно обращаться к переменным как objecName$columnName, а просто указывать формулу с именами столбцов и объектом для data= -аргумента.Это относится как к числовым, так и к факторным переменным.Посмотрите на результаты:

 object <- data.frame(x=runif(10), y=factor( sample(c('a','b','c'),10,rep=TRUE)))
 model.matrix(~x+y, object)
#----------------------
(Intercept)          x yb yc
1            1 0.04942913  0  0
2            1 0.92403817  1  0
3            1 0.46485707  0  1
4            1 0.57529925  1  0
5            1 0.47036022  0  1
6            1 0.63165954  0  0
7            1 0.11975911  0  1
8            1 0.13187866  1  0
9            1 0.25253765  0  1
10           1 0.52289041  1  0
attr(,"assign")
[1] 0 1 2 2
attr(,"contrasts")
attr(,"contrasts")$y
[1] "contr.treatment
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...