我注意到许多R型号允许“重量”参数(例如购物车,黄土,游戏......)。大多数帮助函数将其描述为数据的“先验权重”,但这实际上意味着什么?
我有许多重复案例的数据和二进制响应。我希望我可以使用“权重”来编码输入和响应的每个组合出现的次数,但这似乎不起作用。我也尝试将响应成功的比例和每个协变量组合的总试验的权重,但这似乎也不起作用(至少对于gam)。我正在尝试为上面列出的所有模型类型执行此操作,但对于初学者,如何为gam [mgcv包]执行此操作?
答案 0 :(得分:2)
二项式响应的权重具有自然解释:对应于每个观察的试验次数。如果您有n
次p
次成功的试验,那么您可以使用
glm(p/n ~ x, family=binomial, weights=n)
同样适用gam
和gam
包中的mgcv
。
答案 1 :(得分:1)
我也曾经认为权重是编码重复观察样本大小的便捷方式。但是下面的例子表明,对于简单的线性模型,情况并非如此。我首先用观察/发明的鞋子尺寸和人的高度来定义一个列联表,并且适合一个方块回归,指定频率作为权重:
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自由度”非常显着