无法使用因子变量,R调查包

时间:2018-02-13 23:02:07

标签: r survey

我正在使用加权分析并使用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

2 个答案:

答案 0 :(得分:2)

您的代码实际上并未运行,但如果我改为运行 start <- c(log(mean(apistrat$awards=="Yes", na.rm=T)), 0, 0, 0, 0)

我确实收到了你所询问的错误。之所以发生这种情况,是因为对glm的调用会在设计对象(故意)中查找其参数,然后在svyglm内查找(不是故意的)。正式论证start在那里不可见。但是startstats包中函数的名称,并且由于复杂的原因[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可以解决问题。