我正在使用加权分析并使用svyglm
来分析来自复杂加权方案的数据以获得无响应。我想通过指定binomial(link=log)
作为族来拟合对数二项模型来估计适合大多数情况的患病率。但是,在默认装配工无法找到一组起始系数的情况下,我发现在大多数情况下有效的设置是设置Start <- c(log(mean(response.var)), rep(0, ncov))
。
当我向start
包中的svyglm
函数提供survey
时,R会抛出一个我似乎无法解析的错误。似乎只有一个协变量是一个因素。
示例:
library(survey)
data(api)
apistrat$qmeal <- with(apistrat, cut(meals, quantile(meals)))
dstrat<-svydesign(id=~1,strata=~stype, weights=~pw, data=apistrat, fpc=~fpc)
有关GLM的一个例子,为无意义的事物建模以重现错误:
> svyglm(awards ~ qmeal +emer, family=quasibinomial(link=log), design=dstrat)
Error: no valid set of coefficients has been found: please supply starting values
好的......所以我指定:Start <- c(log(mean(api$awards, na.rm=T)), 0, 0, 0, 0)
> svyglm(awards ~ cut(meals, quantile(meals)) +emer, family=quasibinomial, design=dstrat, start=start)
> svyglm(awards ~ qmeal +emer, family=quasibinomial(link=log), design=dstrat, start=start)
Error in glm.fit(x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, :
length of 'start' should equal 5 and correspond to initial coefs for c("(Intercept)", "qmeal(20.8,39.5]", "qmeal(39.5,69]", "qmeal(69,100]", , "emer")
有趣的是,start
IS的长度为5.我进一步注意到svyglm
始终产生额外的,
(在最后一个qmeal变量和“emer”之间查看)缺少条目。在提供标准glm
时,这没有这样的问题:
glm(awards ~ qmeal +emer, family=quasibinomial(link=log), data=apistrat, start=start)
产生正确的输出:
Call: glm(formula = awards ~ qmeal + emer, family = quasibinomial(link = log),
data = apistrat, start = start)
Coefficients:
(Intercept) qmeal(20.8,39.5] qmeal(39.5,69] qmeal(69,100] emer
-0.59276 0.13058 0.31311 0.24698 -0.01389
Degrees of Freedom: 198 Total (i.e. Null); 194 Residual
(1 observation deleted due to missingness)
Null Deviance: 272.7
Residual Deviance: 265.7 AIC: NA
答案 0 :(得分:2)
您的代码实际上并未运行,但如果我改为运行
start <- c(log(mean(apistrat$awards=="Yes", na.rm=T)), 0, 0, 0, 0)
我确实收到了你所询问的错误。之所以发生这种情况,是因为对glm
的调用会在设计对象(故意)中查找其参数,然后在svyglm
内查找(不是故意的)。正式论证start
在那里不可见。但是start
是stats
包中函数的名称,并且由于复杂的原因[1],这就是你得到的参数。它没有长度5.迷路逗号是虚假的[2]
解决方法是明确指定start
参数而不是变量,因此不需要查找
svyglm(awards ~ qmeal +emer, family=quasibinomial(link=log), design=dstrat, start=c(log(mean(apistrat$awards=="Yes", na.rm=T)), 0, 0, 0, 0))
另一种解决方法是指定一些不是现有函数名称的东西,因此查找会移动到下一级别并找到您的变量。例如,这些都适合我:
initial <- c(log(mean(apistrat$awards=="Yes", na.rm=T)), 0, 0, 0, 0)
svyglm(awards ~ qmeal +emer, family=quasibinomial(link=log), design=dstrat, start=initial)
rose <- c(log(mean(apistrat$awards=="Yes", na.rm=T)), 0, 0, 0, 0)
svyglm(awards ~ qmeal +emer, family=quasibinomial(link=log), design=dstrat, start=rose)
我将尝试为下一个版本修复此问题。
[1]不,如果不进行一系列实验,我就无法准确了。他们很复杂。
[2] glm.fit
使用deparse
将名称向量转换为字符串,向量足够长以突破两行,这就是逗号的来源。如果变量被称为m
而不是qmeal
,则不会得到逗号。你可能会认为这是glm.fit
中的一个错误,但你可能会花费更多的努力。
答案 1 :(得分:1)
在glm
内调用svyglm
的方式似乎存在问题。用任何与start
的参数名称不匹配的内容(例如,x
)替换矢量名称svyglm
可以解决问题。