如何处理 R 中 lm(x~y) 函数中的负值?
How to treat negative values in lm(x~y) function in R?
当我的脚本 运行 时,我收到以下错误消息:Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 0 (non-NA) cases
我猜这是因为一些负值?
该脚本通过 csv 文件列表循环,对于其中的一小部分,代码正在运行。但是对于所有这些,我都收到了错误消息。我检查了数据,发现有一些(约占全部数据的 2%)NDVI 负值始终为 -99999。我有一些土壤水分值为 0。
我发现这个解决方案 na.action=na.exclude
添加到 lm 函数中:
model <- lm(NDVI ~ T + Prec + soilM, data = BeforeConf)
model <- lm(NDVI ~ T + Prec + soilM, data = BeforeConf, na.action=na.exclude)
但是还是出现同样的错误。除了从数据中删除负值之外,您还有其他解决方案吗?最好是忽略整个而不排除线性回归 (lm) 中的这些值或忽略整个 csv 文件。如果里面有负值。
R 中的缺失值应编码为 NA
。你可以使用 replace
,
replace(dat, dat == -99999, NA)
# X1 X2 X3
# 1 1.37 1.30 -0.31
# 2 NA 2.29 -1.78
# 3 0.36 -1.39 -0.17
# 4 0.63 -0.28 1.21
# 5 0.40 NA 1.90
# 6 -0.11 0.64 -0.43
# 7 1.51 -0.28 -0.26
# 8 -0.09 -2.66 -1.76
# 9 2.02 -2.44 NA
# 10 -0.06 1.32 -0.64
在不更改数据的情况下直接在公式中实际起作用的内容。
lm(X1 ~ X2 + X3, replace(dat, dat == -99999, NA))$coefficients
# (Intercept) X2 X3
# 0.61499466 0.06062925 0.25979370
如果漏码不止一个,你可以这样做:
replace(dat, array(unlist(dat) %in% c(-99999, -88888), dim(dat)), NA)
数据:
set.seed(42)
dat <- data.frame(matrix(round(rnorm(30), 2), 10, 3))
dat[2, 1] <- -99999
dat[5, 2] <- -99999
dat[9, 3] <- -99999
当我的脚本 运行 时,我收到以下错误消息:Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 0 (non-NA) cases
我猜这是因为一些负值?
该脚本通过 csv 文件列表循环,对于其中的一小部分,代码正在运行。但是对于所有这些,我都收到了错误消息。我检查了数据,发现有一些(约占全部数据的 2%)NDVI 负值始终为 -99999。我有一些土壤水分值为 0。
我发现这个解决方案 na.action=na.exclude
添加到 lm 函数中:
model <- lm(NDVI ~ T + Prec + soilM, data = BeforeConf)
model <- lm(NDVI ~ T + Prec + soilM, data = BeforeConf, na.action=na.exclude)
但是还是出现同样的错误。除了从数据中删除负值之外,您还有其他解决方案吗?最好是忽略整个而不排除线性回归 (lm) 中的这些值或忽略整个 csv 文件。如果里面有负值。
R 中的缺失值应编码为 NA
。你可以使用 replace
,
replace(dat, dat == -99999, NA)
# X1 X2 X3
# 1 1.37 1.30 -0.31
# 2 NA 2.29 -1.78
# 3 0.36 -1.39 -0.17
# 4 0.63 -0.28 1.21
# 5 0.40 NA 1.90
# 6 -0.11 0.64 -0.43
# 7 1.51 -0.28 -0.26
# 8 -0.09 -2.66 -1.76
# 9 2.02 -2.44 NA
# 10 -0.06 1.32 -0.64
在不更改数据的情况下直接在公式中实际起作用的内容。
lm(X1 ~ X2 + X3, replace(dat, dat == -99999, NA))$coefficients
# (Intercept) X2 X3
# 0.61499466 0.06062925 0.25979370
如果漏码不止一个,你可以这样做:
replace(dat, array(unlist(dat) %in% c(-99999, -88888), dim(dat)), NA)
数据:
set.seed(42)
dat <- data.frame(matrix(round(rnorm(30), 2), 10, 3))
dat[2, 1] <- -99999
dat[5, 2] <- -99999
dat[9, 3] <- -99999