如何表达一个线性模型,其中观察值可以属于多个类别并且类别的数量很大?
例如,使用时间假人作为类别,这是一个易于设置的问题,因为类别(时间段)的数量很小并且是已知的:
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。
解决这个问题的正确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)))
它说明了手动创建假人(1s和0s)数据框的过程。我想研究一下是否有一种更像R的方式来处理这些“每个观察多个假人”的问题。
您可以使用该.
符号在公式中包括响应以外的所有变量,并-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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句