在R中重复使用权重(特别是二进制响应的gam)

时间:2013-07-19 17:53:21

标签: r loess gam mgcv cart-analysis

我注意到许多R型号允许“重量”参数(例如购物车,黄土,游戏......)。大多数帮助函数将其描述为数据的“先验权重”,但这实际上意味着什么?

我有许多重复案例的数据和二进制响应。我希望我可以使用“权重”来编码输入和响应的每个组合出现的次数,但这似乎不起作用。我也尝试将响应成功的比例和每个协变量组合的总试验的权重,但这似乎也不起作用(至少对于gam)。我正在尝试为上面列出的所有模型类型执行此操作,但对于初学者,如何为gam [mgcv包]执行此操作?

2 个答案:

答案 0 :(得分:2)

二项式响应的权重具有自然解释:对应于每个观察的试验次数。如果您有np次成功的试验,那么您可以使用

glm(p/n ~ x, family=binomial, weights=n)

同样适用gamgam包中的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自由度”非常显着