[R] density with weights missing values

Göran Broström gor@n@bro@trom @end|ng |rom umu@@e
Tue Jul 13 13:34:55 CEST 2021



Den 2021-07-12 kl. 15:09, skrev Matthias Gondan:
> Weighted mean behaves differently:

One difference is that density has a named argument 'weights' not 
present in weighted.mean, which instead has 'w' for weights.
Annoying.

So, in your examples, the argument 'weights = ' is always ignored, at 
least for weighted.mean.default:

 > stats:::weighted.mean.default
function (x, w, ..., na.rm = FALSE)
{
     if (missing(w)) {
         if (na.rm)
             x <- x[!is.na(x)]
         return(sum(x)/length(x))
     }
     if (length(w) != length(x))
         stop("'x' and 'w' must have the same length")
     if (na.rm) {
         i <- !is.na(x)
         w <- w[i]
         x <- x[i]
     }
     sum((x * w)[w != 0])/sum(w)
}

But, using 'w' for weights, missing values in weights will work only if 
na.rm = TRUE and they match missing values in x. As documented.

[...]
> • no warning for sum(weights) != 1

and no warning for sum(w) != 1

That's because the weights w are normalized (after removing weights 
corresponding to missing values in x).

G,
> 
>> weighted.mean(c(1, 2, 3, 4), weights=c(1, 1, 1, 1))
> [1] 2.5
>> weighted.mean(c(1, 2, 3, NA), weights=c(1, 1, 1, 1))
> [1] NA
>> weighted.mean(c(1, 2, 3, NA), weights=c(1, 1, 1, 1), na.rm=TRUE)
> [1] 2
> 
> 
> 
> 
> Von: Richard O'Keefe
> Gesendet: Montag, 12. Juli 2021 13:18
> An: Matthias Gondan
> Betreff: Re: [R] density with weights missing values
> 
> Does your copy of R say that the weights must add up to 1?
> ?density doesn't say that in mine.   But it does check.
> 
> On Mon, 12 Jul 2021 at 22:42, Matthias Gondan <matthias-gondan using gmx.de> wrote:
>>
>> Dear R users,
>>
>> This works as expected:
>>
>> • plot(density(c(1,2, 3, 4, 5, NA), na.rm=TRUE))
>>
>> This raises an error
>>
>> • plot(density(c(1,2, 3, 4, 5, NA), na.rm=TRUE, weights=c(1, 1, 1, 1, 1, 1)))
>> • plot(density(c(1,2, 3, 4, 5, NA), na.rm=TRUE, weights=c(1, 1, 1, 1, 1, NA)))
>>
>> This seems to work (it triggers a warning that the weights don’t add up to 1, which makes sense*):
>>
>> • plot(density(c(1,2, 3, 4, 5, NA), na.rm=TRUE, weights=c(1, 1, 1, 1, 1)))
>>
>> Questions
>>
>> • But shouldn’t the na.rm filter also filter the corresponding weights?
>> • Extra question: In case the na.rm filter is changed to filter the weights, the check for sum(weights) == 1 might trigger false positive warnings since the weights might not add up to 1 anymore
>>
>> Best wishes,
>>
>> Matthias
>>
>>
>>          [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list