我注意到许多 R 模型允许使用“权重”参数(例如 cart、loess、gam、...)。大多数帮助功能将其描述为数据的“先验权重”,但这实际上意味着什么?
我有许多重复案例和二进制响应的数据。我希望我可以使用“权重”来编码每个输入和响应组合发生的次数,但这似乎不起作用。我还尝试将响应作为成功的比例,以及对每个协变量组合的总试验权重,但这似乎也不起作用(至少对于 gam 而言)。我正在尝试对上面列出的所有模型类型执行此操作,但对于初学者,如何为 gam [mgcv 包] 执行此操作?
我注意到许多 R 模型允许使用“权重”参数(例如 cart、loess、gam、...)。大多数帮助功能将其描述为数据的“先验权重”,但这实际上意味着什么?
我有许多重复案例和二进制响应的数据。我希望我可以使用“权重”来编码每个输入和响应组合发生的次数,但这似乎不起作用。我还尝试将响应作为成功的比例,以及对每个协变量组合的总试验权重,但这似乎也不起作用(至少对于 gam 而言)。我正在尝试对上面列出的所有模型类型执行此操作,但对于初学者,如何为 gam [mgcv 包] 执行此操作?
二项式响应的权重有一个自然的解释:对应于每个观察的试验次数。如果你有成功n
的试验p
,你适合这个
glm(p/n ~ x, family=binomial, weights=n)
gam
在gam
和mgcv
包中同样适用。
我也曾经认为权重是为重复观察编码样本大小的一种方便方法。但以下示例表明,对于简单的线性模型,情况并非如此。我首先定义一个列联表,其中包含观察/发明的鞋码和人的身高,并拟合一个 leats squares 回归,将频率指定为权重:
SKdata = matrix(c(20,5,5,5,40,15,3,27,30,2,3,10),ncol=4)
dimnames(SKdata) = list(shoesize=10:12,height=seq(160,190,by=10))
x = as.data.frame(as.table(SKdata), stringsAsFactors=FALSE)
for (i in 1:ncol(x)) x[,i] = as.numeric(x[,i])
fit1 = lm(height ~ shoesize,data=x, weights=Freq)
summary(fit1)
请注意,斜率的系数不显着,残差基于“10 自由度”
当我将列联表转换为“原始”数据时,这会发生变化,这意味着每次观察一行,使用方便的函数 expand.dft:
expand.dft <- function(x, na.strings = "NA", as.is = FALSE, dec = ".")
{
DF <- sapply(1:nrow(x), function(i) x[rep(i, each = x$Freq[i]), ],
simplify = FALSE)
DF <- subset(do.call("rbind", DF), select = -Freq)
for (i in 1:ncol(DF))
{
DF[[i]] <- type.convert(as.character(DF[[i]]),
na.strings = na.strings,
as.is = as.is, dec = dec)
}
DF
}
fit2 = lm(height ~ shoesize,data=expand.dft(x))
summary(fit2)
我们获得了相同的系数,但这次非常重要,因为基于“163 个自由度”