我有一个流量数据矢量(29个数据)和一个3D矩阵数据(360 * 180 * 29)
我想找到单个矢量和3D矢量之间的相关性。相关矩阵的大小为360 * 180。
> str(ScottsCk_flow_1981_2010_JJA)
num [1:29] 0.151 0.644 0.996 0.658 1.702 ...
> str(ssta_winter)
num [1:360, 1:180, 1:29] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
> summary(ssta_winter)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-2.8 -0.2 0.1 0.2 0.6 6.0 596849.0
以上是矢量和3D矩阵的结构。 3D矩阵有许多值为Null。
> for (i in 1:360) {
+ for(j in 1:180){
+ cor_ScottsCk_SF_SST_JJA[i,j] = cor(ScottsCk_flow_1981_2010_JJA,ssta_winter[i,j,])
+ }
+ }
There were 50 or more warnings (use warnings() to see the first 50)
上面这段代码是找到相关性的代码。但它提供了警告
> warnings()
Warning messages:
1: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
2: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
3: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
4: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
5: In cor(ScottsCk_flow_1981_2010_JJA, ssta_winter[i, j, ... :
the standard deviation is zero
同样,相关矩阵的结果全为NULL。这是怎么发生的?
> str(cor_ScottsCk_SF_SST_JJA)
num [1:360, 1:180] NA NA NA NA NA NA NA NA NA NA ...
我使用完全相同的代码bfr与350流向量和360 * 180 * 350矩阵。 这段代码完美无缺。
答案 0 :(得分:17)
一些想法。
首先,通过使用apply()
,您可以用以下内容替换该嵌套循环:
cor_ScottsCk_SF_SST_JJA <-
apply(ssta_winter, MARGIN = 1:2, FUN = cor, ScottsCk_flow_1981_2010_JJA)
其次,596849/(360*180*29)
中的点数> 31%(ssta_winter
)似乎是NaN
或(可能)NA_real_
。给定在包含甚至单个NaN
的矢量计算的相关性的返回值,
cor(c(1:3, NaN), c(1:4))
# [1] NA
所有这些NaN
是否可能导致cor_ScottsCk_SF_SST_JJA
被NA
填充?
第三,正如警告信息明确告诉你的那样,你传递给cor()
的一些向量的方差为零。它们与NaN
s无关:如下所示,当涉及NaN
时,R不会抱怨0的标准偏差。 (非常合理,因为您无法计算未定义数字的标准偏差):
cor(c(NaN, NaN, NaN, NaN), c(1,1,1,1))
# [1] NA
cor(c(1,1,1,1), c(1,2,3,4))
# [1] NA
# Warning message:
# In cor(c(1, 1, 1, 1), c(1, 2, 3, 4)) : the standard deviation is zero
答案 1 :(得分:1)
以下使用def error_handler(error):
out = {"message": error.body}
if 400 <= error.status_code < 500:
out["code"] = "input_error"
elif error.status_code >= 500:
out["code"] = "server_error"
else:
out["code"] = "???"
return json.dumps(out)
for code in [int(x) for x in bottle.HTTP_CODES.keys() if x >= 400]:
bottle.error(code)(error_handler)
library("psych")
sd包含SAT的NA。
partial.r(sd,c("GPA","SAT"),"GRADE1",use = "complete.obs")
Warning Message:
In cor(data, use = use, method = method) : the standard deviation is zero
子集已删除不适用
答案 2 :(得分:0)
如果一列对于所有观测值都具有相同的值,也可能会显示此错误。因此,您可能要删除这些行。