系数名称在R中不匹配

时间:2012-05-17 19:37:15

标签: r survey matching

我确信这是一个简单的问题,但我对R的基本理解阻碍了我。它可能与字符串不等同于变量名称...

我正在尝试使用调查包与对比进行互动。

se_race4是一个因子变量,有4个类别:“1)非西班牙裔白人”,“2)黑人”,“3)西班牙裔”,“4)其他”

我像这样运行模型:

mod1 <- lm(sysbp ~ pmper10*se_race4 + age_baseline, data=mydata)

然后我看一些对比:

svycontrast(mod1,c("pmper10"=1)

以下命令有效:

svycontrast(mod1,c("pmper10"=1,"pmper10:se_race42) Black"=1))
svycontrast(mod1,c("pmper10"=1,"pmper10:se_race43) Hispanic"=1))
svycontrast(mod1,c("pmper10"=1,"pmper10:se_race44) Other"=1))

但这不是(即使'z'看起来就像上面的字符串一样):

for(z in grep("pmper10:se_race4",names(coef(mod1)),value=TRUE)) {
    svycontrast(mod1,c("pmper10"=1, z=1))
}

R给我错误:

Error in match.names(names(coef(stat)), contrasts) : names not matched

我错过了什么?

编辑: names(coef(mod1))的结果:

[1] "(Intercept)"                 "pmper10"                    
[3] "se_race42) Black"            "se_race43) Hispanic"        
[5] "se_race44) Other"            "age_baseline"               
[7] "pmper10:se_race42) Black"    "pmper10:se_race43) Hispanic"
[9] "pmper10:se_race44) Other"

names(c("pmper10"=1, z=1))

的结果
 [1] "pmper10" "z" 

z

的结果
[1] "pmper10:se_race44) Other"

看起来不对劲!如何让“z”变成z的值?

1 个答案:

答案 0 :(得分:2)

此错误告诉您向量contrasts应与向量names(coef(stat))匹配,并且它不匹配。

如果您查看svycontrast帮助:

svycontrast(stat, contrasts, ...)

stats是您的mod1contrasts是向量c("pmper10"=1, z=1)

键入names(coef(mod1))names(c("pmper10"=1, z=1)),查看错误的位置。

您应该通过以下方式替换for命令:

sapply(grep("pmper10:se_race4",names(coef(mod1)),value=TRUE), function(z) {
    svycontrast(mod1,c("pmper10"=1, paste(z)=1))
})

编辑:

这不是最优雅的解决方案,但似乎有效:

sapply(grep("pmper10:se_race4",names(coef(mod1)),value=TRUE), function(z) {
    contrasts <- c(1,1)
    names(contrasts) <- c("pmper10",z)
    svycontrast(mod1,contrasts)
})