Random Effect Estimation Error

I am using 'plm' packages to estimate panel data with random effect estimation. But, I got an error:
randomroe <- plm(roe ~ x + factor(year), data = pdata, model = "random")
Error in solve.default(crossprod(ZBeta)) :
Lapack routine dgesv: system is exactly singular: U[9,9] = 0

Anyone know how to solve it?

There's not better answer than the one I found posted by amit

The "singularity" error you are getting occurs when your covariates
are confounded with batch (or with each other). In the example you are
trying is there a batch that contains only one covariate level and is
that covariate level exclusive to the batch? If this does not make
sense, post your 'pheno' variable in a reply and I will be happy to
help you figure out the problem.

Got FAQ: What's a reproducible example (`reprex`) and how do I do one?

library("plm")
pdata <- pdata.frame(data_CG1, index = c("id", "year"))
roe <- cbind(pdata$roe)
roa <- cbind(pdata$roa)
x <- cbind(pdata$cg, pdata$leverage, pdata$firmsize, pdata$capex/assets, pdata$firmage)
randomroe <- plm(roe ~ x + factor(year), data = pdata, model = "random")
Error in solve.default(crossprod(ZBeta)) :
Lapack routine dgesv: system is exactly singular: U[9,9] = 0
randomroa <- plm(roa ~ x + factor(year), data = pdata, model = "random")
Error in solve.default(crossprod(ZBeta)) :
Lapack routine dgesv: system is exactly singular: U[8,8] = 0

1 Like

@technocrat do you mean this?

1 Like

Thanks, close. But some representative data is needed. If there’s a package dataset that produces the same results, that’s fine. If your data is not confidential, you can either post a link, such as a github gist with a csv, or use

dput(your_data)

and cut and paste into the reprex.

If your data is large and a small subset reproduces the problem, that’s fine, too.

I paste the data into reprex, but I got this error:

#> Error in eval(expr, envir, enclos): object 'dataCG1' not found

reprex runs your code on a clean R session with an empty environment, so nothing exists there, you have to define dataCG1 inside the code you are passing to the reprex() function. Please read this guide to learn how to make a proper reprex.

This is how you'd bring data into your reprex before the code that depends on it

dataCG1 <- dput(mtcars)
#> structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 
#> 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4, 
#> 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4, 15.8, 
#> 19.7, 15, 21.4), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 
#> 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4), 
#>     disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 
#>     167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7, 75.7, 
#>     71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 
#>     301, 121), hp = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 
#>     123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 
#>     150, 245, 175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9, 
#>     3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 
#>     3.07, 3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 
#>     3.15, 3.73, 3.08, 4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11
#>     ), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 
#>     3.15, 3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 
#>     1.615, 1.835, 2.465, 3.52, 3.435, 3.84, 3.845, 1.935, 2.14, 
#>     1.513, 3.17, 2.77, 3.57, 2.78), qsec = c(16.46, 17.02, 18.61, 
#>     19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3, 18.9, 17.4, 17.6, 
#>     18, 17.98, 17.82, 17.42, 19.47, 18.52, 19.9, 20.01, 16.87, 
#>     17.3, 15.41, 17.05, 18.9, 16.7, 16.9, 14.5, 15.5, 14.6, 18.6
#>     ), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
#>     0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1), am = c(1, 
#>     1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 
#>     0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4, 4, 3, 
#>     3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 
#>     3, 3, 4, 5, 5, 5, 5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 
#>     2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 
#>     2, 2, 4, 6, 8, 2)), row.names = c("Mazda RX4", "Mazda RX4 Wag", 
#> "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant", 
#> "Duster 360", "Merc 240D", "Merc 230", "Merc 280", "Merc 280C", 
#> "Merc 450SE", "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood", 
#> "Lincoln Continental", "Chrysler Imperial", "Fiat 128", "Honda Civic", 
#> "Toyota Corolla", "Toyota Corona", "Dodge Challenger", "AMC Javelin", 
#> "Camaro Z28", "Pontiac Firebird", "Fiat X1-9", "Porsche 914-2", 
#> "Lotus Europa", "Ford Pantera L", "Ferrari Dino", "Maserati Bora", 
#> "Volvo 142E"), class = "data.frame")

Created on 2020-02-01 by the reprex package (v0.3.0)

I did it, but I got this error message:

is limited to 32000 characters; you entered 98785.

Can you reproduce the error with a smaller subset or sample of your data?

How If I send it to you through email?

What are the variable names for

2010,1,ADHI IJ Equity,1,17.11%,6.50,33.20,15.41,50,-0.13%,10.00%

I can guess year and id, but not sure on the others

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.