如何在R中表达多个类别的成员资格?

时间:2015-09-27 01:14:43

标签: r

如何表达一个线性模型,其中观察可以属于多个类别,并且类别的数量很大?

例如,使用时间虚拟对象作为类别,这是一个易于设置的问题,因为类别(时间段)的数量很少且已知:

tmp <- "day 1, day 2
0,1
1,0
1,1"
periods <- read.csv(text = tmp)
y <- rnorm(3)
print(lm(y ~ day.1 + day.2 + 0, data=periods))

现在假设不是两天就有100个。我是否需要创建如下的公式?

y ~ day.1 + day.2 + ... + day.100 + 0

据推测,必须以编程方式创建这样的公式。这似乎不优雅且不像R一样。

解决这个问题的正确方法是什么?例如,除了公式问题之外,是否有更好的方法来创建假人而不是创建1和0的矩阵(如上所述)?为了具体起见,假设实际数据包括(对于每个观察)开始和结束日期(因此tmp在开始和结束之间的每一列中将包含1)。

更新

基于@jlhoward的答案,这是一个更大的例子:

num.observations <- 1000
# Manually create 100 columns of dummies called x1, ..., x100
periods <- data.frame(1*matrix(runif(num.observations*100) > 0.5, nrow = num.observations))
y <- rnorm(num.observations)
print(summary(lm(y ~ ., data = periods)))

它说明了手动创建虚拟数据框(1和0)。我有兴趣了解是否有一种更像R的方式来处理这些“每次观察多个假人”问题。

1 个答案:

答案 0 :(得分:1)

您可以使用.表示法在公式中包含除响应之外的所有变量,并使用-1删除截距。另外,将所有内容放在数据框中;不要将y作为单独的向量。

set.seed(1)    # for reproducibility
df  <- data.frame(y=rnorm(3),read.csv(text=tmp))
fit.1 <- lm(y ~ day.1 + day.2 + 0, df)
fit.2 <- lm(y ~ -1 + ., df)
identical(coef(fit.1),coef(fit.2))
# [1] TRUE