R语言合并svrepstat与矩阵对象丢失SE列问题求助
合并svrepstat对象与置信区间矩阵时丢失SE列的问题解决
在R中使用svytotal()生成的svrepstat类对象wf1(包含total和SE列),与confint()生成的矩阵CI1(包含2.5 %和97.5 %列)行名完全一致,但调用cbind()合并时,wf1的SE列丢失,仅保留total值且列名为对象名,无法得到包含total、SE、2.5 %、97.5 %的完整结果。
代码示例
wf1<-svytotal(~factor(var1)+Total, mydesign) wf1 total SE factor(var1)0 62469 7620.4 factor(var1)1 151486 9421.3 Total 213955 13418.5 CI1<-confint(wf1) CI1 2.5 % 97.5 % factor(var1)0 47532.84 77404.17 factor(var1)1 133020.75 169951.38 Total 187654.80 240254.33 cbind(wf1, CI1) wf1 2.5 % 97.5 % factor(var1)0 62468.5 47532.84 77404.17 factor(var1)1 151486.1 133020.75 169951.38 Total 213954.6 187654.80 240254.33
期望结果
total SE 2.5 % 97.5 % factor(var1)0 62469 7620.4 47532.84 77404.17 factor(var1)1 151486 9421.3 133020.75 169951.38 Total 213955 13418.5 187654.80 240254.33
对象dput输出
wf1 <- structure(c(`factor(Dummy1)0` = 62468.5031180821, `factor(Dummy1)1` = 151486.062913796, Total = 213954.566031878), var = structure(c(58070142.8887675, 16612955.6715334, 74683098.560301, 16612955.6715334, 88759974.1026789, 105372929.774212, 74683098.560301, 105372929.774212, 180056028.334513 ), .Dim = c(3L, 3L), means = c(62468.5031180821, 151486.062913796, 213954.566031878)), statistic = "total", class = "svrepstat") CI1 <- structure(c(47532.8390009755, 133020.749879858, 187654.797624822, 77404.1672351886, 169951.375947734, 240254.334438934), .Dim = 3:2, .Dimnames = list( c("factor(Dummy1)0", "factor(Dummy1)1", "Total"), c("2.5 %", "97.5 %")))
问题原因
svrepstat是survey包中的特殊类对象,其total值存储在主向量中,而SE对应的方差数据存储在对象的var属性(方差矩阵)里。直接使用cbind()时,R只会提取该对象的主向量(即total值),不会自动解析并带出SE列,导致合并结果丢失SE数据。
解决方法
方法1:将svrepstat对象转换为数据框后合并
svrepstat对象支持as.data.frame()方法,转换后会自动生成包含total和SE列的数据框,再与CI1合并即可:
# 转换为数据框 wf1_df <- as.data.frame(wf1) # 合并CI1 result <- cbind(wf1_df, CI1)
方法2:手动提取SE列后合并
从wf1的var属性提取对角线元素(每个行对应的方差),开平方得到SE,再构造数据框与CI1合并:
# 提取total值 total_vals <- as.vector(wf1) # 计算SE:方差矩阵对角线元素开平方 se_vals <- sqrt(diag(wf1$var)) # 构造包含total和SE的数据框 wf1_se_df <- data.frame( total = total_vals, SE = se_vals, row.names = names(wf1) ) # 合并CI1 result <- cbind(wf1_se_df, CI1)
验证结果
执行上述任一方法后,result将包含期望的所有列:
total SE 2.5 % 97.5 % factor(Dummy1)0 62468.50 7620.400 47532.84 77404.17 factor(Dummy1)1 151486.06 9421.300 133020.75 169951.38 Total 213954.57 13418.50 187654.80 240254.33
内容的提问来源于stack exchange,提问作者datadigger
相关产品推荐
相关产品推荐

