【问题标题】:Creating Dummy Variables from data frame从数据框创建虚拟变量
【发布时间】:2018-10-18 17:39:28
【问题描述】:

我需要做一个贝叶斯线性回归(使用重新思考包),这需要我的分类变量是数字(我认为),所以我试图创建虚拟变量,以便不同的类别由 (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 )

如果您能提供任何帮助,谢谢!

【问题讨论】:

  • 试试model.matrix(~ Item.Name, X)model.matrix(~ Strain, X)如果你不需要拦截,model.matrix(~ Strain-1, X)
  • 我认为你想要mu = 或者mu ~,而不是mu &lt;- 在你的alist() 中。正如 akrun 所示,给 model.matrix 一个公式和一个数据框,而不仅仅是一列。 (尤其是不存在的列)
  • 简短的回答是......不要那样做。它不是必需的,会分散您识别真正错误的注意力,并阻止您有效地使用 R 的公式机制。
  • 我在西雅图待了 9 年,大约一年前搬走了。自 96 年以来就没有住在湾区
  • @Gregor:你一定是把你和另一个 SO 常规混为一谈了。我在特拉弗斯城长大,所以当我查看你的个人资料时感到很惊讶。

标签: r bayesian


【解决方案1】:

您不需要做任何 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-argument 的上下文中正确扩展整个模型矩阵来解释因子变量。因此,您不需要以objecName$columnName 的身份访问变量,而只需向data=-argument 提供带有列名和对象的公式。这适用于数值变量和因子变量。看看结果:

 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

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多