【问题标题】:svymean returns 0 mean & SE for all variablessvymean 为所有变量返回 0 均值和 SE
【发布时间】:2020-10-22 15:42:33
【问题描述】:

我有这样的数据。我的实际数据包含 500 多个变量和 2000 行。大多数变量都是数字。

library(survey)
library(dplyr)

data_in <- read_table2("Q62_1   Q62_2   Q62_3   Q62_4   Q62_5   Q62_6   Q62_8   Q62_9   Q62_11  strata_num  fpl_num ID  wgt_part2B
    0   0   0   0   0   0   1   0   NA  28  1024    1   13.23574543
    NA  NA  NA  NA  NA  NA  NA  NA  1   56  1024    2   2.116895199
    1   0   0   1   0   0   1   1   NA  53  1024    3   3.570008516
    NA  NA  NA  NA  NA  NA  NA  NA  1   55  175 4   2.136456013
    NA  NA  NA  NA  NA  NA  NA  NA  1   65  1024    5   3.126420259
    NA  NA  NA  NA  NA  NA  NA  NA  1   48  1024    6   22.76417923
    0   0   0   1   0   0   1   0   NA  57  1024    7   41.29535294
    1   0   0   1   0   0   0   1   NA  50  1024    8   3.343874216
    0   1   0   0   1   0   1   0   NA  63  1024    9   4.042140961
    0   0   1   0   0   1   0   0   NA  66  175 10  2.071694136
    0   0   0   0   0   0   0   1   NA  3   1024    11  33.75452805
    1   1   1   1   1   1   1   1   NA  53  1024    12  3.676005363
    NA  NA  NA  NA  NA  NA  NA  NA  1   50  1024    13  1.816867232
    NA  NA  NA  NA  NA  NA  NA  NA  1   31  1024    14  7.386627674
    1   1   0   1   1   0   1   1   NA  43  1024    15  41.09143829
    1   0   0   0   0   0   0   0   NA  22  1024    16  2.053463221
    NA  NA  NA  NA  NA  NA  NA  NA  1   46  1024    17  2.977662086
    NA  NA  NA  NA  NA  NA  NA  NA  1   10  175 18  1.600314736
    1   1   0   1   0   0   0   0   NA  5   1024    19  11.9602499
    NA  NA  NA  NA  NA  NA  NA  NA  1   39  1024    20  2.177173615
    0   0   0   0   0   0   1   1   NA  17  1024    21  28.22195816
    NA  NA  NA  NA  NA  NA  NA  NA  NA  47  1024    22  1.565697789
    NA  NA  NA  NA  NA  NA  NA  NA  NA  65  1024    23  1.679090261
    0   0   1   0   0   0   1   0   NA  40  175 24  1.735284925
    0   0   0   0   1   0   1   1   NA  53  1024    25  1.60990274
    NA  NA  NA  NA  NA  NA  NA  NA  1   26  1024    26  1.949402809
    NA  NA  NA  NA  NA  NA  NA  NA  1   56  175 27  1.851846814
    1   0   0   0   1   0   1   1   NA  37  1024    28  16.71925735
    0   0   0   0   0   0   0   1   NA  63  1024    29  4.269656658
    NA  NA  NA  NA  NA  NA  NA  NA  NA  27  1024    30  1.471351266
    0   0   0   0   0   1   0   1   NA  70  1024    31  1.714126825
    1   1   0   1   1   0   1   0   NA  48  1024    32  4.113308907
    0   0   1   1   1   0   1   1   NA  44  175 33  2.039677382
    0   0   0   0   1   0   1   0   NA  32  1024    34  1.909546375
    ")

我设置了这样的调查设计

SurveyDesign <- svydesign(id =~ID,
                          strata =~strata_num,
                          weights  = ~wgt_part2B, 
                          fpc =~fpl_num,
                          data = data_in)

我对所有变量都运行了 svymean

svymean(reformulate(names(data_in)),SurveyDesign,na.rm=TRUE)

由于某种原因,所有均值都显示为零。当我对一些变量运行 svymean 时,平均值显示得很好。

这是 svymean 使用其中一个变量的示例

data_in2 <- data_in1 %>% select(matches("Q62_11|strata_num|fpl_num|ID|wgt_part2B"))

SurveyDesign <- svydesign(id =~ID,
                          # strata =~strata_num,
                          weights  = ~wgt_part2B, 
                          # fpc =~fpl_num,
                          data = data_in2)


svymean(reformulate(names(data_in2)),SurveyDesign,na.rm=TRUE)

有什么建议吗??

【问题讨论】:

  • @Ronak Shah 知道为什么会发生这种情况吗?
  • 看起来每行都有 NA?我不使用 svymean 但它只考虑完整的案例吗?
  • @Dason 我认为 na.rm 应该删除应该解决这个问题......此外,即使有很多 NA,svymean 也适用于 Q62_11。
  • 我想你误解了我的意思。每一行都有 NA。因此,如果它只查看完整的行,您将没有任何数据。就像我说的那样,我不使用该软件包,这与我的预期背道而驰,但对您的数据有意义。
  • 另外,除非您调用加载您正在使用的包,否则您的示例也无法重现

标签: r dplyr survey


【解决方案1】:

你遇到this issue了吗?

library(survey)
data(api)
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)
vector_of_variables <- c( 'api00' , 'api99' )
result <- 
    lapply( 
        vector_of_variables , 
        function( w ) svymean( as.formula( paste( "~" , w ) ) , dclus1 , na.rm = TRUE ) 
    )

result <- lapply( result , function( v ) data.frame( variable = names( v ) , mean = coef( v ) , se = as.numeric( SE( v ) ) ) )

do.call( rbind , result )

【讨论】:

  • 感谢这工作!我没有得到非零的意思……但我的 SE 仍然是 0……知道为什么会这样吗?
  • 是否可以在您的调用代码中指定四舍五入,这样如果是 0.001,它会显示为不四舍五入?
【解决方案2】:

当您使用svymean 计算一组均值时,仅使用包含所有这些变量的观测值。那是因为svymean 估计了均值的协方差矩阵,所以它不能使用部分缺失的数据。在您的示例中,没有观察到所有变量的值。

你可以做这样的事情来一次循环一个变量

lapply(names(data_in)[1:8], 
   function(v) eval(bquote(svymean(~.(as.name(v)),SurveyDesign,na.rm=TRUE)))
)

并得到类似的答案

> lapply(names(data_in)[1:8], 
+    function(v) eval(bquote(svymean(~.(as.name(v)),SurveyDesign,na.rm=TRUE)))
+ )
[[1]]
         mean     SE
Q62_1 0.38902 0.0399

[[2]]
         mean    SE
Q62_2 0.29171 0.057

[[3]]
          mean     SE
Q62_3 0.042812 0.0337

[[4]]
         mean     SE
Q62_4 0.49944 0.0345

[[5]]
         mean     SE
Q62_5 0.33809 0.0554

[[6]]
          mean     SE
Q62_6 0.033547 0.0337

[[7]]
         mean     SE
Q62_8 0.73399 0.0465

[[8]]
         mean     SE
Q62_9 0.62947 0.0471

【讨论】:

  • 我不明白,除非你指的是Q62_11,它实际上是零:唯一观察到的值是1
  • 你是对的,对不起,它确实适用于我的示例数据,而不是我的真实数据。我确实在我的完整数据集中用 1 替换了我的所有 NA,只是为了检查它是否会返回非零 SE ......但它仍然存在。这可能是什么其他原因造成的? :(
猜你喜欢
  • 2022-10-05
  • 2020-08-15
  • 1970-01-01
  • 2022-12-15
  • 2021-06-08
  • 2016-02-20
  • 2017-08-10
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多