我想在R中运行分区回归,我需要为其指定一个因子来指示此数据属于哪个分区.例如,当它大于平均值±2标准偏差时,我指定指示符2,并在平均值+ 1sd和平均值+ 2sd之间,依此类推,依此类推.我知道可以用if和else来完成.但是当分区太多时,代码似乎太长了.有没有简单而简洁的方法来实现它?
mean=mean(x)
sd=sd(x)
if((x[i]-mean)/sd< -3) signal[i]=-3
if((x[i]-mean)/sd> -3) signal[i]=-2
if((x[i]-mean)/sd> -2) signal[i]=-1
if((x[i]-mean)/sd> -1) signal[i]=0
if((x[i]-mean)/sd>1) signal[i]=1
if((x[i]-mean)/sd>2) signal[i]=2
if((x[i]-mean)/sd>3) signal[i]=3
}
Run Code Online (Sandbox Code Playgroud)
感谢@jogo和@ r.user.05apr.现在我的问题略有不同.我想基于滚动窗口计算分区,例如20天,这意味着我需要根据过去20天(第t-20天到第t-1天)来缩放第t天的数据并分配相同的值以上根据其z分数.在这种情况下,还可以使用切割功能吗?我编写了一个带循环和句子的代码
signal <- vector()
n=20 #window
for(i in (n+1):length(x)){
mean=mean(x[(n-20):(n-1)])
sd=sd(x[(i-20):(i-1)])
if((x[i]-mean)/sd< -3) signal[i]=-3
if((x[i]-mean)/sd> -3) signal[i]=-2
if((x[i]-mean)/sd> -2) signal[i]=-1
if((x[i]-mean)/sd> -1) signal[i]=0
if((x[i]-mean)/sd>1) signal[i]=1
if((x[i]-mean)/sd>2) signal[i]=2
if((x[i]-mean)/sd>3) signal[i]=3
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 cut()
x <- iris$Petal.Length
m <- mean(x)
s <- sd(x)
cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))
Run Code Online (Sandbox Code Playgroud)
强迫数字:
as.numeric(as.character(cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))))
Run Code Online (Sandbox Code Playgroud)
你可以缩短(x - m)/s到scale(x)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |