我对R-Cran很新。我想用约束求解线性逆模型。我在limSolve包中使用ldei-function。 这是我的线性系统和约束:
A x X = C
G x X> = H,G = 1且H = 0。 (基本上:X> = 0)
其中:
A在2x2矩阵中;
X(nrow = 2,ncol = n)是未知矢量 - (矩阵);
C(nrow = 2,ncol = n)是常数已知的向量 - (矩阵)。
矩阵G是单位矩阵,H是具有零值的向量 - (矩阵)。
约束X> = 0需要满足,因为X代表室外空气中二氧化氮和臭氧的浓度,它们不能是负的。
这是我的r代码,我假设n = 10:
library(limSolve)
A <- matrix(data = NA, nrow=2,ncol=2)
A[1,c(1:2)] <- c(-3.956946e-05,-1.558643e-05)
A[2,c(1:2)] <- c(-8.785099e-05, 1.540414e-04)
ctmp1 <- c(-3.000286e-04,-0.0003545647,-0.0002958569,-0.000356863,-0.0003602479,-0.0004177914,-0.0004280350,-0.0003890670,-0.0004984785,-0.0005695379)
ctmp2 <- c(-6.462205e-05,-0.0007740174,-0.0006427914,-0.001056369,-0.0009569179,-0.0008562010,-0.0005402486,-0.0005043381,-0.0006366220,-0.0009332219)
inC <- rbind(ctmp1,ctmp2)
C <- matrix(data=inC, nrow=2, ncol=10)
G <- matrix(ncol=2,nrow=2,data= c(1,0,0,1))
inH <- rbind(rep(0., length.out=10),rep(0., length.out=10))
H <- matrix(data=inH, nrow=2, ncol=10)
# I am aware I need to use the apply-family instead of do loops-- this is my work in progress--..
for (i in 1:10){
print(i)
E <- A
FF <- c(C[1,i],C[2,i])
GG <- G
HH <- H[,i]
res <-ldei(E,FF,GG,HH)
print(res$X)
}
### Here the output:
[1] 1
[1] 6.326385 3.188475
[1] 2
[1] 8.93305028 0.06985077
[1] 3
[1] 7.44753875 0.07454004
[1] 4
Error in svd(V2, nu = 0, nv = unsolvable) : a dimension is zero
我非常感谢能解决这个问题的任何提示:
&#34; svd中的错误(V2,nu = 0,nv =无法解析):维度为零 &#34;
非常感谢你的帮助!
答案 0 :(得分:1)
首先,欢迎来到R!
如果要查看函数的代码,只需键入函数的名称而不用paretheses,R显示代码。因此,对于svd,我们可以看到它给出了在没有足够尺寸时看到的错误...这意味着as.matrix(x)没有给出具有尺寸的对象,这意味着它输入x必须与预期不符。
您也可以编辑这些功能......以进行调试。我通常只是粘贴到文本编辑器中,编辑并粘贴回R。
svd = function (x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE)
{
x <- as.matrix(x)
if (any(!is.finite(x)))
stop("infinite or missing values in 'x'")
dx <- dim(x)
n <- dx[1L]
p <- dx[2L]
if (!n || !p) {
print("x")
print(x)
print("dx")
print(dx)
print("dx1L")
print (dx[1L])
print("dx2L")
print(dx[2L])
stop("a dimension is zero");}
La.res <- La.svd(x, nu, nv)
res <- list(d = La.res$d)
if (nu)
res$u <- La.res$u
if (nv) {
if (is.complex(x))
res$v <- Conj(t(La.res$vt))
else res$v <- t(La.res$vt)
}
res
}
我已经打印出了感兴趣的价值......
[1] "x"
[1,]
[2,]
[1] "dx"
[1] 2 0
[1] "dx1L"
[1] 2
[1] "dx2L"
[1] 0
如怀疑的那样,输入没有数据......
我在ldei中使用相同的技巧来获取E和V2的值(这是给予svd的x)我不会把这些代码放在这里,因为它很大。
它的结果是<{p>}中的rnd
V2 <- V2 %*% rnd
是宽度0,因为
unsolvable <- Nx - solvable
...
rnd <- matrix(data = runif(Nx * unsolvable), nrow = Nx,
ncol = unsolvable)
并且Nx和solvable都等于2!
它甚至到达代码部分的原因是,在这种情况下,并非所有CC都大于-tol ......
[1] "CC"
[,1]
[1,] 9.570040
[2,] -1.399828
[1] "-tol"
[1] -1.490116e-08
最终,CC的差异是因为F的值。
所以我的猜测是FF = c(C [1,4],C [2,4])的情况会产生一个错误,该错误不是由函数处理的。
抱歉,我做得不好!
答案 1 :(得分:0)
根据Jimi提供的提示,我非常感激,我直接联系了维护者。以下是她对&#34;跳过&#34;的建议。错误。他们为我的案子工作。
&#34;错误意味着系统无法使用ldei解决,并且该功能无法捕获错误。你能做的是:
for (i in 1:10){
print(i)
E <- A
FF <- c(C[1,i],C[2,i])
GG <- G
HH <- H[,i]
res <-try(ldei(E,FF,GG,HH))
if (! class(res)%in% "try-error")
print(res$X)
}
因此,当class(res)%in%&#34; try-error&#34;时,它不可解决(可能是在请求的精度下)&#34;