R 从数据帧创建虚拟变量
我需要做一个贝叶斯线性回归(使用重新思考软件包),它要求我的分类变量是数字的(我想),所以我尝试创建虚拟变量,以便不同的类别用(0,1,2,3…)表示。我在下面模拟了一些数据,向您展示了我的数据。请记住,我的实际数据包含更多的分类变量,这些变量在这里表示,因此使用一堆ifelse函数并不理想:R 从数据帧创建虚拟变量,r,bayesian,R,Bayesian,我需要做一个贝叶斯线性回归(使用重新思考软件包),它要求我的分类变量是数字的(我想),所以我尝试创建虚拟变量,以便不同的类别用(0,1,2,3…)表示。我在下面模拟了一些数据,向您展示了我的数据。请记住,我的实际数据包含更多的分类变量,这些变量在这里表示,因此使用一堆ifelse函数并不理想: #simulated data X <- data.frame( Longest.axis = rnorm(50,10,5), Time..hrs. = round(runif(50
#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")
)
)}
)
)
这是我尝试做的多元贝叶斯线性回归,以防你需要它来建议我应该做什么:
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你不需要做任何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
试试model.matrix(~Item.Name,X)
或者model.matrix(~train,X)
如果你不需要截距,model.matrix(~train-1,X)
我想你想要mu=
或者mu
,而不是mu简而言之。。。不要那样做。它是不需要的,它会分散你识别真正错误的注意力,并阻止你有效地使用R的公式机制。我在西雅图呆了9年,大约一年前搬走了。从那以后就没在湾区住过了96@Gregor:你一定是和另一个如此普通的人混在一起了。我在特拉弗斯城长大,所以当我查到你的个人资料时,我很惊讶。
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
...
mu <- a + b1*Strain+b2*Item.Name+b3*X$Time..hrs.,
...
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