R语言svychisq语法及svytable的summary使用问题
解决svychisq调用和svytable summary显示小数的问题
一、用已生成的svytable调用svychisq(不用重复写公式)
你之前试的svychisq(AxB, surveydesign)和svychisq(~AxB, surveydesign)都走不通,原因很简单:
AxB是svytable生成的表格对象,直接丢给svychisq的话,它没法正确关联到你的调查设计;- 写
~AxB相当于把AxB当成原始数据集里的变量,但它根本不是,自然会报错。
给你两个好用的办法:
方法1:提取svytable自带的公式
svytable生成的对象会自动保存你当初用的公式,直接提取出来再传给svychisq就行,完全不用重复敲~A+B:
# 从AxB里取出生成它的公式 tab_formula <- attr(AxB, "formula") # 用这个公式调用svychisq svychisq(tab_formula, surveydesign)
方法2:直接用表格对象(指定design参数)
如果你偏想用AxB直接调用,记得要明确指定design参数,别只传位置参数:
svychisq(AxB, design = surveydesign)
不过更推荐第一种方法,不容易因为参数顺序搞错出问题。
二、让summary(AxB)显示小数比例
你说summary里的表格只显示0和1,是因为svytable返回的是缩放后的整数频数(你设了Ntotal=100,它就把原始频数按比例缩到总样本100,结果自然是整数),而不是你想要的小数比例。而且digits=4只能调整卡方值的小数位数,管不了表格的显示类型。
要显示小数比例,试试这两种方式:
方法1:先转成比例表再summary
把AxB转换成比例表后再做summary,就能看到0.xx格式的数值了:
# 将svytable转换为比例表 AxB_prop <- prop.table(AxB) # 查看带小数的表格和卡方结果,digits控制卡方值的小数位数 summary(AxB_prop, digits=4)
方法2:自定义summary的表格显示
如果不想重新生成比例表,也可以直接修改summary输出的表格部分:
# 先拿到summary的结果 tab_summary <- summary(AxB) # 把表格转换成小数格式,digits控制小数位数 tab_summary$table <- format(prop.table(tab_summary$table), digits=4) # 打印修改后的结果 print(tab_summary)
最后补充一句:帮助文档说“svytable的summary会调用svychisq”,意思是summary.svytable内部会自动调用svychisq计算卡方统计量,所以你用summary(AxB)得到的卡方值,和直接跑svychisq(~A+B, surveydesign)是完全一样的哦。
内容的提问来源于stack exchange,提问作者gabriel fernandez




