微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R移动平均

如何解决R移动平均

作为示例,我将Boston数据与3列(id(添加),medv,lstat)和506个观测值一起使用。

我想为变量medv计算k-1个观测值的移动平均值。这意味着应该对除某一行以外的所有观测值计算平均值。对于id 1,从2-506行计算出平均值。对于id 2,在第1行+ 3-506上计算平均值。对于id 3,通过1-2 + 4-506行计算平均值,依此类推。

第二步中,平均值的计算应是有条件的,例如在两个不同的列中位于中位数上方和下方。这意味着我们首先检查每列(medv和lstat)中的值是高于还是低于中位数。如果medv中的值高于中位数,我们将从高于lstat中位数的值中计算出lstat的平均值。如果medv中的值低于中位数,我们将根据中位数以下的值计算lstat的平均值。前10行请参见下面的示例表。 medv的前10行中位数为25.55,lstat的中位数为7.24。

以下是数据:

library(mlbench)
data(BostonHousing)
df <- BostonHousing
df$id <- seq.int(nrow(df))
df <- subset(df,select = c(id,medv,lstat))
id medv lstat mean1out meancond
 1 24.0  4.98 26.66667     4.50
 2 21.6  9.14 26.93333     4.50
 3 34.7  4.03 25.47778    17.55
 4 33.4  2.94 25.62222    17.55
 5 36.2  5.33 25.31111    17.55
 6 28.7  5.21 26.14444    17.55
 7 22.9 12.43 26.78889     4.50
 8 27.1 19.15 26.32222    17.55
 9 16.5 29.93 27.50000     4.50
10 18.9 17.10 27.23333     4.50

解决方法

export interface LayerManager {
    forCms: Function;
    forProduct: Function;
}

export class LayerManager {
    firstName: string = '';
    constructor(name: string) {}
}

// @ts-ignore
if (process.env.NODE_ENV === "cms") {
    LayerManager.prototype.forCms = function() {}
} else {
    LayerManager.prototype.forProduct = function() {}
}

或者,在数学上,如果没有mean(dat$medv[-3]) # [1] 25.47778 sapply(seq_len(nrow(dat)),function(i) mean(dat$medv[-i])) # [1] 26.66667 26.93333 25.47778 25.62222 25.31111 26.14444 26.78889 26.32222 27.50000 27.23333 ,您可以通过以下方式获得相同的数字:

sapply

对于您的条件均值,简单的n <- nrow(dat) (mean(dat$medv)*n - dat$medv)/(n-1) # [1] 26.66667 26.93333 25.47778 25.62222 25.31111 26.14444 26.78889 26.32222 27.50000 27.23333 可以起作用:

ifelse

(我推断这些差异是数据输入中的舍入错误。)

,

问题的第一部分已经由@ r2evans解决。

对于第二部分,我们可以计算medianlstat中的medv,比较并分配值。

#First part from @r2evans answer. 
n <- nrow(df)
df$mean1out <- (mean(df$medv)*n - df$medv)/(n-1)


#Second part
med_lsat <- median(df$lstat)
med_medv <- median(df$medv)
higher_lsat <- mean(df$lstat[df$lstat > med_lsat])
lower_lsat <- mean(df$lstat[df$lstat < med_lsat])
df$meancond <- ifelse(df$medv > med_medv,higher_lsat,lower_lsat)
df

#   id medv lstat mean1out meancond
#1   1 24.0  4.98 26.66667    4.498
#2   2 21.6  9.14 26.93333    4.498
#3   3 34.7  4.03 25.47778   17.550
#4   4 33.4  2.94 25.62222   17.550
#5   5 36.2  5.33 25.31111   17.550
#6   6 28.7  5.21 26.14444   17.550
#7   7 22.9 12.43 26.78889    4.498
#8   8 27.1 19.15 26.32222   17.550
#9   9 16.5 29.93 27.50000    4.498
#10 10 18.9 17.10 27.23333    4.498

数据

df <- BostonHousing
df$id <- seq.int(nrow(df))
df <- subset(df,select = c(id,medv,lstat))
df <- head(df,10)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。