【问题标题】:R - Differences using sum with each variable separately or sum with all variables togetherR - 分别对每个变量使用求和或对所有变量求和的差异
【发布时间】:2020-02-25 08:41:29
【问题描述】:

我很生气,因为我正在使用 sum() 函数,它毫无意义地显示了不同的结果。 我有 4 个数值变量:A、B、M、N。 我还有一个权重变量:W。

如果我做加权和:

sum(df$W * (df$A), na.rm = T) = AR
sum(df$W * df$A, na.rm = T) = AR

结果是一样的。

如果我添加 B:

sum(df$W * (df$A + df$B), na.rm = T) = ABR
sum(df$W * df$A, df$W * df$B, na.rm = T) = ABR

结果是一样的。

如果我添加 M:

sum(df$W * (df$A + df$B + df$M), na.rm = T) = ABMR1
sum(df$W * df$A, df$W * df$B, df$W * df$M, na.rm = T) = ABMR2

结果变得不同。

如果我加 N:

sum(df$W * (df$A + df$B + df$M + df$N), na.rm = T) = ABMNR1
sum(df$W * df$A, df$W * df$B, df$W * df$M, df$W * df$N, na.rm = T) = ABMNR2

结果不一样。

所以看起来 M 和/或 N 变量有一些问题。但是,如果我开始添加 M 和 N 变量...:

sum(df$W * (df$M), na.rm = T) = MR
sum(df$W * df$M, na.rm = T) = MR

结果是一样的。

如果我加 N:

sum(df$W * (df$M + df$N), na.rm = T) = MNR
sum(df$W * df$M, df$W * df$N, na.rm = T) = MNR

结果是一样的。

现在,如果我添加 A:

sum(df$W * (df$M + df$N + df$A), na.rm = T) = MNA1
sum(df$W * df$M, df$W * df$N, df$W * df$A, na.rm = T) = MNA2

结果变得不同。

如果我添加 B:

sum(df$W * (df$M + df$N + df$A + df$B), na.rm = T) = MNAB1
sum(df$W * df$M, df$W * df$N, df$W * df$A, df$W * df$B, na.rm = T) = MNAB2

结果不一样。

现在看来问题来自 A 或 B 变量。 这怎么可能?如果我将 W 变量与变量的总和相乘(第一种方式),或者我添加不同的变量(第二种方式),有什么区别吗?

非常感谢您提供的任何帮助!

【问题讨论】:

  • 我怀疑这是由于NA 中的df$A 和/或df$Bna.rm=TRUE 结合造成的。
  • 嗨 H.Castells。欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供minimale reproducible example。这样你就可以帮助别人帮助你!
  • 如果您提供您使用的数据,那就太好了,以便其他用户可以重现该问题。为此使用dput(data) 函数并将其包含在您的帖子中。
  • 结果有多少“不同”?请提供一个可重现的示例。

标签: r sum weighted


【解决方案1】:

这是由于北美。以下是说明情况的示例:

x <- c(1,2,NA)
y <- c(1,NA,3)
z <- c(2,3,4)
s1 <- sum(x*(y+z), na.rm = T)
s2 <- sum(x*y,x*z, na.rm = T)

得出 s1 = 3 和 s2 = 9。但是,如果没有 NA,总和是相同的。让我们看看会发生什么:

  1. 对于s1,和(y+z) 产生一个向量3 NA 7。乘以向量 x,得到向量3 NA NA。不包括 NA,总和为 3。
  2. 对于s2,乘积x * y 得到1 NA NA,乘积x*z 得到2 6 NA。排除NAs,这些向量的和是9。

简而言之,如果NAs 存在,则通常代数中已知的分配性质不成立。

【讨论】:

  • 是的,就是这样。我将 NA 转换为 0,现在所有的总和都给出了相同的结果。非常感谢!
【解决方案2】:

考虑这个最小的例子:

df<-data.frame(W=c(1,2),A=c(NA,3),B=c(4,NA))

让我们检查一下:

sum(df$W*df$A,na.rm=TRUE)
#[1] 6
sum(df$W*df$B,na.rm=TRUE)
#[1] 4
sum(df$W*df$B,df$W*df$A,na.rm=TRUE)
#[1] 10
sum(df$W*(df$B+df$A),na.rm=TRUE)
#[1] 0

你应该弄清楚发生了什么。提示:

df$W*(df$B+df$A)
#[1] NA NA

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2017-01-18
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多