2

我注意到许多 R 模型允许使用“权重”参数(例如 cart、loess、gam、...)。大多数帮助功能将其描述为数据的“先验权重”,但这实际上意味着什么?

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

4

2 回答 2

2

二项式响应的权重有一个自然的解释:对应于每个观察的试验次数。如果你有成功n的试验p,你适合这个

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

gamgammgcv包中同样适用。

于 2013-07-19T17:58:03.447 回答
1

我也曾经认为权重是为重复观察编码样本大小的一种方便方法。但以下示例表明,对于简单的线性模型,情况并非如此。我首先定义一个列联表,其中包含观察/发明的鞋码和人的身高,并拟合一个 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 个自由度”

于 2013-07-20T02:51:04.917 回答